共用方式為


在 DirectShow 中使用視窗媒體編解碼器

Windows Media 音訊和視訊編碼器及解碼器物件最初被設計並優化,以搭配 ASF 檔案容器格式及 Windows Media Format 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 數據流標頭中 的 nAvgBytesPerSec 值,為每個樣本組 (每個音訊畫面)製造時間戳。

此計算的基礎假設是數據流中的所有音訊樣本都相等持續時間;不過,DMO 輸出的範例持續時間不相等,因此 AVI 分割器所套用的時間戳不正確。 因此,若不需修改 AVI 分割器或音訊譯碼器 DMO,就不可能使用任何 DirectShow 型應用程式,以同步處理音訊和視訊串流播放 AVI 檔案。在某些情況下,Windows 媒體音訊 9 語音編解碼器會運作,但即使是在任何搜尋作業之後,這也會遺失同步處理,因此它實際上無法視為可行的解決方案。

如果您有 MP3 編碼器,您可以使用 WMV 和 MP3 為音訊串流建立 AVI 檔案。 這類檔案將會在 Windows Media Player 和其他 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 介面。

與編解碼器 DMO 協作