2016-07-07 148 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]。 –

相關問題