交错视频编码 (Microsoft Media Foundation)
用于计算机的视频数据通常是 渐进式的,这意味着每个帧都编码为单个图像。 某些设备(如电视)不会同时显示所有帧,而是显示为两个图像。 其中一个图像或字段包含所有偶数编号的行。 另一个字段包含所有奇数编号行的数据。 每个帧使用多个字段编码的视频称为交错,因为它通过在偶数字段和奇数字段之间切换来呈现。
过去,在使用 Windows Media 视频编解码器进行编码之前,交错视频内容始终是去交错的。 但是,从 Windows Media 9 系列开始,视频编码器支持对交错内容进行压缩,而无需先将其转换为渐进式。 如果内容曾经在隔行扫描显示器(如电视)上呈现,则保持编码文件中的交错非常重要。 随着对基于 Windows 媒体的内容的支持扩展到 DVD 播放器、机顶盒和其他家用电子产品,此功能越来越重要。
编码和传送交错视频的最简单方法是使用 Windows Media Format SDK 开发应用程序,并将内容存储在 ASF 文件中。 有关帧的交错信息使用数据单元扩展传递给编解码器,这些数据单元扩展适用于 ASF 内容,但在其他容器中支持会更复杂一些。 有关数据单元扩展的详细信息,请参阅 使用数据单元扩展。
若要支持交错编码,需要执行两个主要步骤:将帧信息传送到编码器,以及将信息传送到渲染应用程序。 以下步骤在以下段落中介绍。
交错视频和编码器
使用保持隔行扫描对视频进行编码的第一步是将编码器配置为对交错字段进行编码。 为此,请将 MFPKEY_INTERLACEDCODINGENABLED 属性设置为 TRUE。 这将准备编码器以接收隔行扫描样本。 每个输入示例都必须包含这两个字段。
激活交错编码后使用编码器处理的每个示例都应附加一个数据单元扩展。 假定没有预期数据单元扩展的样本是渐进式的。 标识扩展的 GUID 为 D590DC20-07BC-436C-9CF7-F3BBFBF1A4DC。 下表中定义了 Windows Media Format SDK 的对象传递的值。
值 | 说明 |
---|---|
0x00000020 | 指定先使用底部字段对示例进行编码。 仅当与交错值组合时,此值才有意义。 |
0x00000040 | 指定先使用顶部字段对示例进行编码。 仅当与交错值组合时,此值才有意义。 |
0x00000080 | 指定隔行扫描样本。 这是对编解码器 DSO 有意义的唯一值。 |
在对样本进行设置之前,前两个值之一始终使用按位 OR 与 0x80组合。 但是,编码器仅检查0x80,而忽略扩展的其余部分。 如果扩展将示例标识为交错,则编码器将在压缩流中维护样本交错,并在流中嵌入指示标志,以便解码器可以识别交错帧。 每个交错样本都进行了标记,以便将混合渐进式和交错的源内容一起编码为流。
Windows Media Format SDK 编写器对象在示例中包括内容类型数据单元扩展,这些扩展将写入 ASF 容器的数据部分,以便在呈现时使用。
读取和呈现隔行扫描视频
解码器根据编码器在流中设置的标志标识交错样本。 默认情况下,解码器对样本进行反交错并提供渐进式输出。 播放器应用程序可以通过设置 MFPKEY_DECODER_DEINTERLACING 属性,将解码器配置为处理具有交错维护的输出。
解码器提供样本后,交错视频播放的难度就会出现。 在不知道哪个字段是哪个字段的情况下,呈现器 (视频卡或芯片的设备) 无法正确显示视频内容。 在使用 Windows Media 格式 SDK 的应用程序中,内容类型数据单元扩展是从未压缩的示例中检索的,并且可以传递给设备。
直接使用编解码器对象时,此数据传输均不是自动的。 必须在缓冲区对象和用于编码内容的容器中实现数据单元扩展支持。 最常见的媒体容器类型 ((如 AVI) )不支持示例级元数据。 你可以实现自己的系统,将数据存储在文件中,并将其与各个示例相关联,但只有自定义的读取者才能检索这些数据。
注意
将 MFPKEY_INTERLACEDCODINGENABLED 属性设置为 TRUE,然后不发送任何附加了内容类型数据单元扩展的示例可能会导致编码器崩溃。 仅当要传送交错样本时,才设置隔行编码的编码器。
相关主题