摘 要:MPEG-2是目前應用最為廣泛的數字音視頻編碼國際標準,大部分數字音視頻節目是以MPEG-2的形式存在。DirectShow是目前windows操作系統上的優秀的多媒體開發編程接口。提出一個MPEG-2視頻解碼器在DirectShow中的實現方案。這一實現在多媒體應用中具有廣泛的參考價值。
關鍵詞:DirectShow;filter;MPEG-2;解碼器
中圖分類號:TP316.5 文獻標識碼:A
1 引言
微軟公司提供的DirectX是用于創建PC游戲和多媒體應用程序的優秀工具。DirectX是一個用于開發游戲以及其它各類多媒體應用程序的底層API函數集,可以用來在windows操作平臺上開發高性能圖形、聲音、輸入、輸出和網絡游戲;它是一種基于COM的系統,既不屬于驅動程序層,也不屬于應用程序層。DirectX的主要設計目標是在提供某種設備獨立性的同時獲取高速度。作為Di-rectX的一個COM組成元素,DirectShow應用程序編程接口是一個windows平臺上的流媒體架構,提供各種格式的高品質多媒體流的捕獲、處理、傳送和回放,如AVI,ASF,MPEG,MP3,MOV等。DirectShow集成了DirectX其他組件中的先進技術,能做到自動檢測、使用視頻和音頻硬件加速設備;它不僅支持基于WDM驅動程序的硬件設備,也向上兼容Video for WindOWS(VFW)驅動程序的硬件設備。

MPEG-2是MPEG專家組于1994年公布的視、音頻壓縮和傳送標準。該標準分成9個部分,分別是系統、視頻、音頻、一致性測試、參考軟件、數字存儲媒介命令和控制(DSM-CC:DigitalStoraRe Media Command and Contr01)、高級音頻編碼(ACC:Advanced Audio Coding)、實時接口(RTI:Real-Time Interface)和DSM-CC的一致性測試。其中系統部分規定了如何把壓縮的視頻、音頻及其它數據流復用成一個統一的數據流,以便于傳送。視頻部分和音頻部分分別規定了壓縮的視頻、音頻數據流格式及其解碼含義,即標準的解碼器。MPEG-2沒有規定標準的解碼器,只是規定了編碼器產生的數據流格式。這樣做的目的是在保證互連的同時,允許開發者有一定的開發自由度,以鼓勵競爭。微軟公司推出的DirectShow僅提供了MPEG-2 Splitter,用于將MPEG流的音頻、視頻分離,但是沒有提供MPEG-2的視頻解碼器,用于解碼MPEG-2格式的壓縮視頻。由于目前MPEG-2壓縮標準在多媒體領域得到了廣泛的應用,大部分數字音視頻節目是以MPEG-2的形式存在。因此,本文研究如何在Direct-Show環境中實現MPEG-2視頻解碼器。
2 DirectShow Filter組件技術
DirectShow在系統中所處的層次及其內部數據處理流程如圖1所示。圖中央即是DirectShow系統,下半部分是Ring 0特權級別的硬件設備,上半部分是Ring 3特權級別的應用層。DirectShow系統位于應用層中。它使用Filter Graph來管理整個數據流的處理過程;參與數據處理的各個功能模塊叫做過濾器(Filter);各個Filter在Filter Graph中按一定的順序連接成一條流水線協同工作。
過濾器(Filter)是參與數據處理的各個功能模塊,并配置在過濾器圖表中,過濾器圖表管理器組件負責檢查這些過濾器的連接和控制過濾器間的數據流動。從功能上來看,Filter分為3類:SourceFilters、Transform Filters和Rendering Filters。Source Filters主要負責獲取數據,數據源可以是文件、因特網、計算機中的采集卡(WDM驅動或VFW驅動)和攝像頭、數字攝像機等,然后將數據往下傳輸;Transform Filters主要負責數據的格式轉換,例如數據流分離/合成,編碼/解碼等,然后將數據繼續往下傳輸;Rendering Filters主要負責數據的最終去向一將數據送給顯卡、聲卡進行多媒體的顯示,或者輸出到文件進行存儲等。
3 MPEG-2視頻解碼器的設計
在DirectShow環境中播放一個MPEG-2格式的文件,需要一個MPEG-2 Splitter將MPEG流的音視頻分離;一個MPEG2的視頻解碼器,用于解碼MPEG-2格式的壓縮視頻;一個相關的音頻解碼器如ffdshow audio Decoder,用于解碼音頻。在DirectShow提供了MPEG-2 Splitter,而MPEG-2視頻解碼器需要自行開發。

為了實現MPEG-2視頻解碼器,可設計一個名為MPEG2 Decoder的Transform Filter,包含一個輸入pin、一個輸出pin,用于接收MPEG-2的視頻流輸入,解碼后輸出YUY2格式的圖像幀序列。在微軟提供的Filter測試工具GraphEdit中使用MPEG-2視頻解碼器構建的Filter Graph如圖2所示:
圖中xyys.vob文件為一個MPEG-2壓縮的文件,其輸出的數據流被MPEG-2 Splitter接收,并實現音視頻分離;視頻流由MPEG2 Decoder實現MPEG-2的視頻解碼,并送顯示,音頻流由ffdshow audio Decoder實現解碼并送播放。
4 MPEG一2視頻解碼器的實現
4.1 filter的設計
設計一個MPEG-2視頻解碼器實際上就是在DirectShow中設計出一個能實現MPEG-2視頻解碼功能的filter,即圖2中的MPEG2 Decoderfilter。
從Filter Graph的設計和功能定義上分析,MPEG2 Decoder filter是一個Transform filter。有一個輸入pin(input)和一個輸出pin(output)。由于Transform Filter是DirectShow中的一個應用框架,實現“輸入->內部處理->輸出”的功能;其中應用邏輯,即MPEG-2的視頻解碼部分可以與應用框架分離,以設計一個結構清晰、擴展性良好的Filter項目。
Filter框架是完成Filter功能的一個操作函數集,以完成輸入和輸出pin上的媒體類型檢查,決定Sample內存大小的相關功能。數據的輸入和處理完成后的輸出由Filter框架實現,而實現MPEG一2的解壓縮由應用邏輯實現。
4.2 filter的編碼實現
4.2.1 Filter框架的實現
從DirectShow的基類CSource類繼承得到filter,以實現一個獨立的線程專門用于MPEG2的解碼輸出。同時可設計輸入pin類(CMpeg2InputPin)和輸出pin類(CMpeg20utPin)。在輸入pin上需要實現媒體類型檢查(CheekMediaType)、媒體數據的接收(Re-ceive)等相關功能。以媒體類型的檢查為例:


4.2.2 MPEG-2解碼的實現
MPEG-2源代碼可以從開源網站下載(如:MPEG的官方網站,www.mpeg.org),下載后得到的MPEG2解碼內核是C代碼,而Filter的開發采用C++,為了高效實現C與C++的混合編程,可設計一個C++風格的應用程序控制類CM-pegDecode,將解碼內核上可能被調用的C函數在這個類中封裝。Filter框架就只需調用這個控制類,從而保持較為清晰的結構。
5 結論
MPEG壓縮一直是多媒體應用領域中的熱點研究問題,微軟公司推出的DirectShow應用程序編程接口是一個基于windows平臺的優秀流媒體架構。本文設計了一個實現MPEG-2解壓縮的Transform filter,并在GraphEdit中得到了實現。同理還可以在DirectShow中實現其它解碼器。這一實現在多媒體應用中具有廣泛的參考價值。