0

现在我已经在媒体基础中创建了一个 ogg 解码器。

我已将 ogg 数据解码为 IMFTransform::ProcessOutput 中的 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 进行调试,它可以自动添加一个重采样器 DMO,这是一个用于将 pcm 转换为浮点格式的 DMO。您可以编写播放器应用程序,并自己创建拓扑,然后添加 resamplyer dmo 节点。

于 2012-05-23T06:56:16.567 回答