6

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

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

4

1 回答 1

4

IMFVideoMixerControl用于渲染视频。您在查看 SourceReader 时走在正确的轨道上。

这是我要做的:

  1. IMFSourceReader为每个视频源创建一个。
  2. 创建一个IMFSinkWriter并配置它的帧宽度等于源阅读器帧宽度的总和。
    1. 用于IMFSourceReader::GetCurrentMediaType获取源媒体类型。
    2. MFGetAttributeSize与 GUID一起使用MF_MT_FRAME_SIZE可获取每种源类型的框架尺寸。
    3. 为 SinkWriter 创建一个媒体类型,MFCreateMediaType并用于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 处理,尽管此示例使用视频捕获源而不是文件。您可以使用 SourceReaderMFCreateSourceReaderFromURL而不是MFCreateSourceReaderFromMediaSource.

编辑:我意识到你也问过音频。我的回答仅涉及合成视频流。

于 2013-05-08T20:01:17.023 回答