添加增强的视频渲染流

Add Enhanced Video Renderer Stream

本文关键字:的视频 增强 增强的 添加      更新时间:2023-10-16

我有一个利用EVR的直接显示程序。我想添加另一个视频流,基本上是在主视频流上插入一个图中图框,但我不太清楚如何做到这一点:

// 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返回"提供的流号无效"之外,所有内容都返回S_OK。

我也怀疑MFCreateVideoRenderer的呼叫,因为这是一个直接展示节目,而不是媒体基金会。

我很确定我过于简化了这一点,但我找不到太多关于这方面的文档。有什么建议吗?

https://msdn.microsoft.com/en-us/library/windows/desktop/aa965247(v=vs.85).aspx

在directshow程序中,您需要使用CoCreateInstance创建EVR,然后使用上面链接中解释的它的IEVRFilterConfig接口:

EVR滤波器从一个输入引脚开始,该引脚对应于参考流。要为子流添加引脚,请查询IEVRFilterConfig接口的过滤器并调用IEVRFilterConfig::SetNumberOfStreams。在连接任何输入引脚之前调用此方法。引脚0总是参考流。在连接任何其他引脚之前连接此引脚,因为参考流的格式可能会限制可用的子流格式。