我正在学习Windows Media Foundation 我已经测试了Windows SDK中提供的一些示例应用程序 我有来自摄像机的视频捕获和文件视频播放的示例应用程序。
我要归档的是将这两个视频源合并到一个视频源中,然后生成一个视频流,如画中画。如何在Windows媒体基础上完成此操作?
我已阅读MFCreateAggregateSource
:
https://msdn.microsoft.com/en-us/library/windows/desktop/dd388085(v=vs.85).aspx
在这种情况下可以使用MFCreateAggregateSource
,还是仅用于混合音频和视频流?
我想以全屏模式放置一个视频,然后在小窗口的第一个视频的右上角显示另一个视频流。
如何使用媒体基础来完成这项工作?
**更新**
我更关心的是,使用WMF解码两个视频流然后将它们混合然后重新编码然后写入文件。而不是在屏幕上呈现它们。
答案 0 :(得分:2)
MFCreateAggregateSource不会进行视频混合。它将只从MediaSession(通过拓扑和拓扑节点)使用的两个源创建一个源。例如。
如果您只想显示两个视频,可以使用Enhanced Video Renderer
您可以使用MFCreateAggregateSource并将每个流连接到EVR。如果您不想处理时间戳/解码器/等...,您还必须使用媒体会话(IMFMediaSesion)。
答案 1 :(得分:1)
您的任务非常不寻常,并且没有任何Media Foundation组件允许将两个视频流合并到一个组件中。但是,“IMFMediaSesion”支持通过“MFCreateAggregateSource”在一个源中处理两个视频流。这意味着媒体基金会就像“LEGO”承包商一样,允许您编写自己的解决方案,将两个视频流合并为像画中画一样,但它本身不支持这种功能。
问候。
P.S。我想建议阅读“开发Microsoft®MediaFoundation Applications”一书 预约'Anton Polinger'(Developing Microsoft® Media Foundation Applications) - 它包含一个流的许多示例,但它包含'WaterMarkTransform'的代码 - 代码Media Foundation Transform用于将图像注入视频流 - 这样的代码可以启动您的解决方案 - 将一个视频流注入另一个视频流。
P.S。我有一个错误 - 我看到你只想显示画中画 - 所以EVR - 默认视频渲染器支持16个视频流 - 一个参考和15个额外 - 你需要通过'MFCreateVideoRendererActivate'创建'VideoRenderer'然后为每个创建视频流(在您的情况下为两个流中的每一个)TopologyNode
,通过设置'SetObject'为每个TopologyNode
已创建的'VideoRenderer'设置 - 因此许多视频流将使用ONE'VideoRenderer'。通过为SetUINT32
设置TopologyNode
和'MF_TOPONODE_STREAMID',您必须选择要引用的流 - '背景图片' - 设置为0,哪个流将为additional Picture
并带有'MF_TOPONODE_STREAMID'更多比0(例如1)。
additional Picture
的位置可以由IMFVideoMixerControl控制 - 它包括下一个方法:
GetStreamOutputRect - 检索合成矩形内视频流的位置。
GetStreamZOrder - 检索视频流的z顺序。
SetStreamOutputRect - 设置合成矩形内视频流的位置。
SetStreamZOrder - 设置视频流的z顺序。
答案 2 :(得分:1)
MFCreateAggregateSource甚至Sequencer Source可能适用于视频混合,但为了更好地控制该过程,在我参与的项目中,我使用了多个MFSourceReaders来实现MFSinkWriter方法。这样,如果我将EVR连接到接收器写入器,或者将输出视频存储在文件中,我都可以显示混合视频内容。在我正在进行的项目中,要求只是输出到mp4,但后来我必须添加预览支持。为此,我计划使用两个接收器编写器 - 一个用于EVR(或DX11VideoRenderer),另一个用于MP4接收器。实施工作非常稳定。它有一个视频混合线程,可以从每个源读取器读取,匹配时间戳,混合视频样本并将混合视频样本或音频样本(仅一个)输出到接收器写入器。希望这会有所帮助。