处理来自 IMFSourceReader 和 IMFSample 的图像数据

Posted

技术标签:

【中文标题】处理来自 IMFSourceReader 和 IMFSample 的图像数据【英文标题】:Handling Image data from IMFSourceReader and 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 的最小显示孔径内的数据的正确方法是什么?

【问题讨论】:

【参考方案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,看看“填充” - 这是您数据中的内容,这是您需要考虑的内容。

以上是关于处理来自 IMFSourceReader 和 IMFSample 的图像数据的主要内容,如果未能解决你的问题,请参考以下文章

如何通过 IMFSourceReader 使用自定义堆

在使用 IMFSourceReader 时转换流媒体类型

使用 IMFSourceReader 打开视频文件

如何使用 Media Foundation 从 IMFSourceReader 播放音频缓冲区

有效地将异步 IMFSourceReader 连接到同步 IMFTransform

使用 IMFSourceReader 进行音频流式传输(Microsoft Media Foundation)