Windows Media Foundation:获取 AAC 解码数据

Posted

技术标签:

【中文标题】Windows Media Foundation:获取 AAC 解码数据【英文标题】:Windows Media Foundation: getting AAC decoded data 【发布时间】:2016-07-07 13:20:05 【问题描述】:

我想使用 Windows Media Foundation 来获取 AAC 编码文件的音频数据。我发现正确的方法是声明一个 IMFSample*,其中将保留音频的单个样本。在VS2015中我看到这个类有一个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,
        &timestamp,                          // [out] LONGLONG *pllTimestamp,
        &pSample);                           // [out] IMFSample **ppSample

最后一个参数pSample是我想要的。

现在,我想获得指向当前解码样本数据的双精度、浮点或字节指针。

如何做到这一点?

提前致谢。

【问题讨论】:

【参考方案1】:

首先将样本转换为缓冲区:

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&lt;XXX&gt; 是你的朋友!我错过了检查此示例代码中的 HRESULT,但您肯定想这样做。

【讨论】:

感谢迈克的回复。我有另一个问题。我们从中得到的数据是未解码的吧? @mbaros 这将是解码后的数据 - 代表原始样本的浮点数列表 [范围 0 到 1.0]。

以上是关于Windows Media Foundation:获取 AAC 解码数据的主要内容,如果未能解决你的问题,请参考以下文章

Windows Media Foundation:获取 AAC 解码数据

Windows Media Foundation MFCreateSourceReaderFromURL 函数中的内存泄漏。任何替代功能?

在 Windows 10 上为 Qt 构建 WMF(Windows Media Foundation)媒体驱动程序插件

Microsoft Windows Server 2008 R2 中的 Microsoft Media Foundation

Windows 7 CoreAudio Media Foundation - IID_IAudioStreamVolume 的 uuidof

用于 Windows RT 的 Media Foundation Audio MFT 的最小实现