視訊交錯
本主題描述媒體來源和譯碼器如何處理交錯式視訊內容。
若要正確譯碼和轉譯交錯式視訊,需要下列資訊:
漸進式或交錯式。 視訊串流可以包含漸進式畫面、交錯式畫面或兩者混合。
欄位支配。 欄位支配描述哪些欄位會先出現、上方欄位或下層欄位。
重複第一個字段。 此旗標會在 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 中,每個範例交錯資訊會包含在 dwTypeSpecificFlagsAM_SAMPLE2_PROPERTIES 結構的成員中。 下表顯示媒體基礎的對等屬性。
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 Interlace 旗標 | Media Foundation 範例屬性 |
---|---|
AMINTERLACE_IsInterlaced | MFSampleExtension_Interlaced = TRUE。 |
AMINTERLACE_1FieldPerSample | MFSampleExtension_SingleField = TRUE。 |
AMINTERLACE_Field1First | MFSampleExtension_BottomFieldFirst = FALSE。 |
相關主題