我有一个利用EVR的Direct Show程序。我想添加另一个视频流,基本上在主视频流上插入画中画框,但无法弄清楚如何操作:
// When this is called, the graph is already running with the EVR
// displaying a web cam in stream 0
HRESULT CVideoControl::AddVideoStream(wchar_t* file)
{
HRESULT hr;
CComPtr<IMFMediaSink> sink;
CComPtr<IMFStreamSink> stream;
//hr = pEVR->QueryInterface(__uuidof(IMFMediaSink), (void **) &sink); <- FAILS
hr = MFCreateVideoRenderer(__uuidof(IMFMediaSink), (void **) &sink);
hr = sink->AddStreamSink(1234, NULL, &stream);
CComPtr<IMFGetService> service;
hr = pEVR->QueryInterface(&service);
CComPtr<IMFVideoMixerControl> mixer;
hr = service->GetService(MR_VIDEO_MIXER_SERVICE, IID_PPV_ARGS(&mixer));
MFVideoNormalizedRect rect = { .25, .25, .5, .5 };
hr = mixer->SetStreamOutputRect(1234, &rect);
hr = m_pGraph->RenderFile(file, NULL);
return hr;
}
除了SetStreamOutputRect之外,Everything返回S_OK,返回“提供的流号无效。”
我对MFCreateVideoRenderer
电话也很怀疑,因为这是一个直接的节目节目,而不是媒体基金会。
我很确定我过于简单化了,但是找不到太多关于此的文档。有什么建议吗?
答案 0 :(得分:0)
https://msdn.microsoft.com/en-us/library/windows/desktop/aa965247(v=vs.85).aspx
在directshow程序中,您需要使用CoCreateInstance创建EVR,然后使用它的IEVRFilterConfig接口,如上面的链接中所述:
EVR滤波器以一个输入引脚开始,该引脚对应于参考流。要为子流添加引脚,请查询IEVRFilterConfig接口的过滤器并调用IEVRFilterConfig :: SetNumberOfStreams。在连接任何输入引脚之前调用此方法。引脚0始终是参考流。在任何其他引脚之前连接此引脚,因为参考流的格式可能会限制哪些子流格式可用。