Необработанный аудиофайл в AAC с использованием Windows Media Foundation в Windows 7

Спасибо, что уделили время чтению моего вопроса.

Я разрабатываю приложение на C ++ с использованием Qt и Windows API.

Я записываю звук с микрофона в небольшие аудиофайлы размером 10 с в необработанном формате, и я хочу преобразовать их в формат aac.

Я попытался прочитать как можно больше вещей и подумал, что было бы неплохо начать с API транскодирования Windows Media Foundation.

Проблема в том, что я не могу использовать файл .raw или .pcm в функции CreateObjectFromUrl, поэтому на данный момент я практически застрял здесь. Он продолжает терпеть неудачу. Код возврата hr равен 3222091460. Я попытался передать в функцию файл .mp3, и, конечно же, он работает, поэтому ошибки url-human-error не возникли.

MF_OBJECT_TYPE ObjectType = MF_OBJECT_INVALID;

IMFSourceResolver* pSourceResolver = NULL;
IUnknown* pUnkSource = NULL;

// Create the source resolver.
hr = MFCreateSourceResolver(&pSourceResolver);
if (FAILED(hr))
{
    qDebug() << "Failed !";
}


// Use the source resolver to create the media source.


 hr = pSourceResolver->CreateObjectFromURL(
        sURL,                       // URL of the source.
        MF_RESOLUTION_MEDIASOURCE,  // Create a source object.
        NULL,                       // Optional property store.
        &ObjectType,                // Receives the created object type.
        &pUnkSource                 // Receives a pointer to the media source.
        );

MFCreateSourceResolver работает нормально, но CreateObjectFromURL не удается :(

Итак, у меня к вам два вопроса:

  1. Можно ли кодировать необработанные аудиофайлы в файлы aac с помощью Windows Media Foundation?
  2. Если да, что я должен прочитать, чтобы достичь того, чего я хочу?

Я хочу указать, что я не могу просто использовать ffmpeg или libav, потому что я не могу позволить себе лицензию на свое программное обеспечение и не хочу, чтобы оно распространялось по лицензии GPL. Но если есть альтернативы основам Windows Media для кодирования необработанных аудиофайлов в aac, я был бы рад их услышать.

И, наконец, извините за мой плохой английский, это явно не мой родной язык, и мне очень жаль, если я заставил ваши глаза кровоточить. (и счастлив, если я рассмешил тебя)

Хорошего дня


person Eyal Hadida    schedule 16.09.2012    source источник


Ответы (1)


Код возврата hr равен 3222091460

Это HRESULT коды. Используйте этот инструмент «ShowHresult», чтобы их можно было удобно декодировать. Код означает 0xC00D36C4 MF_E_UNSUPPORTED_BYTESTREAM_TYPE «Тип байтового потока данного URL не поддерживается».

Проблема в основном в том, что эти необработанные файлы не поддерживаются, .WAV является хорошим источником необработанного звука - файл содержит как дескриптор формата, так и полезную нагрузку.

Очевидно, что вы можете сами прочитать данные из необработанного аудиофайла и сжать в AAC с помощью AAC Encoder через IMFTransform интерфейс. Это достаточно просто, и у вас есть данные AAC на выходе, например, записать в raw .AAC.

Альтернативные варианты для Media Foundation - DirectShow (есть подходящие кодеки, хотя я думал, что это может быть не так просто запустить), libfaac, libavcodec от FFmpeg (доступно по LGPL, но не по GPL).

person Roman R.    schedule 16.09.2012
comment
Привет, Роман, большое спасибо за ответ. Это прояснило ситуацию, и я не могу отблагодарить вас за ваше время. Я воспользуюсь кодировщиком AAC от WMF, чтобы получить необработанный AAC, и посмотрю, что я могу оттуда сделать. Если я могу попросить вас еще две минуты ваших знаний, так как я в значительной степени новичок в кодировании звука ... Кажется, я не могу найти какой-либо пример кода, который бы помог мне, какие шаги я должен выполнить, чтобы преобразовать pcm в aac . Насколько я понимаю теперь благодаря вам, мне нужно создать интерфейс IMFTransform, установить исходный входной сигнал и выходной aac, установить продолжительность выборки и вызвать ProcessOutput. Это так просто? - person Eyal Hadida; 16.09.2012
comment
К сожалению, мне не известны хорошие образцы кода. Однако раньше у меня он работал, поэтому я знаю, что он работает хорошо. Да, вам в основном нужно следовать AAC Encoder и создайте экземпляр класса MFT, установите тип входного носителя, установите тип выходного носителя (осторожно!), затем отправьте данные PCM с помощью ProcessInput и извлеките данные AAC с помощью ProcessOutput. - person Roman R.; 16.09.2012