Windows Media Foundation: получение AAC-декодированных данных

Я хочу использовать Windows Media Foundation чтобы получить аудиоданные файла в кодировке AAC. Я понял, что правильным способом является объявление IMFSample *, в котором будет храниться один образец аудио. В VS2015 я вижу, что у этого класса есть метод getDouble (), но в нем нет ничего Документация MSDN.

Вот часть примера, которую я пытаюсь сделать:

    IMFSample *pSample(NULL);

hr = m_pReader->ReadSample(
MF_SOURCE_READER_FIRST_AUDIO_STREAM, // [in] DWORD dwStreamIndex,
0,                                   // [in] DWORD dwControlFlags,
NULL,                                // [out] DWORD *pdwActualStreamIndex,
&dwFlags,                            // [out] DWORD *pdwStreamFlags,
&timestamp,                          // [out] LONGLONG *pllTimestamp,
&pSample);                           // [out] IMFSample **ppSample

Последний аргумент pSample это то, что я хочу.

Теперь я хочу получить двойной, плавающий или байтовый указатель на текущий декодированный Пример данных.

Как это может быть сделано?

Заранее спасибо.

2

Решение

Сначала преобразуйте образец в буфер:

Microsoft::WRL::ComPtr<IMFMediaBuffer> mediaBuffer;
sample->ConvertToContiguousBuffer(&mediaBuffer)

Затем заблокируйте буфер, чтобы получить указатель на его внутренние компоненты:

BYTE *audioData = nullptr;
DWORD sampleBufferLength = 0;
mediaBuffer->Lock(&audioData, nullptr, &sampleBufferLength);
// use audioData...
mediaBuffer->Unlock();

Чтобы указать, какой формат данных вам возвращается, используйте SetCurrentMediaType на вашем читателе (сделайте это один раз в начале)

    Microsoft::WRL::ComPtr<IMFMediaType> pPartialType;
MFCreateMediaType(&pPartialType);
pPartialType->SetGUID(MF_MT_MAJOR_TYPE, MFMediaType_Audio);
pPartialType->SetGUID(MF_MT_SUBTYPE, MFAudioFormat_Float);
reader->SetCurrentMediaType(
(DWORD)MF_SOURCE_READER_FIRST_AUDIO_STREAM,
NULL, pPartialType.Get());

И, пожалуйста, используйте умные указатели везде с MF, или вы попадете в мир боли. Microsoft::WRL::ComPtr<XXX> твой друг! Я пропустил проверку HRESULT в этом примере кода, но вы определенно захотите это сделать.

2

Другие решения

Других решений пока нет …