0

我正在尝试让 MPEG-2 解码器(又名 DTV-DVD 视频解码器)为我提供可以上传到 OpenGL 进行渲染的渐进式 YV12 或 NV12 帧。但是我所看到的渲染看起来像是某种形式的未压缩自适应运动交错,或者只是 B 或 P 帧,不能提供完整的图像。(在 OpenGL 中渲染 YV12/NV12 的代码可以很好地与其他来源一起使用,所以这不是问题。)

不是它应该看起来的样子;-)

一条重要线索:当电影开始时以及当它循环回到开头时,我看到了一个完美渲染的帧。这告诉我这是唯一一次获得完整的有效 YV12/NV12 数据帧。

可能的最短描述:

1) 创建了一个自定义 Sample Grabber(基于 CTransInPlaceFilter),以便我可以获得具有 VIDEOINFOHEADER2 的样本。这可以按预期工作,并且样本大小与我正在播放的分辨率下 YV12/NV12 的预期相符。(在此处滚动您自己的 Sample Graabber 的有用示例。)

2) 为确保我只获得渐进式帧,如果 VIDEOINFOHEADER2 的 dwInterlaceFlags 字段设置了 AMINTERLACE_IsInterlaced 标志,我的 Sample Grabber 的 CheckInputType() 方法将返回 E_FAIL。

3) 我正在使用带有 CODECAPI_AVDecVideoSoftwareDeinterlaceMode 的 ICodecAPI 接口在解码器上设置 eAVDecVideoSoftwareDeinterlaceMode_ProgressiveDeinterlacing 标志。(如果我不这样做,解码器将无法连接到我的采样采集器,因为它不接受隔行扫描帧。)

4)为了调试它,我使用 IMediaSample2 接口来获取 Sample Grabber 中传入媒体样本的属性。AM_SAMPLE2_PROPERTIES结构的 dwTypeSpecificFlags 成员告诉我帧是 AM_VIDEO_FLAG_INTERLEAVED_FRAME,我相信这表明我得到的是完整帧而不是单个字段。还为所有帧设置了 AM_VIDEO_FLAG_I_SAMPLE 位,表示我得到的是完整的“I”帧,而不是“B”或“P”帧。

5)鉴于所有帧都是“I”帧,我希望看到我的图像而不是如上所示的 gobbledygook。如上所述,当电影循环回到第一帧时,我唯一一次看到有效图像。

6) 最后一件事:我确实看到我的样本设置了 AM_VIDEO_FLAG_WEAVE。这是图像的“编织”问题吗?

谢谢,马克

4

0 回答 0