【问题标题】:How to send IMFSample to EVR Media Sink如何将 IMFSample 发送到 EVR 媒体接收器
【发布时间】:2014-07-21 00:18:16
【问题描述】:

我想单独使用 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,效果非常好。

任何帮助,谢谢!

【问题讨论】:

    标签: ms-media-foundation


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 提供一个小演示总是很好;而不仅仅是描述。它可能有助于其他人更好地理解。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-11-25
      • 1970-01-01
      • 2017-09-17
      • 2013-08-04
      • 1970-01-01
      • 2015-12-20
      • 1970-01-01
      相关资源
      最近更新 更多