2012-05-09 4 views
0

Теперь я создал декодер ogg в среде мультимедиа.Как вывести данные PCM в MFT

Я декодировал данные ogg для данных PCM в IMFTransform :: ProcessOutput.

но я не могу воспроизвести данные 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 для отладки, он может автоматически добавить одну DMAM для повторной установки, которая является DMO для преобразования pcm в формат float. вы можете написать приложение для плеера и создать топологию самостоятельно, а затем добавить узел resamplyer dmo.