我正在写一个转换,想改变帧和视频的输出大小。我检查了样本,发现了函数调用的顺序:
SetInputType
SetOutputType
GetInputCurrentType
SetInputType
UpdateFormatInfo
GetOutputCurrentType
SetOutputType
GetOutputStreamInfo
SetProperties
ProcessOutput (THROW NEED INPUT)
ProcessInput
ProcessOutput
ProcessOutput (THROW
....
.... repeat until done
我需要在哪一步修改输出大小以及如何修改?
示例:输入 640x480 视频,输出 480x480 视频,不拉伸(stretch)。
最佳答案
在 MFT 中“更改输出大小”有 2 个步骤。
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 行。
关于c++ - 如何更改 Media Foundation Transform 输出帧(视频)大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26840659/