Я хочу использовать 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,
×tamp, // [out] LONGLONG *pllTimestamp,
&pSample); // [out] IMFSample **ppSample
Последний аргумент pSample это то, что я хочу.
Теперь я хочу получить двойной, плавающий или байтовый указатель на текущий декодированный Пример данных.
Как это может быть сделано?
Заранее спасибо.
Сначала преобразуйте образец в буфер:
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 в этом примере кода, но вы определенно захотите это сделать.
Других решений пока нет …