Подтвердить что ты не робот

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

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

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

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

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

4b9b3361

Ответ 1

Я, наконец, снова просмотрел эту тему и, используя справку 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");

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

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

Ответ 2

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

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

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

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

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

  • P/Вызовите OS API для воспроизведения звука.

(4.) Если вы используете только этот код в окнах, вы, вероятно, можете просто использовать 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), используя привязки С# для OpenAL на www.taoframework.com, вам, к сожалению, нужно будет скопировать несколько DLL и .so файлы с вашим приложением, чтобы он работал при распределении, но это, как я объяснил ранее, неизбежно.

Ответ 3

Вызов чего-то, что находится в "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.

Ответ 5

Нет никакого способа сделать это, не используя что-то еще для вашей игры.

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

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

Ответ 6

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

Ответ 7

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

Ответ 9

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