合并两个videostream在一个stream如画中画(WMF)

我正在学习Windows Media Foundation。
我已经testing了Windows SDK中提供的几个示例应用程序。
我有示例应用程序从video捕获从相机和video播放文件。

我想存档的是将这两个video源组合在一个video源中,然后生成一个videostream,如画中画。 Windows媒体基础如何做到这一点?

我有阅读关于MFCreateAggregateSource
https://msdn.microsoft.com/en-us/library/windows/desktop/dd388085(v=vs.85).aspx

在这种情况下可以使用MFCreateAggregateSource ,还是仅用于混合audio和videostream?

我想以全屏模式放置一个video,然后在一个小窗口中在第一个video的右上angular显示另一个videostream。

媒体基础如何做到这一点?

**更新**

我更关心的是,使用WMF解码它们然后混合它们,然后重新编码它们,然后写入一个文件,读取两个videostream。 而不是在屏幕上呈现它们。

MFCreateAggregateSource不会做视频混合。 它只会从两个来源创建一个来源,可以被MediaSession使用(通过拓扑和拓扑节点)。

如果您只想显示两个视频,则可以使用增强视频呈现器

您可以使用MFCreateAggregateSource并将每个流连接到EVR。 如果你不想处理时间戳/解码器等等,你也将使用媒体会话(IMFMediaSesion)。

你的任务是非常不寻常的,没有任何媒体基础组件,允许合并两个视频流到一个。 但是,“IMFMediaSesion”支持通过“MFCreateAggregateSource”在一个源中处理两个视频流。 这意味着媒体基金会像'乐高'承包商,它允许你写自己的解决方案,将两个视频流合并成像画中画一样,但它本身并不支持这种功能。

问候。

PS我想建议阅读“安东波林格开发微软媒体基础应用”一书( 开发微软媒体基础应用 ) – 它包括很多例子,但是它包括了代码“WaterMarkTransform” – 代码媒体基础将图像注入到视频流中进行转换 – 为您的解决方案启动此类代码凸轮 – 将一个视频流注入到另一个视频流中。

PS我有一个错误 – 我看到你只想显示画中画 – 所以EVR – 默认的视频渲染器支持16个视频流 – 一个参考和15个额外的 – 你需要通过“MFCreateVideoRendererActivate”创建'VideoRenderer',然后创建每个的视频流(在你的情况下为两个流中的每一个) TopologyNode ,为每个TopologyNode设置已经创建的'VideoRenderer'设置'SetObject' – 结果许多视频流将使用一个'VideoRenderer'。 通过设置TopologyNode SetUINT32为'MF_TOPONODE_STREAMID',你必须通过设置0来选择哪个流将被引用 – '背景图片',以及哪个流将是'MF_TOPONODE_STREAMID'大于0的additional Picture (例如1)。 additional Picture位置可以通过IMFVideoMixerControl来控制 – 它包括下列方法:GetStreamOutputRect – 检索合成矩形内视频流的位置。

GetStreamZOrder – 检索视频流的z顺序。

SetStreamOutputRect – 设置合成矩形内视频流的位置。

SetStreamZOrder – 设置视频流的z顺序。

MFCreateAggregateSource甚至Sequencer Source对于视频混合都可能工作正常,但为了更好地控制这个过程,在我参与的一个项目中,我使用了多个MFSourceReaders来实现MFSinkWriter方法。 这样我可以显示混合的视频内容,如果我将EVR附加到接收器,或将输出视频存储在文件中。 在我正在进行的项目中,要求只输出到mp4,但后来我不得不添加预览支持。 为此,我打算使用两个接收器作家 – 一个用于EVR(或DX11VideoRenderer),一个用于MP4接收器。 实施工作非常稳定。 它有一个视频混合线程,从每个源读取器读取,匹配时间戳,mnixes视频样本,并输出混合视频样本或音频样本(只有一个)到接收器。 希望这可以帮助。