【问题标题】:Video composition with Media Foundation与 Media Foundation 一起制作视频
【发布时间】:2012-10-21 07:24:06
【问题描述】:

我正在尝试将 2 个视频合成为一个(也是音频)并另存为文件。比如说,在最终视频的左半部分显示一个源视频,在右侧显示另一个源。任何编码都可以。不使用 DirectShow。

我怀疑 IMFVideoMixerControl 可能与此有关,但不幸的是,我对 MF 太陌生,无法确定为实现这一目标而采取的正确步骤。如果您能给我一些指导或网络上有任何示例,请告诉我。感谢您的帮助。

【问题讨论】:

  • 据我所知,MF中没有这个功能。对于这样的任务,(有问题的)DirectShow 编辑服务仍然没有替代品! :-(
  • 至少,我认为我应该能够阅读媒体样本(msdn.microsoft.com/en-us/library/windows/desktop/…),对多个视频源执行此操作。将来自源的字节数组帧合成为一个(不理想..)。然后应该能够将样本写入 IMFSinkWriter 以保存为编码视频。我还没有尝试过,但它可能会很慢(虽然我不太关心我的应用程序的性能)。所以我想知道是否有更好的(标准)方法来做到这一点。

标签: c++ windows winapi video ms-media-foundation


【解决方案1】:

IMFVideoMixerControl 用于渲染视频。看着 SourceReader,你走在了正确的轨道上。

我会这样做:

  1. 为每个视频源创建一个IMFSourceReader
  2. 创建一个IMFSinkWriter 并将其配置为与源阅读器帧宽度之和相等的帧宽度。
    1. 使用IMFSourceReader::GetCurrentMediaType 获取源媒体类型。
    2. 使用 MFGetAttributeSize 和 GUID MF_MT_FRAME_SIZE 来获取每种源类型的框架尺寸。
    3. 使用MFCreateMediaType 为 SinkWriter 创建一个媒体类型,并使用IMFMediaType::CopyAllItems 将属性从源媒体类型复制到接收器媒体类型。
    4. 使用 MFSetAttributeSize 和 GUID MF_MT_FRAME_SIZE 设置接收器类型的增加框架尺寸。
    5. 使用IMFSinkWriter::AddStream 创建与源类型相同的视频流,宽度属性除外
  3. 为每个来源调用 IMFSourceReader::ReadSample,为每个来源提供一个 IMFSample。
  4. 分配一个新的IMFSample,附加一个增加了框架宽度的新IMFMediaBuffer
  5. 使用MFCopyImage 将每个源缓冲区复制到分配的媒体缓冲区的对应端。
  6. 使用IMFSinkWriter::WriteSample 将您的IMFSample 写入文件接收器。

有关一些基本的 SourceReader/SinkWriter 处理,请参阅 this sample,尽管此示例使用视频捕获源而不是文件。您可以使用 MFCreateSourceReaderFromURL 而不是 MFCreateSourceReaderFromMediaSource 创建文件 SourceReader。

编辑:我意识到您也询问了音频。我的回答只涉及合成视频流。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多