【问题标题】:Handling Image data from IMFSourceReader and IMFSample处理来自 IMFSourceReader 和 IMFSample 的图像数据
【发布时间】:2020-05-18 23:24:09
【问题描述】:

我正在尝试使用 IMFSourceReader 来读取和解码 .mp4 文件。我已通过设置部分媒体类型并调用IMFSourceReader::SetCurrentMediaType 将源阅读器配置为解码为MFVideoFormat_NV12,并加载了尺寸为1266x544 的视频。

在处理时,我收到 MF_SOURCE_READERF_CURRENTMEDIATYPECHANGED 标志,其新尺寸为 1280x544,MF_MT_MINIMUM_DISPLAY_APERTURE 为 1266x544。

我相信期望是使用视频调整器 dsp 或视频处理器 mft。但是据我了解,当我在 Windows 7 上时,视频处理器 mft 需要 Windows 8.1,而视频调整器 dsp 不支持MFVideoFormat_NV12

裁剪源阅读器添加的额外数据以仅显示MFVideoFormat_NV12 的最小显示孔径内的数据的正确方法是什么?

【问题讨论】:

    标签: c++ windows ms-media-foundation


    【解决方案1】:

    新媒体类型这样说:“视频是 1266x544 并且您期望/请求,但我必须以 1280x544 纹理来承载它,因为这是 GPU 希望它工作的方式”。

    一般来说,这不需要进一步缩放或裁剪,您已经拥有所需的帧。如果您从示例对象中读取它们 - 我相信您正在尝试这样做 - 只需使用增加的步幅(连续行之间 1280 个字节)。

    如果您将其用作纹理、将其呈现在某处或将其用作渲染的一部分,您只需使用调整后的坐标 (0, 0) - (1266, 544) 忽略余数,而不是使用完整的纹理。

    【讨论】:

    • 感谢您的回复。我还是有点困惑。我将图像数据从IMFSample 缓冲区复制到一个纹理中,然后将被渲染。我是否正确理解这个纹理的大小应该是 (1266 x 544 * 1.5) 字节并且在 Y 平面复制了 1280 x 1266 字节,然后在 UV 平面复制了 1280 * (1266/2) 字节?
    • 1 很有可能您已经拥有纹理,因此您不必回读并更新您自己的资源。您有兴趣找到复制2 的方法@ 解释了步幅的概念here,看看“填充” - 这是您数据中的内容,这是您需要考虑的内容。
    猜你喜欢
    • 1970-01-01
    • 2013-04-06
    • 1970-01-01
    • 2011-04-12
    • 2019-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多