Как я могу воспроизводить сжатые звуковые файлы на C # портативным способом?

Есть ли портативный, не ограниченный патентом способ воспроизведения сжатых звуковых файлов в C # / .Net? Я хочу проигрывать короткие звуки «джингла» при различных событиях, происходящих в программе.

System.Media.SoundPlayer может обрабатывать только WAV, но они обычно слишком велики, чтобы встраивать их в загружаемое приложение. MP3 защищен патентами, поэтому, даже если бы существовал полностью управляемый декодер / проигрыватель, его нельзя было бы распространять бесплатно. Лучшим доступным форматом может быть OGG Vorbis, но мне не удалось заставить работать какие-либо библиотеки C # Vorbis (мне удалось извлечь необработанный PCM с помощью csvorbis, но потом я не знаю, как в него играть).

Я не хочу распространять какие-либо двоичные файлы с моим приложением и не зависеть от P / Invoke, поскольку проект должен работать как минимум в Windows и Linux. Меня устраивает объединение сборок .Net, если они совместимы с лицензией GPL.

[этот вопрос является продолжением обсуждения в списке рассылки на mono-dev список рассылки год назад]


person skolima    schedule 30.08.2008    source источник


Ответы (9)


Я наконец вернулся к этой теме и, воспользовавшись помощью BrokenGlass при написании заголовка WAVE, обновил csvorbis. Я добавил OggDecodeStream, который можно передать System.Media.SoundPlayer просто проиграть любой (совместимый) поток Ogg Vorbis. Пример использования:

using (var file = new FileStream(oggFilename, FileMode.Open, FileAccess.Read))
{
  var player = new SoundPlayer(new OggDecodeStream(file));
  player.PlaySync();
}

«Совместимость» в данном случае означает «сработало, когда я попробовал». Декодер полностью управляем, отлично работает в Microsoft .Net - на данный момент, похоже, есть регресс в SoundPlayer Mono, который вызывает искажения.

Устаревший:

System.Diagnostics.Process.Start("fullPath.mp3");

Я удивлен, но Упомянутый Диной метод действительно работает. Однако я думал о том, чтобы проигрывать короткие звуки «джингла» при различных событиях, происходящих в программе, я не хочу запускать пользовательский медиаплеер каждый раз, когда мне нужно выполнить «пинг»! звук.

Что касается ссылки на проект кода - это, к сожалению, только оболочка P / Invoke.

person skolima    schedule 30.08.2008
comment
Я предполагаю, что это будет работать только, если у пользователя установлен MP3-плеер, верно? - person Clay Nichols; 07.09.2008
comment
Это будет работать, запустив приложение по умолчанию для расширения MP3, если оно определено на компьютере. Я не знаю ответа (или я бы ответил на него), но я бы попытался найти лучший способ, особенно, если ваша цель - совместимость. - person Erik Forbes; 25.09.2008

Я не хочу распространять какие-либо двоичные файлы с моим приложением и не зависеть от P / Invoke, поскольку проект должен работать как минимум в Windows и Linux. Меня устраивает объединение сборок .Net, если они совместимы с лицензией GPL.

К сожалению, будет невозможно избежать распространения двоичных файлов или P / Invoke. В любом случае библиотеки классов .net используют P / Invoke, управляемый код должен в какой-то момент взаимодействовать с неуправляемым API операционной системы, чтобы что-то делать.

Преобразование файла OGG в PCM должно быть возможным в управляемом коде, но поскольку в .net нет встроенной поддержки звука, у вас действительно есть 3 варианта:

  1. Вызов внешней программы для воспроизведения звука (как было предложено ранее)

  2. P / Вызов модуля C для воспроизведения звука

  3. P / Вызов API ОС для воспроизведения звука.

(4.) Если вы запускаете этот код только в Windows, вы, вероятно, могли бы просто использовать DirectShow.

P / Invoke можно использовать кросс-платформенным способом http://www.mono-project.com/Interop_with_Native_Libraries#Library_Names

Если у вас есть данные PCM (с использованием OGG C Lib или управляемого кода, что-то вроде этого http://www.robburke.net/mle/mp3sharp/, конечно, есть проблемы с лицензированием MP3), вам понадобится способ воспроизвести его, к сожалению .net не дает прямой оценки вашей звуковой карте или методов воспроизведения потоковое аудио. Вы можете преобразовать файлы ogg в PCM при запуске, а затем использовать System.Media.SoundPlayer для воспроизведения сгенерированных файлов wav. Текущий метод, предлагаемый Microsoft, использует P / Invoke для доступа к API воспроизведения звука в ОС http://msdn.microsoft.com/en-us/library/ms229685.aspx

Кросс-платформенный API для воспроизведения звука PCM - это OpenAL, и вы должны иметь возможность воспроизводить звук (PCM), используя привязки C # для OpenAL на сайте www.taoframework.com, вам, к сожалению, потребуется скопировать несколько файлов DLL и .so с вашим приложение, чтобы оно работало при распространении, но это, как я объяснял ранее, неизбежно.

person K M    schedule 02.06.2009

Вызов чего-то, что находится в System.Diagnostics, для воспроизведения звука, мне кажется плохой идеей. Вот для чего предназначена эта функция:

    //
    // Summary:
    //     Starts a process resource by specifying the name of a document or application
    //     file and associates the resource with a new System.Diagnostics.Process component.
    //
    // Parameters:
    //   fileName:
    //     The name of a document or application file to run in the process.
    //
    // Returns:
    //     A new System.Diagnostics.Process component that is associated with the process
    //     resource, or null, if no process resource is started (for example, if an
    //     existing process is reused).
    //
    // Exceptions:
    //   System.ComponentModel.Win32Exception:
    //     There was an error in opening the associated file.
    //
    //   System.ObjectDisposedException:
    //     The process object has already been disposed.
    //
    //   System.IO.FileNotFoundException:
    //     The PATH environment variable has a string containing quotes.
person Trap    schedule 24.09.2008

Я думаю, вам стоит взглянуть на fmod, который является матерью всех аудио api

не стесняйтесь мечтать о http://www.fmod.org/index.php/download#FMODExProgrammersAPI

person user217299    schedule 19.03.2010

API-интерфейсы XNA Audio хорошо работают в приложениях .net / c # и прекрасно работают для этого приложения. Запуск по событию с одновременным воспроизведением нескольких звуков. Именно то, что вы хотите. Да, и компрессия тоже.

person edrowland    schedule 20.05.2010
comment
Это не переносимо, XNA не поддерживается в Mono, и порт в основном мертв: monoxna.org/node/ 4 - person skolima; 21.05.2010

Ну, это зависит от законов о патентах в данной стране, но, насколько мне известно, нет способа написать декодер mp3 без нарушения патентов. Я думаю, что лучшим кроссплатформенным решением с открытым исходным кодом для вашей проблемы является GStreamer. Он имеет привязки C #, которые быстро развиваются. Однако использование и сборка GStreamer в Windows - непростая задача. Вот хороший отправная точка. Этот подход используется в проекте Banshee, но на самом деле он пока не может использоваться в Windows (однако есть некоторые почти- рабочие ночные сборки). FMOD также является хорошей альтернативой. К сожалению, это не открытый исходный код, и я считаю, что его API так или иначе оформлен в стиле C.

person n535    schedule 23.05.2010


Не уверен, что это все еще актуально. Самым простым решением было бы использовать NAudio, который представляет собой управляемый аудио API с открытым исходным кодом, написанный на C #. Еще одна вещь, которую можно попробовать, - это использовать ffmpeg и создать процесс для ffplay.exe (правые двоичные файлы под общими сборками).

person Dmitry    schedule 02.08.2011
comment
К сожалению, NAudio работает только в Windows, и это не изменится (зависит от Windows API). Ацуши Ино опубликовал несколько примеров использования csvorbis в Silverligth в своем блоге: veritas-vos- liberabit.com/monogatari/2009/03, я попробую адаптировать это для полномасштабного фреймворка C # (поскольку API, который он использует, доступен только в Silverlight). - person skolima; 03.08.2011
comment
@skolima Использование Silverlight может быть хорошей идеей, поскольку это кроссплатформенный продукт, который может работать как приложение вне браузера в любой ОС. Я никогда не пробовал его в Linux, но он отлично работает на Mac. - person Dmitry; 04.08.2011

У вас нет возможности сделать это, не используя что-то еще для управления игрой.

Использование System.Diagnostic запускает внешнее программное обеспечение, и я сомневаюсь, что вы этого хотите, верно? Вы просто хотите, чтобы звуковой файл X воспроизводился в фоновом режиме, когда Y происходит в вашей программе, верно?

Проголосовал, потому что это интересный вопрос. : D

person Sergio Tapia    schedule 18.10.2009