2012-05-09 5 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 인 자동 리샘플링 DMO를 하나 추가 할 수 있습니다. 플레이어 앱을 작성하고 직접 토폴로지를 만든 다음 재판매 dmo 노드를 추가 할 수 있습니다.