媒体基金会的视频合成

时间:2012-10-21 07:24:06

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

我正在尝试将2个视频合成为一个(音频也是如此)并保存为文件。比如,在最终视频的左半部分显示源视频,在右边显示ohter源。任何编码都没问题。不是DirectShow。

我怀疑IMFVideoMixerControl可能与此有关,但遗憾的是我对MF来说太新了,无法确定正确的步骤以实现这一目标。如果您可以给我一些指导或网上有任何示例,请告诉我。谢谢你的帮助。

1 个答案:

答案 0 :(得分:4)

IMFVideoMixerControl用于呈现视频。你正在寻找SourceReader。

这就是我要做的事情:

  1. 为每个视频源创建一个IMFSourceReader
  2. 创建IMFSinkWriter并将其配置为框架宽度等于源阅读器框架宽度的总和。
    1. 使用IMFSourceReader::GetCurrentMediaType获取源媒体类型。
    2. 使用带有GUID MFGetAttributeSize的{​​{1}}获取每种来源类型的框架尺寸。
    3. 使用MF_MT_FRAME_SIZE为SinkWriter创建媒体类型,并使用MFCreateMediaType将源中的属性复制到接收媒体类型。
    4. 使用带有GUID IMFMediaType::CopyAllItems的{​​{1}}来设置接收器类型增加的帧尺寸。
    5. 使用MFSetAttributeSize创建与源类型相同的视频流,但宽度属性
    6. 除外
  3. 为每个来源调用IMFSourceReader :: ReadSample,为每个来源提供一个IMFSample。
  4. 分配一个新的MF_MT_FRAME_SIZE,附加一个新的IMFSinkWriter::AddStream,其帧宽增加。
  5. 使用IMFSample将每个源缓冲区复制到分配的媒体缓冲区的相应端。
  6. 使用IMFMediaBufferMFCopyImage写入文件接收器。
  7. 有关基本的SourceReader / SinkWriter处理,请参阅this sample,尽管此示例使用视频捕获源而不是文件。您可以使用IMFSinkWriter::WriteSample而不是IMFSample创建文件SourceReader。

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