Как я могу воспроизводить сжатые звуковые файлы на С# портативным способом?
Есть ли переносимый, а не ограниченный патентами способ воспроизведения сжатых звуковых файлов в С#/.Net? Я хочу играть короткие звуки "звон" в различных событиях, происходящих в программе.
System.Media.SoundPlayer может обрабатывать только WAV, но, как правило, они являются большими для встраивания в загружаемое приложение. MP3 защищен патентами, поэтому даже если бы был полностью управляемый декодер/плеер, он не был бы свободно перераспределять. Лучшим доступным форматом, казалось бы, был OGG Vorbis, но мне не повезло работать с библиотеками С# Vorbis (мне удалось извлечь исходный PCM с csvorbis, но я не знаю, как играть в нее потом).
Я не хочу распространять никакие двоичные файлы с моим приложением и не зависеть от P/Invoke, так как проект должен работать как минимум в Windows и Linux. Я в порядке с набором .Net-сборок, если они совместимы с лицензиями с GPL.
[этот вопрос является продолжением обсуждения рассылки по списку рассылки mono-dev год назад]
Ответы
Ответ 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.
Ответ 4
Я думаю, вам следует взглянуть на fmod, который является матерью всех аудио api
не стесняйтесь мечтать о http://www.fmod.org/index.php/download#FMODExProgrammersAPI
Ответ 5
Нет никакого способа сделать это, не используя что-то еще для вашей игры.
Использование System.Diagnostic запустит внешнее программное обеспечение, и я сомневаюсь, что вы этого хотите, не так ли? Вы просто хотите, чтобы звуковой файл X воспроизводился в фоновом режиме, когда Y происходит в вашей программе, правильно?
Проголосовало, потому что это выглядит как интересный вопрос.: D
Ответ 6
XNA Audio API хорошо работают в приложениях .net/С# и прекрасно работают для этого приложения. Триггер, основанный на событиях, наряду с последовательным воспроизведением нескольких звуков. Именно то, что вы хотите. Ох и сжатие.
Ответ 7
Ну, это зависит от законов, связанных с патентами в данной стране, но нет никакого способа написать mp3-декодер без нарушения патентов, насколько я знаю. Я считаю, что лучшее кросс-платформенное решение с открытым исходным кодом для вашей проблемы - GStreamer. Он имеет привязки С#, которые быстро развиваются. Однако использование и создание GStreamer в Windows - непростая задача. Здесь является хорошей отправной точкой. Banshee проект использует этот подход, но он еще не используется в окнах (однако есть некоторые почти работающие ночные сборки). FMOD также является хорошей альтернативой. К сожалению, это не открытый исходный код, и я обнаружил, что его API как-то С-стиль.
Ответ 8
Доступен чистый декодер С# vorbis, который является открытым исходным кодом:
http://anonsvn.mono-project.com/viewvc/trunk/csvorbis/
Ответ 9
Не уверен, что это все еще актуально. Самое простое решение - использовать NAudio, который является управляемым API-интерфейсом с открытым исходным кодом, написанным на С#. Другое дело - использовать ffmpeg и создать процесс ffplay.exe (правильные двоичные файлы находятся в общих сборках).