如何将IMFSample发送到EVR Media Sink

时间:2014-07-21 00:18:17

标签: ms-media-foundation

我想单独使用EVR,但我无法向其发送IMFSample。代码列表如下,

//create the video render 
IMFActivate* pActive = NULL;
hr = MFCreateVideoRendererActivate(m_hWnd, &pActive);
CHECK_HR(hr);
hr = pActive->ActivateObject(IID_IMFMediaSink,(void**)&m_pVideoSink) ;
CHECK_HR(hr);
hr = m_pVideoSink->GetStreamSinkByIndex(0,&m_pVideoStreamSink) ;
CHECK_HR(hr);

//on Sample ready from a custom mft
hr = m_pVideoStreamSink->ProcessSample(pSample) ;

然后我收到了E_NOTIMPL错误。经过几个小时的努力,我实施了IMFVideoSampleAllocator:

//get IMFVideoSampleAllocator service
hr =    MFGetService(m_pVideoStreamSink,MR_VIDEO_ACCELERATION_SERVICE,IID_PPV_ARGS(&m_pAllocator)) ;
    CHECK_HR(hr);

//init IMFVideoSampleAllocator,pType is the negotiated type 
hr = m_pAllocator->InitializeSampleAllocator(20,pType) ;

//On sample ready,pSample is the IMFSample from mft
IMFSample* pVideoSample = NULL ;
IMFMediaBuffer* pBuffer = NULL ;
LONGLONG hnsTimeStamp = 0 ;

//copy sample data from pSample to pVideoSample
CHECK_HR(hr = m_pAllocator->AllocateSample(&pVideoSample)) ;
CHECK_HR(hr = pSample->GetSampleTime(&hnsTimeStamp)) ;
CHECK_HR(hr = pVideoSample->SetSampleTime(hnsTimeStamp)) ;
CHECK_HR(hr = pSample->GetBufferByIndex(0,&pBuffer)) ;
CHECK_HR(hr = pVideoSample->AddBuffer(pBuffer)) ;

hr = m_pVideoStreamSink->ProcessSample(pVideoSample) ;

现在,每件事情都很棒,但我只有黑屏,上面没有任何电影画面!

此外,我已将SAR添加到我的代码中,它工作得非常好。

任何帮助,thx!

2 个答案:

答案 0 :(得分:0)

回答你的问题可能有点迟,但无论如何...... 我遇到了类似的情况,我使用配置了MF_SOURCE_READER_D3D_MANAGER的Stream Reader解决了这个问题。我从Stream Sink中获取IDirect3DDeviceManager9的方式与分配器的方式相同:     hr = MFGetService(m_pVideoStreamSink,MR_VIDEO_ACCELERATION_SERVICE,IID_PPV_ARGS(& pD3DManager);

并将其设置为上述MF_SOURCE_READER_D3D_MANAGER属性的IUnknown。

如果你不能使用IMFSourceReader,那么这个链接可能会有所帮助: https://code.google.com/p/webrtc4all/source/browse/trunk/gotham/MFT_WebRTC4All/test/test_evr.cc?r=15

答案 1 :(得分:0)

分配 pVideoSample 后,它已经具有供您使用的缓冲区;您不需要添加任何其他缓冲区。 在您的情况下,我的猜测是最初分配的缓冲区用于呈现输出-这种情况是空的,因此没有图像。