【问题标题】:Merging two video streams in one stream like Picture in Picture (WMF)将两个视频流合并到一个流中,例如画中画 (WMF)
【发布时间】:2017-02-28 13:18:23
【问题描述】:

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

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

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

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

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

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

** 更新**

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

【问题讨论】:

    标签: windows video directx-11 ms-media-foundation


    【解决方案1】:

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

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

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

    【讨论】:

    • 这正是我所做的,但现在我正在努力在一个窗口中分别显示两个视频。我曾尝试使用m_pVideoMixerControl->SetStreamOutputRect(0, &rect),但它不起作用。如何做到这一点。
    • 你传递了什么值。 rect 在 0.0 到 1.0 的范围内。例如 MFVideoNormalizedRect rcHalf = { 0.0, 0.0, 0.5, 0.5 };还要使用 m_pStreamSink->GetIdentifier 检查流的标识符是否正确。
    【解决方案2】:

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

    问候。

    附:我想建议阅读《开发 Microsoft® 媒体基础应用程序》一书 'Anton Polinger' (Developing Microsoft® Media Foundation Applications) 的书 - 它包括一个流的许多示例,但它包括 'WaterMarkTransform' 的代码 - 用于将图像注入视频流的代码媒体基础转换 - 可以为您的解决方案启动此类代码- 将一个视频流注入另一个视频流。

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

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

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

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

    【讨论】:

    • 嗨@Evgeny Pereguda:感谢您发布这个详细的答案,它非常有帮助。因此,根据上次更新,可以使用 Windows Media Foundation 混合两个视频流。如果你有任何实现这个的例子或任何可以描述它是如何实现的文档,这将有助于我理解流程。我也对拓扑结构在实现时如何使用它感到有点困惑。再次感谢您的帮助。
    • 嗨@Evgeny Pereguda:如果我们想将混合视频(画中画)保存到文件中,那该怎么做呢?
    • 我可以推荐阅读“Anton Polinger”的“开发 Microsoft® 媒体基础应用程序”一书 - 这是一本解释媒体基础拓扑概念的书。我有那本书的代码示例 - 。另外,你可以研究我的项目 om Media Foundation Capturing Live-video from Web-camera on Windows 7 and Windows 8 - 这个项目有使用网络摄像头的代码 - 它包括将图像注入实时视频的示例 - 'WaterMark'。跨度>
    • 关于“将混合视频(画中画)保存到文件” - 这是非常不寻常的解决方案,我没有代码。但是,媒体会话可以与具有多个输入视频流的 IMFTransform 对象一起使用——我认为可以编写像“WaterMark”这样的代码,它可以将一个文件中的图像注入另一个文件的图像中。事实上,它需要在输入中获取两个图像,编写混合代码并将结果发送到输出。
    【解决方案3】:

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

    【讨论】:

    • 是否有可能提供有关此或任何涉及混合两个视频流的组件示例的详细信息。目前我并不担心显示混合流,但是,1. 读取两个流,2. 混合它们然后写入文件。所以我将使用 WMF API 读取流解码它们,然后混合它们,然后重新编码它们,然后写入文件。
    • 这个想法是为每个源(文件、捕获)创建一个 IMFSourceReader。为它们中的每一个实现一个 IMFSourceReaderCallback,以便异步接收样本并将每个样本放入队列中。然后在一个单独的线程中将样本出列并混合视频样本(例如使用directx)。您可以使用取自 EVR 或由您(DX 设备)创建的 DirectX 管理器配置 IMFSourceReaders。您可以通过 IMFSinkWriter 对象将混合视频样本馈送到 EVR。或者您可以查看 MFCaptureD3D 样本,了解如何直接使用 DX 绘制混合样本。
    • 感谢您提供详细信息。我们如何使用 DirectX 来混合两个流样本?另外,当我们混合样本时,我们如何配置 EVR 以进行显示。
    • 您可以使用自己创建的 DirectX 设备,或者从 EVR 的设备管理器中获取。您可以查询 DX11 Video Processor 设备并使用 VideoProcessorBlt 进行混合:msdn.microsoft.com/en-us/library/windows/desktop/…。这将适用于 Windows 8 及更高版本。对于早期版本,您可以使用 DXVA-HD 或 DXVA2。
    • 使用 EVR,您还可以选择尝试使用 AddStream for the Sink Writer 将第二个视频输入添加到 EVR。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-09-27
    • 2019-04-16
    • 2020-03-20
    • 2019-12-18
    • 1970-01-01
    • 1970-01-01
    • 2021-11-18
    相关资源
    最近更新 更多