Конвертировать PCM в MP3 / OGG

Мне нужно преобразовать непрерывный поток PCM или закодированного звука (ADPCM, uLaw, Opus) в формат MP3 / OGG, чтобы его можно было транслировать в браузер (используя аудиотег html). У меня работает часть "stream-mp3 / ogg-using-audio-tag", теперь мне нужно разработать уровень преобразования.

У меня два вопроса:

  1. Как я могу преобразовать PCM в MP3 / OGG с помощью NAudio и / или какой-либо другой библиотеки / фреймворка C #? Я предполагаю, что в демонстрационном приложении NAudio есть один или два фрагмента кода, которые могут это делать, но мне не удалось его найти.
  2. Нужно ли мне преобразовывать закодированные данные (ADPCM, uLaw, OPUS) в PCM (что я могу), прежде чем конвертировать их в MP3 / OGG, или могут ли «контейнеры» MP3 / OGG принимать закодированные данные?

ПРИМЕЧАНИЕ. Я понимаю, что у меня могут возникнуть проблемы с лицензированием MP3, поэтому мы открыты для использования OGG.

Спасибо.


person Tony    schedule 10.12.2013    source источник
comment
Я думаю, что нужная мне информация - это нижняя часть этого ссылка   -  person Tony    schedule 10.12.2013


Ответы (3)


Чтобы ответить на ваш первый вопрос, для создания MP3 или OGG вам понадобится кодировщик. NAudio не включает кодировщик MP3 или OGG. Все, что он делает, это дает вам возможность получить доступ к кодировщикам, которые уже установлены на вашем компьютере (например, ACM или Media Foundation Transforms). Однако как с MP3, так и с OGG вы обнаружите, что самый простой способ - найти неуправляемую DLL или утилиту командной строки и получить к ней доступ из .NET. В статье, которую я написал, на которую вы ссылались выше, содержится краткое объяснение того, как можно использовать LAME.exe с stdin и stdout для преобразования PCM в MP3 на лету.

Что касается вашего второго вопроса, то ответ положительный. Всякий раз, когда вы перекодируете, вы сначала декодируете в PCM, а затем перекодируете в целевой кодек. Я думаю, что теоретически вы можете поместить звук, закодированный в любом формате, в контейнер OGG, но на практике звук в контейнере OGG обычно кодируется с помощью Vorbis. FLAC и OPUS могут быть вариантами, но, опять же, вам нужно будет найти приложение или библиотеку, которые могут написать для вас формат контейнера OGG, поскольку я не знаю ни одного полностью управляемого модуля записи OGG.

person Mark Heath    schedule 10.12.2013
comment
Спасибо за ответ. Я сейчас смотрю код NAudioWpfDemo. Я думаю, что в программе Media Foundation Encode есть то, что мне нужно. - person Tony; 11.12.2013
comment
Я просмотрел демонстрационный код, но по какой-то причине, когда я выбираю «MP3», поле списка «Настройка кодировщика» ничего не заполняется, есть идеи, почему? Я также заметил, что в NAudio 1.7 (который я использую) есть EncodeToMp3, но если я правильно прочитал страницу проекта кода, он должен записать в реальный файл, а не в поток, это правильно? - person Tony; 11.12.2013
comment
потому что он показывает только те кодировки MP3, которые действительны для частоты дискретизации входного файла. И да, этот записывает в файл - это просто вспомогательный метод, обертывающий кодировщик Media Foundation. - person Mark Heath; 11.12.2013
comment
Итак, мне нужно преобразовать мой 8K, 16-битный моно вход во что-то, что кодировщик MP3 будет принимать, прежде чем я смогу использовать кодировщик MF, верно? Где я могу найти список форматов, поддерживаемых кодировщиком MP3? - person Tony; 11.12.2013
comment
Поскольку наша текущая среда разработки (Win7 и Server 2008 R2) НЕ имеет собственного кодировщика MP3, я использовал lame.exe и перенаправил stdin / stdout для обработки нашего преобразования. Если / когда у этого проекта есть надежда выйти из фазы прототипа, я рассмотрю возможность использования Win8 / Server2012 (которые имеют кодировщики mp3, которые, я надеюсь, поддерживают Stream-to-Stream) и / или более подробно изучу NAudio Кори. Хромой (на первый взгляд кажется, что он поддерживает Stream-to-Stream). - person Tony; 13.12.2013

‹Shameless Plug›
Я написал надстройку для NAudio, которая использует libmp3lame из LAME Encoder пакет для кодирования MP3. Он находится на NuGet как NAudio.Lame, а исходный код находится на GitHub.
‹/ Бесстыдный плагин›

К сожалению, проблемы с лицензированием остаются, если вы планируете использовать это для чего-то другого, кроме личного использования. Сам LAME находится под лицензией LGPL, но патенты, которые он реализует, по-прежнему требуют лицензирования от Frauenhofer / Thompson в соответствии с к статье LAME в Википедии. Если вы планируете производить что-то для других, это может обойтись дорого.

Компрессор Vorbis не обременен патентами и т.п., поэтому это разумная альтернатива. В какой-то момент планирую сделать аналогичную обертку для формата OGG / Vorbis. А пока быстрый Google Search открывает Ogg Vorbis Interop Library, которая может быть вам полезна.

И да, вам понадобится PCM в качестве промежуточного формата практически для любого преобразования. NAudio дает вам инструменты для получения PCM из самых разных аудиоформатов.

person Corey    schedule 10.12.2013
comment
Спасибо за предложение. При дальнейшем рассмотрении кажется, что я не могу использовать OGG, поскольку IE не поддерживает его согласно Википедии < / а>. - person Tony; 11.12.2013
comment
Кори, мне удалось заставить ваш NAudio.Lame работать с помощью инструмента командной строки .exe, но как только я перехожу к коду в проект веб-API ASP.NET, я получаю исключение при загрузке libmp3lame.64.dll даже если файл находится в папке bin на моем веб-сайте. Любые идеи? Есть ли лучшее место для размещения вопросов о NAudio.Lame? - person Tony; 13.12.2013
comment
Извините за задержку, Тони ... ознакомьтесь с этим ответом именно об этом типе проблемы. - person Corey; 16.12.2013
comment
Спасибо, я видел запись в вашей вики, но я всегда забываю, что веб-API - это в основном MVC для веб-сервисов, поэтому многие проблемы / исправления MVC применимы и к нему. Я попробую, когда вернусь к работе. - person Tony; 16.12.2013

1) PCM в OGG

string fileName = @"e:\Down\male.wav";
Sox.Convert(@"sox.exe", fileName, fileName + ".ogg");

2) PCM в MP3

    static void AnyToMp3(string fileName)
    {
        DsReader dr = new DsReader(fileName);
        IntPtr formatPcm = dr.ReadFormat();
        byte[] dataPcm = dr.ReadData();
        dr.Close();
        IntPtr formatMp3 = AudioCompressionManager.GetCompatibleFormat(formatPcm,
            AudioCompressionManager.MpegLayer3FormatTag);
        byte[] dataMp3 = AudioCompressionManager.Convert(formatPcm, formatMp3, dataPcm, false);
        Mp3Writer mw = new Mp3Writer(File.Create(fileName + ".mp3"));
        mw.WriteData(dataMp3);
        mw.Close();
    }
person Aleks    schedule 09.04.2014
comment
Мы законсервировали этот проект на несколько месяцев до вчерашнего дня, то, что вы разместили в тот же день, должно быть судьба. Я пришлю вам несколько вопросов о вашей библиотеке через ваш веб-сайт. - person Tony; 11.04.2014