2016-07-07 144 views
2

我想使用Windows Media Foundation获取AAC编码文件的音频数据。我发现正确的方法是声明一个IMFSample *,其中将保留单个音频样本。在VS2015中,我看到这个类有一个方法getDouble(),但在MSDN documentation中没有任何关于它的内容。Windows Media Foundation:获取AAC解码数据

下面是例子,我试图做的部分:

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()); 

和PL轻松使用智能指针随处可见MF或您将进入一个痛苦的世界。 Microsoft::WRL::ComPtr<XXX>是你的朋友!我错过了在这个示例代码中检查HRESULT的情况,但是您一定会想要这样做。

+0

感谢您的答复迈克。我有另一个问题。我们将从这里得到的数据是未解码的权利? – mbaros

+1

@mbaros这将是解码数据 - 表示原始样本的浮点数[范围为0到1.0]。 –

相关问题