Windows Media Foundation:获取 AAC 解码数据
Windows Media Foundation: getting AAC decoded data
我想使用 Windows Media Foundation 获取 AAC 编码文件的音频数据。我发现正确的方法是声明一个 IMFSample*,其中将保留单个音频样本。在 VS2015 中,我看到这个 class 有一个方法 getDouble(),但在 MSDN documentation.
中没有关于它的任何内容
这是我正在尝试做的示例的一部分:
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();
要指定返回给您的数据格式,请在 reader 上使用 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,但您肯定会想要这样做。
我想使用 Windows Media Foundation 获取 AAC 编码文件的音频数据。我发现正确的方法是声明一个 IMFSample*,其中将保留单个音频样本。在 VS2015 中,我看到这个 class 有一个方法 getDouble(),但在 MSDN documentation.
中没有关于它的任何内容这是我正在尝试做的示例的一部分:
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();
要指定返回给您的数据格式,请在 reader 上使用 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,但您肯定会想要这样做。