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