0

これで、メディア ファンデーションで ogg デコーダーを作成できました。

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;
}

このコードで何かが足りない、または何が問題なのですか。ありがとう。

4

1 に答える 1

0

デバッグに topoedit.exe を使用すると、pcm を float 形式に変換するための DMO であるリサンプラー DMO が 1 つ自動的に追加されます。プレーヤー アプリを作成し、自分でトポロジを作成してから、resamplyer dmo ノードを追加できます。

于 2012-05-23T06:56:16.567 に答える