劉蒙
FFmpeg以其豐富的編解碼庫和強大的解碼能力著稱,DES(DirectShow Editing Service)是非常方便的基于DirectShow的非線性視頻編輯接口。然而由于DES技術在解碼方面的局限性,實際應用中很少使用它。本文提出一種基于DirectShow Filter開發技術封裝FFmpeg解碼庫的技術,實現了結合DES技術剪輯視頻的視頻處理系統,即彌補了DES解碼方面的缺陷,又能體現DES技術便于開發、使用簡單的特性。
【關鍵詞】FFmpeg DES DirectShow Filter
1 相關背景
視頻技術的發展、視頻壓縮標準的推陳出新以及應用在多種場景中的視頻顯示的大量要求,視頻解碼技術的研究隨之不斷深入。一方面,實際應用中需要根據需求選取最適合的解碼方法;一方面,視頻剪輯技術在各種體育項目中的應用也愈加的普遍,這種技術一般具有一定的解碼局限性,需要與具體的解碼器適配。
目前幾乎所有的主流多媒體播放器都是基于開源多媒體框架ffmpeg來做的,FFmpeg幾乎覆蓋全部視頻格式。DirectShow開發框架是微軟公司提供的針對流媒體控制的解決方案,它總體的應用框架和底層工作由DirectShow來完成,為用戶自定義的解決方案提供了底層流控制框架,從而使用戶可以自行創建支持新的文件格式或其它用途的DirectShow組件。
DES非線性視頻剪輯技術是基于DirectShow開發框架的一個核心編程框架的接口,使得音視頻的編輯工作更加方便、快捷,大大提高了開發效率。但是DES視頻剪輯技術在視頻解碼方面存在缺陷,一些特殊編碼格式的視頻由于不能采用此技術播放而無法剪輯。本文介紹的基于FFmpeg的DES視頻剪輯系統很好的處理了這一問題。
2 基于FFmpeg的DirectShow Filter解碼器實現
FFmpeg視頻解碼內核是通過封裝FFmpeg中的解碼功能為解碼Filter而實現的。設計一個H.264視頻解碼器就是設計一個能實現H.264視頻解碼功能的DirectShow Filter。從Filter Graph的設計和功能定義上分析,H.264 解碼Filter是一種Transform Filter,有一個輸入Pin和一個輸出Pin。
綜合考慮各種因素,決定采用CSource作為Filter基類,因為CSource的輸出Pin是從CSourceStream派生的,CSourceStream已經實現了一個縣城,在這個線程中可以控制整個編碼過程。Filters框架類的編程關系如圖1所示。
基類選好后接著就是應用控制類的實現,設計一個控制類實現系統初始化、反初始化、調用解碼算法解碼、解碼輸出等函數。
H.264解碼Filter的功能主要在于控制模塊、輸入輸出Pin的處理、視頻算法處理、過濾器處理和過濾器的注冊等幾部分構成。創建一個CH264MengInputPin類重寫幾個重要的基類函數:Receive、BeginFlush、NewSegment和CheckMediaType等。設計一個用作處理H.264視頻的CMengH264Filter類,它主要實現的基類函數有FindPin、Stop、GetPinCount、GetPin和Pause等,其中還實現了輸入輸出Pin委托的功能。
H.264標準解碼Filter結構如圖2所示。
3 DES結合FFmpeg實現視頻剪輯系統
本文所述的視頻剪輯系統的實現首先需要建立DES時間線模型,然后針對視頻剪輯需要事先查看的要求(這里就用到了前文所訴的解碼Filter),實現剪輯視頻預覽的功能,最后在建立文件保存剪輯好的視頻文件。
3.1 DirectShow Editing Service時間線的構建
構建時間線模型需要調用系統提供的一個虛接口(沒有具體的實現,只提供函數名稱表示,供應用層調用)即時間線接口IAMTimeline,遵循時間線的結構模型,定義實際所需的屬性和函數,并且創建出時間線對象。其中主要屬性包括組(Group)、集合(Composition)、軌道(Track)和媒體源(Source)。
根據接口提供的方法創建時間線對象時間線框架,根據實際需要在“樹形”時間線結構的框架上填充“枝葉”。“枝葉”便是DES對象,需要使用虛接口中的方法CreateEmptyNode來定義,包括:IAMTimelineGroup、IAMTimelineComp、IAMTimelineTrack、 IAMTimelineSrc。其中每個對象都需要創建視頻和音頻兩種。下一步就是要在組中加入軌道,然后實現視頻剪切過程。設置媒體源的剪切時間和其在時間線上的時間,將其放到相應的軌道上。
3.2 DirectShow Editing Service預覽功能的實現
實現視頻剪輯的預覽功能需要在創建好時間線模型后創建基本渲染引擎IRenderEngine,它能通過已經建立好的時間線構建Filter Graph供預覽或者輸出文件。需把時間線的信息傳遞給IRenderEngine。接下來使用ConnectFrontEnd函數,連接時間線模型建立時建立的濾波器(Filter),調用RenderOutputPins完成濾波器圖的構建。最后調用IMediaControl接口的Run()函數就可以進行實現預覽的功能。
3.3 DirectShow Editing Service保存功能實現
視頻剪輯功能完成之后,最后就是要實現保存的功能。由于之前時間線模型的創建完成以后上一級的數據流輸出是非壓縮的音頻流和視頻流,然而根據實際需要,保存在存儲介質上的視頻數據必須是壓縮以后的數據。所以必須向濾波器圖中加入音頻編碼器和視頻編碼器以及復用器。
首先將視頻編碼器、音頻編碼器和復用器以及文件寫入程序濾波器加入到濾波器圖中,然后得到組的個數及輸出引腳指針,根據引腳的媒體類型將其連接到相應的編碼器上,接著將視頻編碼器和音頻編碼器濾波器連接到復用器濾波器上,下一步連接復用器和文件寫入程序濾波器, 最終的視頻保存和預覽功能一樣,調用DirectShow提供的IMediaControl接口的Run()函數。
4 結束語
結合DES非線性編輯技術的視頻處理分析系統的項目實現了針對MTS格式視頻文件剪輯處理的便捷開發。系統支持快放慢放、多剪輯插播、過渡效果和剪輯效果預覽功能。此系統擴展性強,可以適配多種Filter解碼器進行相應的視頻剪輯。
參考文獻
[1]李閃閃,王洪玉.H.264視頻解碼過濾器的設計與實現[C].2010年通信理論與信號處理學術年會論文集,2010,08-20.
[2]郭映月,黃焱.基于DirectShow/DES的MPEG-2音視頻編輯軟件的實現方案[J].廣播與電視技術,2006,09-30.
[3]王彤,殷福亮.基于FFmpeg的H.264解碼器實現[D].沈陽:大連理工大學(碩士論文),2011-11-09.
[4]譚毅,黃歡,劉輝.基于DirectShow的視頻壓縮系統的設計與實現[J].計算機與數字工程,2006,06-20.
[5]于洋,宿富林.基于DirectShow的多線程AVS轉碼器的研究與實現[D].哈爾濱:哈爾濱工業大學(碩士論文),2009,06-01.
作者單位
中國海洋大學信息科學與工程學院 山東省青島市 266100