如何在MFT中输出PCM数据

时间:2012-05-09 09:01:10

标签: windows-media-player ms-media-foundation mft

现在我在媒体基础上创建了一个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;
}

我是否遗漏了此代码的错误或错误。 感谢。

1 个答案:

答案 0 :(得分:0)

如果使用topoedit.exe进行调试,它可以自动添加一个重采样器DMO,这是一个DMO,用于将pcm转换为float格式。 您可以编写播放器应用程序,并自行创建拓扑,然后添加resamplyer dmo节点。