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

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

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

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

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

Ответы [ 9 ]

7 голосов
/ 30 августа 2008

Я наконец-то вернулся к этой теме и, используя справку от 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 - в настоящий момент, похоже, в Mono SoundPlayer наблюдается регресс, который вызывает искажения.

Устаревшие

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

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

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

2 голосов
/ 02 июня 2009

Я тоже не хочу распространять двоичные файлы с моим приложением ни зависит от 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 файлы с вашим приложением, чтобы оно работало при распространении, но это, как я объяснил ранее, неизбежно.

1 голос
/ 19 марта 2010

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

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

1 голос
/ 25 сентября 2008

Вызов чего-то, что находится в 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.
0 голосов
/ 02 августа 2011

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

0 голосов
/ 24 мая 2010

Доступен чистый декодер C # vorbis с открытым исходным кодом:

http://anonsvn.mono -project.com / ViewVC / багажник / csvorbis /

0 голосов
/ 23 мая 2010

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

0 голосов
/ 20 мая 2010

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

0 голосов
/ 19 октября 2009

Вы не можете сделать это, не используя что-то другое для обработки игры.

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

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

...