将两个视频流合并为一个流,如画中画 (WMF)

Merging two video streams in one stream like Picture in Picture (WMF)

我正在学习 Windows 媒体基础。
我已经测试了 Windows SDK 中提供的一些示例应用程序。
我有从相机捕获视频和从文件播放视频的示例应用程序。

我要存档的是将这两种视频源合并为一个视频源,然后生成一个视频流,如画中画。 Windows 媒体基金会如何做到这一点?

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

这种情况下可以使用MFCreateAggregateSource吗,还是只是用来混合音视频流?

我想将一个视频置于全屏模式,然后在其上显示另一个视频流,在第一个视频的右上角,window。

如何使用媒体基础完成此操作?

** 更新**

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

MFCreateAggregateSource 不会进行视频混合。例如,它只会从两个来源中创建一个来源,供 MediaSession 使用(通过 Topology 和 TopologyNode)。

如果只想显示两个视频,可以使用Enhanced Video Renderer

您可以使用 MFCreateAggregateSource 并将每个流连接到 EVR。如果您不想处理 timestamping/decoder/etc...,您还必须使用媒体会话 (IMFMediaSesion)。

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

此致。

P.S。我想建议阅读本书 'Developing Microsoft® Media Foundation Applications' 'Anton Polinger' (Developing Microsoft® Media Foundation Applications) 的书 - 它包括一个流的许多示例,但它包含 'WaterMarkTransform' 的代码 - 用于将图像注入视频流的代码媒体基础转换 - 这样的代码凸轮开始为您的解决方案 - 将一个视频流注入另一个视频流。

P.S。我犯了一个错误 - 我看到你只想显示画中画 - 所以 EVR - 默认视频渲染器支持 16 个视频流 - 一个参考和 15 个附加 - 你需要通过 'MFCreateVideoRendererActivate' 创建 'VideoRenderer' 然后为每个视频流创建(在您的情况下为两个流中的每一个)TopologyNode,为每个 TopologyNode 已创建 'VideoRenderer' 设置 'SetObject' - 结果很多视频流将使用一个 'VideoRenderer'。通过为 TopologyNode 和 'MF_TOPONODE_STREAMID' 设置 SetUINT32,您必须 select 哪个流将被引用 - 'background Picture' - 通过设置 0,哪个流将是 additional Picture 且 'MF_TOPONODE_STREAMID' 大于 0(例如 1)。 additional Picture 的位置可以由 IMFVideoMixerControl 控制 - 它包括以下方法: GetStreamOutputRect - 检索视频流在合成矩形内的位置。

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

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

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

MFCreateAggregateSource 甚至 Sequencer Source 都可以用于视频混合,但为了更好地控制过程,在我参与的项目中,我使用了多个 MFSourceReaders 到 MFSinkWriter 方法。这样,如果我将 EVR 附加到接收器写入器,我既可以显示混合视频内容,也可以将输出视频存储在文件中。在我做的项目中,需求只是输出为mp4,但后来我必须添加预览支持。为此,我计划使用两个接收器写入器 - 一个用于 EVR(或 DX11VideoRenderer),另一个用于 MP4 接收器。实施工作非常稳定。它有一个视频混合线程,从每个源读取 reader,匹配时间戳,混合视频样本并将混合视频样本或音频样本(只有一个)输出到接收器编写器。希望这有帮助。