Microsoft Media Foundation (交錯視訊編碼)

用於電腦的視訊資料通常是 漸進式的,這表示每個畫面都會編碼為單一影像。 某些裝置,例如電視,不會一次顯示一個畫面,而是以兩個影像顯示。 其中一個影像或欄位包含所有偶數列。 另一個欄位包含所有奇數列的資料。 每個畫面使用一個以上的欄位編碼的視訊稱為交錯,因為它會透過在偶數位段與奇數位段之間切換來轉譯。

在過去,交錯的視訊內容一律會在使用 Windows 媒體視訊編解碼器進行編碼之前取消交錯。 不過,從 Windows Media 9 系列開始,視訊編碼器支援壓縮交錯內容,而不需要先將其轉換成漸進式。 如果內容在交錯顯示器上轉譯,例如電視,在編碼檔案中維護交錯式檔案很重要。 這項功能的重要性愈高,因為 Windows 媒體型內容會散佈至 DVD 播放機、設定頂端方塊和其他家用電子裝置。

編碼和傳遞交錯視訊最簡單的方式是使用 Windows 媒體格式 SDK 開發應用程式,並將內容儲存在 ASF 檔案中。 框架的交錯資訊會使用適用于 ASF 內容的資料單位延伸模組傳遞至編解碼器,但在其他容器中支援有點棘手。 如需資料單位延伸模組的詳細資訊,請參閱 使用資料單位延伸模組

為了支援交錯編碼,需要兩個主要步驟:將框架資訊提供給編碼器,並將資訊傳遞至轉譯應用程式。 下列步驟會在下列段落中說明。

交錯視訊和編碼器

使用維護交錯編碼視訊的第一個步驟是設定編碼器來編碼交錯欄位。 若要這樣做,請將 MFPKEY_INTERLACEDCODINGENABLED 屬性設定為 TRUE。 這會準備編碼器以接收交錯的樣本。 每個輸入範例都必須包含這兩個欄位。

啟用交錯編碼之後,您使用編碼器處理的每個範例都應該附加資料單位延伸模組。 假設沒有預期的資料單位延伸模組的範例為漸進式。 識別延伸模組的 GUID 是 D590DC20-07BC-436C-9CF7-F3BBFBF1A4DC。 下表定義 Windows Media Format SDK 物件所傳遞的值。

Description
0x00000020 指定範例會先以底部欄位編碼。 只有在與交錯值結合時,這個值才有意義。
0x00000040 指定範例會先使用頂端欄位進行編碼。 只有在與交錯值結合時,這個值才有意義。
0x00000080 指定範例交錯。 這是對編解碼器 DMO 有意義的唯一值。

 

前兩個值的其中一個一律會與0x80搭配使用位 OR ,再于範例上設定。 不過,編碼器只會檢查0x80,並忽略延伸模組的其餘部分。 如果延伸模組將樣本識別為交錯,編碼器會維護壓縮資料流程中的範例交錯,並在資料流程中內嵌指示旗標,讓解碼器可以識別交錯的畫面格。 每個交錯樣本都會標示,讓混合漸進式和交錯式的來源內容可以一起編碼成資料流程。

Windows Media Format SDK 寫入器物件包含其寫入 ASF 容器之資料區段的範例中,用於轉譯時使用的內容類型資料單位延伸。

讀取和轉譯交錯視訊

解碼器會根據編碼器在資料流程中設定的旗標來識別交錯的樣本。 依預設,解碼器會解譯樣本並傳遞漸進式輸出。 播放程式應用程式可以設定解碼器,藉由設定 MFPKEY_DECODER_DEINTERLACING 屬性,來處理與交錯維護的輸出。

解碼器提供範例之後,就會發生交錯視訊播放的困難。 轉譯器 (裝置中的視訊卡或晶片) 無法正確顯示視訊內容,而不知道哪一個欄位是哪一個欄位。 在使用 Windows 媒體格式 SDK 的應用程式中,內容類型資料單元延伸模組是從未壓縮的範例擷取,而且可以傳遞至裝置。

直接使用編解碼器物件時,不會自動進行此資料傳輸。 您必須在緩衝區物件和用於編碼內容的容器中實作資料單位延伸模組支援。 最常見的媒體容器類型 (,例如 AVI) 不支援範例層級中繼資料。 您可以實作自己的系統,將資料儲存在檔案中,並將其與個別範例產生關聯,但只有自訂讀取器才能擷取資料。

注意

MFPKEY_INTERLACEDCODINGENABLED 屬性設定為 TRUE,然後未傳送任何附加內容類型資料類型資料單元延伸模組的範例,可能會導致編碼器當機。 只有在您有交錯式樣本要傳遞時,才設定交錯編碼的編碼器。

 

使用影片