2012-05-09 14 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をデバッグに使用すると、自動的にpcmをfloat形式に変換するDMOである1つのリサンプラーDMOを追加できます。 プレイヤーアプリを作成し、自分でトポロジを作成してから、リプレライダーdmoノードを追加することができます。

関連する問題