视频交错
本主题介绍媒体源和解码器如何处理交错的视频内容。
若要正确解码和呈现交错视频,需要以下信息:
渐进式或交错。 视频流可以包含渐进式帧、交错帧或两者混合。
字段控制。 字段控制性描述哪些字段首先显示、上部字段或下部字段。
重复第一个字段。 此标志在 3:2 下拉时使用,当帧是渐进式的,但流交错。 在此上下文中,第一个字段可以是上字段或下字段。
交错字段或单个字段。 示例可以保存单个字段或两个交错字段。 如果样本包含单个字段,则样本高度为帧高度的一半,因为样本只包含一个帧的扫描行的一半。 除非源内容的特征另有规定,否则建议使用交错字段。
这些特征中的任何一个都可以从一个样本更改为下一个样本。 但是,在流式处理开始之前,视频组件需要了解有关整体内容的内容。 例如,如果视频交错,增强的视频呈现器(EVR)需要保留用于取消交错的视频内存。 另一方面,如果视频是完全渐进式帧,EVR 可以优化呈现管道。 向管道添加无交错步骤会增加呈现延迟。
有关交错的信息存储在两个位置:
媒体类型中的交错信息
媒体类型的 MF_MT_INTERLACE_MODE 属性描述流整体是如何交错的。 此属性的值是 MFVideoInterlaceMode 枚举的成员。 视频媒体类型应始终具有此属性。
- 如果流仅包含渐进式帧,且没有交错帧,请使用MFVideoInterlace_Progressive。
- 如果流仅包含交错帧,并且每个样本都包含两个交错字段,请使用MFVideoInterlace_FieldInterleavedUpperFirst或MFVideoInterlace_FieldInterleavedLowerFirst。
- 如果流仅包含交错帧,并且每个示例都包含一个字段,请使用MFVideoInterlace_FieldSingleUpper或MFVideoInterlace_FieldSingleLower。 如果字段在上下交替,则使用这两个值中的哪一个无关紧要。 如果格式仅包含上部字段或低字段,则设置与内容对应的值。
- 如果流包含交错帧和渐进帧的混合,或者字段控制切换,请将媒体类型设置为MFVideoInterlace_MixedInterlaceOrProgressive。 使用示例属性描述每个帧。
下表汇总了此属性。
MF_MT_INTERLACE_MODE | 交错? | 样品 | 第一个字段 |
---|---|---|---|
MFVideoInterlace_Progressive | 不 | 渐进式帧 | 不適用 |
MFVideoInterlace_FieldInterleavedUpperFirst | 是的 | 交错字段 | 上一个 |
MFVideoInterlace_FieldInterleavedLowerFirst | 是的 | 交错字段 | 下一个 |
MFVideoInterlace_FieldSingleUpper | 是的 | 单个字段 | 上一个 |
MFVideoInterlace_FieldSingleLower | 是的 | 单个字段 | 下一个 |
MFVideoInterlace_MixedInterlaceOrProgressive | 可能有所不同 | 交错的字段或渐进式帧 | 可能有所不同 |
交错字段和单个字段不能混合。 从一个切换到另一个需要更改媒体类型。
示例上的交错标志
可以使用示例属性指示可以从一个样本更改为下一个示例的信息。 使用 IMFSample 接口获取或设置这些属性。
本节中列出的所有交错属性都具有布尔值。 实际上,这些属性可以有三个值:TRUE、FALSE或未设置。 如果未设置属性,则该值取自媒体类型。 如果设置了属性,该值将替代媒体类型。 标志和媒体类型的某些组合无效。
属性 | 描述 |
---|---|
MFSampleExtension_Interlaced | 如果 TRUE,则帧交错。 如果 FALSE,则帧是渐进式的。 如果媒体类型MFVideoInterlace_MixedInterlaceOrProgressive,请在每个示例上设置此属性。 |
MFSampleExtension_BottomFieldFirst | 此标志的含义取决于示例是包含交错字段还是单个字段。
|
MFSampleExtension_RepeatFirstField | 如果 TRUE,则重复第一个字段。 如果 FALSE 或未设置,则不会重复第一个字段。 |
MFSampleExtension_SingleField | 如果 TRUE,则示例包含单个字段。 如果 FALSE,则示例包含交错字段。 |
下表根据媒体类型显示了哪些标志是必需的、可选或禁止标志。
媒体类型 | 交错标志 | BottomFieldFirst 标志 | RepeatFirstField 标志 | SingleField 标志 |
---|---|---|---|---|
进步 | 自选;如果已设置,则必须 FALSE。 | 不设置。 | 不设置。 | 不设置。 |
交错字段 | 自选;如果已设置,则必须 TRUE。 | 自选;如果已设置,则必须匹配媒体类型。 | 不设置。 | 自选;如果已设置,则必须 FALSE。 |
单个字段 | 自选;如果已设置,则必须 TRUE。 | 必填。 | 不设置。 | 设置为 TRUE。 |
混合 | 必填。 | 必填。 | 必填。 | 自选;如果已设置,则必须 FALSE。 |
如果属性是可选的,媒体类型已定义信息。 设置属性以匹配(但不是必需的)是有效的。
例如,如果媒体类型MFVideoInterlace_Progressive,则表示流中的所有帧都是渐进式的。 因此,可以将 MFSampleExtension_Interlaced 属性设置为 FALSE,或使属性保持未设置。
建议
本部分包含针对各种类型的内容的建议。
- 视频都是渐进式帧。
将媒体类型设置为MFVideoInterlace_Progressive。
不要设置 MFSampleExtension_Interlaced 属性,或将其设置为在每个帧上 FALSE。
不要设置 MFSampleExtension_BottomFieldFirst、MFSampleExtension_RepeatFirstField或 MFSampleExtension_SingleField 属性。
- 视频都是具有相同字段统治地位的交错字段。 示例包含交错字段。
将媒体类型设置为MFVideoInterlace_FieldInterleavedUpperFirst或MFVideoInterlace_FieldInterleavedLowerFirst。
不要设置 MFSampleExtension_Interlaced 属性,或将其设置为在每个帧上 TRUE。
请勿设置 MFSampleExtension_BottomFieldFirst 属性,或设置每个帧上的值以匹配媒体类型。
不要设置 MFSampleExtension_RepeatFirstField 属性,或将其设置为在每个帧上 FALSE。
不要设置 MFSampleExtension_SingleField 属性,或将其设置为在每个帧上 FALSE。
- 该视频包含交错和渐进帧的混合,具有重复字段和不同的场控制(例如 DVD 视频)。
将媒体类型设置为MFVideoInterlace_MixedInterlaceOrProgressive。
在每个帧上,设置 MFSampleExtension_Interlaced、MFSampleExtension_BottomFieldFirst和 MFSampleExtension_RepeatFirstField 属性。
不要设置 MFSampleExtension_SingleField 属性,或将其设置为在每个帧上 FALSE。
- 视频交错,示例包含单个字段。
将媒体类型设置为MFVideoInterlace_FieldSingleUpper或MFVideoInterlace_FieldSingleLower。
在每个帧上,设置 MFSampleExtension_BottomFieldFirst 属性。
不要设置 MFSampleExtension_Interlaced 属性,或将其设置为在每个帧上 TRUE。
不要设置 MFSampleExtension_RepeatFirstField 属性,或将其设置为在每个帧上 FALSE。
不要设置 MFSampleExtension_SingleField 属性,或将其设置为在每个帧上 TRUE。
大多数视频内容属于以下类别之一。
MPEG-2 映射
对于 MPEG-2 内容,请使用以下映射将 MPEG-2 标志转换为 Media Foundation 示例属性。
picture_structure
价值 | 示例属性 |
---|---|
框架 | MFSampleExtension_SingleField = FALSE |
top_field |
MFSampleExtension_SingleField = TRUE MFSampleExtension_BottomFieldFirst = FALSE |
bottom_field |
MFSampleExtension_SingleField = TRUE MFSampleExtension_BottomFieldFirst = TRUE |
progressive_frame
价值 | 示例属性 |
---|---|
0 | MFSampleExtension_Interlaced = TRUE |
1 | MFSampleExtension_Interlaced = FALSE |
top_field_first
价值 | 示例属性 |
---|---|
0 | MFSampleExtension_BottomFieldFirst = TRUE |
1 | MFSampleExtension_BottomFieldFirst = FALSE |
repeat_first_field
价值 | 示例属性 |
---|---|
0 | MFSampleExtension_RepeatFirstField = FALSE |
1 | MFSampleExtension_RepeatFirstField = TRUE |
Single-Field 示例
如果媒体类型MFVideoInterlace_FieldSingleUpper或MFVideoInterlace_FieldSingleLower,则表示每个样本都包含一个字段。 但是,媒体类型描述整个帧。 因此,每个缓冲区只包含媒体类型中给定的字段行数的一半。 例如,如果媒体类型将视频描述为 720 × 480,则每个字段包含 240 个扫描行,因此每个缓冲区仅包含 240 行像素。 如果编写接受具有单字段示例的媒体类型的组件,则必须在访问缓冲区中的数据时考虑这一事实。
相同的规则适用于几何光圈(MF_MT_GEOMETRIC_APERTURE 属性)和最小显示孔径(MF_MT_MINIMUM_DISPLAY_APERTURE 属性)。 这些区域按整个框架而不是单个字段指定。
DirectShow 映射
在 DirectShow 中,每个样本交错信息包含在 AM_SAMPLE2_PROPERTIES 结构的 dwTypeSpecificFlags 成员中。 下表显示了媒体基础的等效属性。
DirectShow 示例标志 | Media Foundation 示例属性 |
---|---|
AM_VIDEO_FLAG_INTERLEAVED_FRAME | MFSampleExtension_SingleField = FALSE。 |
AM_VIDEO_FLAG_FIELD1 |
MFSampleExtension_Interlaced = TRUE。 MFSampleExtension_SingleField = TRUE。 MFSampleExtension_BottomFieldFirst = FALSE。 |
AM_VIDEO_FLAG_FIELD2 |
MFSampleExtension_Interlaced = TRUE。 MFSampleExtension_SingleField = TRUE。 MFSampleExtension_BottomFieldFirst = TRUE。 |
AM_VIDEO_FLAG_WEAVE | MFSampleExtension_Interlaced = FALSE。 (此标志指示驱动程序不应取消交错这两个字段。 |
AM_VIDEO_FLAG_FIELD1FIRST | MFSampleExtension_BottomFieldFirst = FALSE。 如果内容交错,并且AM_VIDEO_FLAG_FIELD1FIRST标志不存在,请将此属性设置为 TRUE。 |
AM_VIDEO_FLAG_REPEAT_FIELD | MFSampleExtension_RepeatFirstField = TRUE。 如果AM_VIDEO_FLAG_REPEAT_FIELD标志不存在,请将此属性设置为 FALSE。 |
如果 DirectShow 示例不包含示例标志,请使用 VIDEOINFOHEADER2 结构中的 dwInterlaceFlags 值:
DirectShow 交错标志 | Media Foundation 示例属性 |
---|---|
AMINTERLACE_IsInterlaced | MFSampleExtension_Interlaced = TRUE。 |
AMINTERLACE_1FieldPerSample | MFSampleExtension_SingleField = TRUE。 |
AMINTERLACE_Field1First | MFSampleExtension_BottomFieldFirst = FALSE。 |
相关主题