2012-05-09 52 views
0

現在我已經在媒體基礎中創建了一個ogg解碼器。如何在MFT中輸出PCM數據

我已經在IMFTransform :: ProcessOutput中將ogg數據解碼爲PCM數據。

但我無法播放PCM數據,所以現在如何播放PCM數據?

這是我的ProcessOutput代碼:

HRESULT OggDecoder:: ProcessOutput( 
DWORD dwFlags, DWORD cOutputBufferCount, 
MFT_OUTPUT_DATA_BUFFER *pOutputSamples, // one per stream 
DWORD *pdwStatus ) 
{ 
    if (dwFlags != 0) 
    { 
     return E_INVALIDARG; 
    } 

    if (pOutputSamples == NULL || pdwStatus == NULL) 
    { 
     return E_POINTER; 
    } 

    // Must be exactly one output buffer. 
    if (cOutputBufferCount != 1) 
    { 
     return E_INVALIDARG; 
    } 

    // It must contain a sample. 
    if (pOutputSamples[0].pSample == NULL) 
    { 
     return E_INVALIDARG; 
    } 

    EnterCriticalSection(&m_critSec); 

    HRESULT hr = S_OK; 
    DWORD cbData = 0; 

    IMFMediaBuffer *pOutput = NULL; 

    // If we don't have an input sample, we need some input before 
    // we can generate any output. 
    if (!HasPendingOutput()) 
    { 
     hr = MF_E_TRANSFORM_NEED_MORE_INPUT; 
    } 

    // Get the output buffer. 

    if (SUCCEEDED(hr)) 
    { 
     hr = pOutputSamples[0].pSample->GetBufferByIndex(0, &pOutput); 
    } 

    if (SUCCEEDED(hr)) 
    { 
     hr = pOutput->GetMaxLength(&cbData); 
    } 

    if (SUCCEEDED(hr)) 
    { 
        BYTE* pPCM=NULL; 
        pOutputBuffer->Lock(&pPCM,NULL,NULL); 
        GetPCMData(&pPCM); // decode audio data here 
        pOutputBuffer->SetCurrentLength(nLength); 
        pOutputSamples[0].pSample->SetSampleTime(sampleTime); 
        pOutputSamples[0].pSample->SetSampleDuration(sampleDuration); 
        pOutputBuffer->Unlock(); 
    } 

    SafeRelease(&pOutput); 
    LeaveCriticalSection(&m_critSec); 
    return hr; 
} 

有我失去了一些東西或者什麼不對的代碼。 謝謝。

回答

0

如果您使用topoedit.exe進行調試,它可以自動添加一個重新採樣器DMO,這是一個用於將pcm轉換爲浮點格式的DMO。 您可以編寫播放器應用程序,並自行創建拓撲,然後添加resamplyer dmo節點。