c++ - 添加增强型视频渲染器流

标签 c++ video directshow

我有一个使用 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 之外的所有内容都返回 S_OK,它返回“提供的流编号无效。”

我也对 MFCreateVideoRenderer 调用持怀疑态度,因为这是一个直接展示程序,而不是媒体基础。

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

最佳答案

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

在 directshow 程序中,您需要使用 CoCreateInstance 创建 EVR,然后使用它的 IEVRFilterConfig 接口(interface),如上面的链接所述:

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

关于c++ - 添加增强型视频渲染器流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31434232/

相关文章:

c++ - 在 C/C++ 中初始化结构的 const 成员...取决于编译器?

c++ - 创建一个可以与 boost::hold_any 一起使用的类

api - 验证youtube api v3视频是否存在JS

c# - c#中的视频通话

c - Visual Studio 中 Unresolved external symbol IID 和 CLSID 错误

c++ - boost pool_alloc

c++ - 继承只是为了共享枚举 - 危险吗?

android - 将 FFMpeg 视频转换为 android 可播放视频

javascript - 暂停多个 HTML5 视频

directshow - DirectShow 中 GMFBridge 的使用