共用方式為


視訊交錯

本主題描述媒體來源和解碼器如何處理交錯的視訊內容。

若要正確解碼和轉譯交錯視訊,需要下列資訊:

  • 漸進式或交錯。 視訊資料流程可以包含漸進式畫面、交錯式畫面,或混合兩者。

  • 欄位支配。 欄位支配描述哪些欄位會先出現、上方欄位或下層欄位。

  • 重複第一個欄位。 此旗標用於 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 No 漸進式框架 不適用
MFVideoInterlace_FieldInterleavedUpperFirst Yes 交錯欄位 第一個上方
MFVideoInterlace_FieldInterleavedLowerFirst Yes 交錯欄位 第一個下層
MFVideoInterlace_FieldSingleUpper Yes 單一欄位 第一個上方
MFVideoInterlace_FieldSingleLower Yes 單一欄位 第一個下層
MFVideoInterlace_MixedInterlaceOrProgressive 可能會有所不同 交錯欄位或漸進式畫面格 可能會有所不同

 

交錯的欄位和單一欄位不能混合。 從一個切換到另一個需要變更媒體類型。

範例上的交錯旗標

可以使用範例屬性來指出可以從一個範例變更為下一個樣本的資訊。 使用 IMFSample 介面來取得或設定這些屬性。

本節所列的所有交錯屬性都有布林值。 實際上,這些屬性可以有三個值: TRUEFALSE或未設定。 如果未設定屬性,此值會取自媒體類型。 如果已設定屬性,則值會覆寫媒體類型。 旗標和媒體類型的某些組合無效。

屬性 Description
MFSampleExtension_Interlaced 如果 為 TRUE,框架會交錯。 如果 為 FALSE,則框架為漸進式。
如果媒體類型MFVideoInterlace_MixedInterlaceOrProgressive,請在每個範例上設定此屬性。
MFSampleExtension_BottomFieldFirst 此旗標的意義取決於樣本是否包含交錯的欄位或單一欄位。
  • 交錯的欄位:如果 為 TRUE,則下層欄位是第一個欄位。 如果 為 FALSE,則第一個上方欄位。
  • 單一欄位:如果 為 TRUE,範例會包含較低的欄位。 如果 為 FALSE,則範例包含上方欄位。
如果媒體類型MFVideoInterlace_FieldSingleUpper、MFVideoInterlace_FieldSingleLower或MFVideoInterlace_MixedInterlaceOrProgressive,請在每個交錯範例上設定此屬性。
MFSampleExtension_RepeatFirstField 如果 為 TRUE,則會重複第一個欄位。 如果未設定 FALSE ,則不會重複第一個欄位。
MFSampleExtension_SingleField 如果 為 TRUE,則範例包含單一欄位。 如果 為 FALSE,則範例包含交錯的欄位。

 

下表顯示根據媒體類型,需要、選擇性或禁止的旗標。

媒體類型 交錯旗標 BottomFieldFirst 旗標 RepeatFirstField 旗標 SingleField 旗標
漸進式 選;如果設定,則必須為 FALSE 請勿設定。 請勿設定。 請勿設定。
交錯欄位 選;如果設定,則必須為 TRUE 選;如果已設定,則必須符合媒體類型。 請勿設定。 選;如果設定,則必須為 FALSE
單一欄位 選;如果設定,則必須為 TRUE 必要。 請勿設定。 設定為 TRUE
Mixed 必要。 必要。 必要。 選;如果設定,則必須為 FALSE

 

在屬性是選擇性的案例中,媒體類型已經定義資訊。 將 屬性設定為相符,但並非必要是有效的。

例如,如果媒體類型是MFVideoInterlace_Progressive,則表示資料流程中的所有畫面都是漸進式的。 因此,您可以將 MFSampleExtension_Interlaced 屬性設定為 FALSE,或讓屬性保持未設定。

建議

本節包含各種內容類型的建議。

  1. 影片都是漸進式畫面。
  • 將媒體類型設定為 MFVideoInterlace_Progressive。

  • 請勿設定 MFSampleExtension_Interlaced 屬性,或在每一個畫面上將它設定為 FALSE

  • 請勿設定 MFSampleExtension_BottomFieldFirstMFSampleExtension_RepeatFirstFieldMFSampleExtension_SingleField 屬性。

  1. 影片是所有交錯的欄位,具有相同的欄位支配。 範例包含交錯欄位。
  • 將媒體類型設定為 MFVideoInterlace_FieldInterleavedUpperFirst 或 MFVideoInterlace_FieldInterleavedLowerFirst。

  • 請勿設定 MFSampleExtension_Interlaced 屬性,或在每一個畫面上將其設定為 TRUE

  • 請勿設定 MFSampleExtension_BottomFieldFirst 屬性,或在每個畫面上設定值以符合媒體類型。

  • 請勿設定 MFSampleExtension_RepeatFirstField 屬性,或在每一個畫面上將它設定為 FALSE

  • 請勿設定 MFSampleExtension_SingleField 屬性,或在每一個畫面上將它設定為 FALSE

  1. 影片包含交錯式和漸進式畫面的混合,重複的欄位和不同的欄位支配 (例如 DVD 視訊) 。
  • 將媒體類型設定為 MFVideoInterlace_MixedInterlaceOrProgressive。

  • 在每個畫面上,設定 MFSampleExtension_InterlacedMFSampleExtension_BottomFieldFirstMFSampleExtension_RepeatFirstField 屬性。

  • 請勿設定 MFSampleExtension_SingleField 屬性,或在每一個畫面上將它設定為 FALSE

  1. 影片交錯,範例包含單一欄位。
  • 將媒體類型設定為 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
top_field = MFSampleExtension_SingleField
MFSampleExtension_BottomFieldFirst =
bottom_field = MFSampleExtension_SingleField
MFSampleExtension_BottomFieldFirst =

 

progressive_frame

範例屬性
0 = MFSampleExtension_Interlaced
1 = MFSampleExtension_Interlaced

 

top_field_first

範例屬性
0 MFSampleExtension_BottomFieldFirst =
1 MFSampleExtension_BottomFieldFirst =

 

repeat_first_field

範例屬性
0 = MFSampleExtension_RepeatFirstField
1 = MFSampleExtension_RepeatFirstField

 

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_SingleFieldFALSE
AM_VIDEO_FLAG_FIELD1 = MFSampleExtension_InterlacedTRUE
MFSampleExtension_SingleField = TRUE
= MFSampleExtension_BottomFieldFirstFALSE
AM_VIDEO_FLAG_FIELD2 = MFSampleExtension_InterlacedTRUE
MFSampleExtension_SingleField = TRUE
= MFSampleExtension_BottomFieldFirstTRUE
AM_VIDEO_FLAG_WEAVE = MFSampleExtension_InterlacedFALSE。 (此旗標表示驅動程式不應該取消交錯這兩個 fields.)
AM_VIDEO_FLAG_FIELD1FIRST = MFSampleExtension_BottomFieldFirstFALSE。 如果內容交錯,且AM_VIDEO_FLAG_FIELD1FIRST旗標不存在,請將此屬性設定為 TRUE
AM_VIDEO_FLAG_REPEAT_FIELD = MFSampleExtension_RepeatFirstFieldTRUE。 如果AM_VIDEO_FLAG_REPEAT_FIELD旗標不存在,請將此屬性設定為 FALSE

 

如果 DirectShow 範例不包含範例旗標,請使用VIDEOINFOHEADER2結構中的dwInterlaceFlags值:

DirectShow 交錯旗標 Media Foundation 範例屬性
AMINTERLACE_IsInterlaced = MFSampleExtension_InterlacedTRUE
AMINTERLACE_1FieldPerSample MFSampleExtension_SingleField = TRUE
AMINTERLACE_Field1First = MFSampleExtension_BottomFieldFirstFALSE

 

視訊媒體類型

媒體類型