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

How to change Media Foundation Transform output frame(video) size?

本文关键字:视频 Media 何更改 Foundation Transform 输出      更新时间:2023-10-16

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

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

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

示例:输入640x480视频,输出480x480视频。

MFT中有两个步骤可以"更改输出大小"。

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

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

2) 您需要修改ProcessInput/ProcessOutput中样本的处理,以实际DO调整大小。仅仅更改媒体类型并不能自动调整大小。如何更改尺寸取决于视频数据的实际格式(您没有提供),以及如何调整大小的详细信息。你只是想剪掉多余的线条吗?从顶部还是底部?你也需要支持切块宽度吗?

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

可能最接近您尝试执行的操作的示例是"旋转"。旋转时,800x600视频可以变成600x800视频。Rotate甚至允许在流式传输时更改旋转(请参阅异步MFT下的格式更改)。c++旋转mft是一个评论良好的~350行长。