gpt4 book ai didi

c++ - 使用 Media Foundation 制作视频

转载 作者:可可西里 更新时间:2023-11-01 14:13:53 29 4
gpt4 key购买 nike

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

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

最佳答案

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

这是我会做的:

  1. 为每个视频源创建一个 IMFSourceReader
  2. 创建一个 IMFSinkWriter 并将其配置为帧宽度等于源阅读器帧宽度之和。
    1. 使用 IMFSourceReader::GetCurrentMediaType 获取源媒体类型。
    2. 使用带有 GUID MF_MT_FRAME_SIZEMFGetAttributeSize 获取每种源类型的帧尺寸。
    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 写入文件接收器。

参见 this sample对于一些基本的 SourceReader/SinkWriter 处理,尽管这个例子使用视频捕获源而不是文件。您可以使用 MFCreateSourceReaderFromURL 而不是 MFCreateSourceReaderFromMediaSource 创建文件 SourceReader。

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

关于c++ - 使用 Media Foundation 制作视频,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12995830/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com