在 DirectShow 中使用視窗媒體編解碼器
Windows 媒體音訊和視訊編碼器和解碼器物件原本是設計並優化,以使用 ASF 檔案容器格式和 Windows 媒體格式 SDK。 編解碼器物件在特定案例的 DirectShow 中運作良好,也就是視訊串流的一次性 CBR 和品質型 VBR 編碼。 但是,如果您考慮直接在 DirectShow 中使用 ASF 以外的檔案容器來使用編解碼器物件,則事先應該注意的某些行為和問題。
注意
如果您要搭配 DirectShow 使用獨立編解碼器,您可能只想要將它們當做 DMO 使用。 換句話說,您將使用 IMediaObject 介面,而不是 IMFTransform。
AVI 檔案中的 WM 音訊
您可以使用 DirectShow 將 WMA 資料流程編碼為具有多工器篩選準則的任何檔案容器格式。 不過,Windows 媒體音訊和視訊編解碼器介面不支援 AVI 檔案中的 WMA,因為無法使用預設 DirectShow AVI 播放篩選器來維護 AVI 檔案中的音訊視訊同步處理與 WMA 資料流程。 如需詳細資訊,請參閱 將壓縮媒體儲存在 AVI 檔案中。
音訊編碼器 DMO 會輸出不同持續時間的樣本,即使處於「固定位元速率」模式也一樣。 因此,它最適合使用時間戳的檔案容器格式。 AVI 檔案不會為每個音訊範例或範例群組提供時間戳記。 在 DirectShow 中,AVI 分割器篩選會根據 AVI 串流標頭中于其中之「TBATEX」結構中的nAvgBytesPerSec值,針對每個音訊) 框架 (每個樣本群組製造時間戳記。
此計算的基礎假設是資料流程中的所有音訊樣本都相等持續時間;不過,DMO 所輸出的樣本不相等持續時間,因此 AVI 分割器所套用的時間戳記並不精確。 因此,若不需修改 AVI 分割器或音訊解碼器 DMO,就無法使用任何 DirectShow 型應用程式,以同步處理音訊和視訊串流播放 AVI 檔案。在某些情況下,Windows 媒體音訊 9 語音編解碼器將可運作,但即使在任何搜尋作業之後也會失去同步處理,因此實際上無法視為可行的解決方案。
如果您有 MP3 編碼器,您可以使用 WMV 和 MP3 為音訊串流建立 AVI 檔案。 這類檔案會在Windows 媒體播放機和其他 DirectShow 型應用程式中正確播放和搜尋,因為 AVI 分割器包含 MP3 資料流程的特殊處理常式代碼。 另一個選項是使用未壓縮的 PCM 音訊,雖然產生的檔案大小明顯大於壓縮的音訊資料流程。 由於 DirectShow 範例應用程式會建立 AVI 檔案,因此不會示範如何使用音訊編碼器 DMO。
單次編碼
視訊編碼器 DMO 可在 DirectShow 中輕鬆地使用兩種編碼模式:CBR 和以品質為基礎的 VBR。 只要您在建置篩選圖形時遵循正確的作業順序,如範例應用程式中所示,使用 AVI 多工器和檔案寫入器將 WMV 內容放入 AVI 檔案相當簡單。
雙傳遞編碼
兩次編碼模式需要更複雜的方法來建置和串流圖形,以防止 DMO 從第一個階段排清其內容,再開始第二次傳遞。 在雙階段編碼中,必須執行圖表一次,讓 DMO 可以執行檔案資料的前置處理分析,然後再次復原圖形並再次執行,讓 DMO 可以執行實際的編碼。
當圖形進入第二次傳遞的執行狀態時,DMO 包裝函式會在第一個範例上設定 DISCONTINUITY 旗標,因為時間戳記不會與第一次傳遞的最後一個時間戳記循序。 當 DMO 不是設計成以這種方式在 DirectShow 中運作時,會收到 DISCONTINUITY 旗標,它會執行排清,並遺失從第一次傳遞儲存的資料。 若要解決此問題,最佳解決方案可能是撰寫自訂的 DMO 包裝函式篩選,在第一次通過之後搜尋圖形時不會設定 DISCONTINUITY 旗標。 此 SDK 中適用于 Windows (VfW 的影片) 範例示範如何執行雙階段編碼。
交錯內容
WMV 編碼器 DMO 能夠編碼交錯內容,同時保留交錯,這適用于從電視擷取的內容,也可能在電視上播放。 不過,無法使用預設的 DMO 包裝函式來保留交錯,因為該篩選不支援輸入樣本上的 INSSBuffer 。
DMO 會使用該介面來取得所接收每個樣本的交錯設定。 如果找不到介面,如同 DMO 包裝函式的情況,DMO 只會將輸入樣本視為非交錯。 若要在 DirectShow 中執行交錯編碼,有數個替代方案。 最簡單的方法是直接使用 Windows 媒體格式 9 系列 SDK,或使用 WM ASF 寫入器 DirectShow 篩選來建立交錯的 ASF 檔案。 然後,您可以將該檔案轉碼成一些其他格式。 如果您轉碼為 AVI,您將會有交錯檔案,但標準 DirectShow AVI 播放篩選器無法辨識它,因為它們不支援 VIDEOINFOHEADER2。 另一種方法是撰寫您自己的 DMO 包裝函式篩選,以支援 INSSBuffer 介面。
相關主題