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

StackOverflow https://stackoverflow.com/questions/35896

Вопрос

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

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

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

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

Это было полезно?

Решение

Наконец-то я вернулся к этой теме и, используя справку от Разбитое стекло при написании заголовка ВОЛНЫ, обновленный 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.

Другие советы

  

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

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

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

<Ол>
  • Вызовите внешнюю программу для воспроизведения звука (как предлагалось ранее)

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

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

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

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

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

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

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

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

    http://anonsvn.mono-project.com/viewvc/trunk/ csvorbis /

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

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

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

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

    Лицензировано под: CC-BY-SA с атрибуция
    Не связан с StackOverflow
    scroll top