視訊交錯
本主題描述媒體來源和解碼器如何處理交錯的視訊內容。
若要正確解碼和轉譯交錯視訊,需要下列資訊:
漸進式或交錯。 視訊資料流程可以包含漸進式畫面、交錯式畫面,或混合兩者。
欄位支配。 欄位支配描述哪些欄位會先出現、上方欄位或下層欄位。
重複第一個欄位。 此旗標用於 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 介面來取得或設定這些屬性。
本節所列的所有交錯屬性都有布林值。 實際上,這些屬性可以有三個值: TRUE、 FALSE或未設定。 如果未設定屬性,此值會取自媒體類型。 如果已設定屬性,則值會覆寫媒體類型。 旗標和媒體類型的某些組合無效。
屬性 | Description |
---|---|
MFSampleExtension_Interlaced | 如果 為 TRUE,框架會交錯。 如果 為 FALSE,則框架為漸進式。 如果媒體類型MFVideoInterlace_MixedInterlaceOrProgressive,請在每個範例上設定此屬性。 |
MFSampleExtension_BottomFieldFirst | 此旗標的意義取決於樣本是否包含交錯的欄位或單一欄位。
|
MFSampleExtension_RepeatFirstField | 如果 為 TRUE,則會重複第一個欄位。 如果未設定 FALSE ,則不會重複第一個欄位。 |
MFSampleExtension_SingleField | 如果 為 TRUE,則範例包含單一欄位。 如果 為 FALSE,則範例包含交錯的欄位。 |
下表顯示根據媒體類型,需要、選擇性或禁止的旗標。
媒體類型 | 交錯旗標 | BottomFieldFirst 旗標 | RepeatFirstField 旗標 | SingleField 旗標 |
---|---|---|---|---|
漸進式 | 選;如果設定,則必須為 FALSE。 | 請勿設定。 | 請勿設定。 | 請勿設定。 |
交錯欄位 | 選;如果設定,則必須為 TRUE。 | 選;如果已設定,則必須符合媒體類型。 | 請勿設定。 | 選;如果設定,則必須為 FALSE。 |
單一欄位 | 選;如果設定,則必須為 TRUE。 | 必要。 | 請勿設定。 | 設定為 TRUE。 |
Mixed | 必要。 | 必要。 | 必要。 | 選;如果設定,則必須為 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假 |
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。 |
相關主題