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

标签 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 视频,不拉伸(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/

相关文章:

c++ - 是否可以强制 boost-build 添加子项目的包含路径到主项目中?

c++ - WINAPI - 编译时出现错误 LNK2019、LNK2001、LNK1120。

c++ - OpenMP 为内联函数声明 SIMD

azure - 从 Azure Blob 存储剪切视频

ffmpeg时间单位解释及av_seek_frame方法

c++ - 想要在 OSX 上的 OpenCV 中实时镜像视频,不知道从哪里开始

c# - 如何将 directshow 应用程序 (C++) 的输出转发到 C# 应用程序?

c++ - 检测媒体基础中的音量或静音

c++ - 获取 Microsoft Media Foundation 中相机的所有支持的 FPS 值

c++ - 编译器的大括号初始化列表与类型 `std::initializer_list` 的耦合程度如何?