如何更改Media Foundation Transform输出帧(视频)大小?

时间:2014-11-10 09:38:22

标签: c++ video-processing ms-media-foundation

我正在编写转换,并希望更改帧和视频的输出大小。我检查了样本并找出了函数调用的顺序:

SetInputType
SetOutputType
    GetInputCurrentType
    SetInputType
            UpdateFormatInfo
                GetOutputCurrentType
                SetOutputType
                        GetOutputStreamInfo
                            SetProperties
                                ProcessOutput (THROW NEED INPUT)
                                ProcessInput
                                ProcessOutput
                                ProcessOutput (THROW
                                ....
                                .... repeat until done

我需要在哪一步修改输出大小以及如何修改?

示例:输入640x480视频,输出480x480视频,无需拉伸。

1 个答案:

答案 0 :(得分:1)

在MFT中“改变输出大小”有两个步骤。

1)您需要修改SetOutputType和GetOutputAvailableType例程:

  • 如果SetOutputType当前检查维度以验证它们与输入相同(您可能会或可能不会这样做),那么您需要更新它。
  • 当要求通过GetOutputAvailableType枚举您支持的输出类型时(假设您支持枚举类型),您的输出媒体类型必须具有正确的大小。

2)您需要修改ProcessInput / ProcessOutput中的样本处理,以实际 DO 调整大小。仅更改媒体类型不会执行任何类型的自动调整大小。如何更改尺寸取决于视频数据的实际格式(您未提供),以及您希望如何调整大小的详细信息。你只是想切掉额外的线条吗?从顶部还是底部?你还需要支持切碎宽度吗?

我有一个c ++类来处理创建MFT的所有开销,以及一些示例MFT,它们展示了如何在http://www.LimeGreenSocks.com/MFT使用该类。截至本文撰写时,它仍处于测试阶段,但它应该会给你一些想法。

您尝试做的最接近的样本可能是旋转。旋转时,800x600视频可以成为600x800视频。旋转甚至允许在流式传输时更改旋转(请参阅异步MFT下的Format Changes)。 c ++ rotate mft是一个评论很好的〜350行。