專利名稱:一種從多媒體中抽取音視頻的方法
技術(shù)領(lǐng)域:
本發(fā)明涉及音視頻處理領(lǐng)域,尤其是涉及一種從多媒體中抽取音視頻的方法。
背景技術(shù):
多媒體項(xiàng)目中,往往需要采用特定格式的音頻、視頻數(shù)據(jù)進(jìn)行傳輸,而數(shù)據(jù)來源不一,有的是各種格式的媒體文件(flv\rmvb\avi\mp4等等),有的是網(wǎng)絡(luò)的媒體流(mms等),如果針對每種不同具體源,都進(jìn)行鏈路處理,則非常繁瑣而且不具有通用性。媒體源主要有文件類型和網(wǎng)絡(luò)數(shù)據(jù)流類型兩種,我們常見的文件類型有AVI、RMVB, MOV、FLV, MP4等等,每一種文件類型對應(yīng)著不同的媒體容器,它將各種不同編碼的音視頻數(shù)據(jù)進(jìn)行組織,并按照特定格式封裝。常見的網(wǎng)絡(luò)數(shù)據(jù)流類型有微軟的MMS和RTSP等,它也具有特定的數(shù)據(jù)格式。面對各種各樣的媒體,要想把它包含的音視頻數(shù)據(jù)抽取出來,最簡單的方式就是直接讀取。按照不同容器格式,編寫對應(yīng)的程序,將文件讀取,并進(jìn)行二進(jìn)制的解析,分離等工作,最后將音視頻數(shù)據(jù)輸出。為了簡化一些操作,開源界有一些工具包,簡化了操作,比如FFMPEG,功能強(qiáng)大,能夠?qū)Σ煌袷降奈募兔襟w流進(jìn)行轉(zhuǎn)換,它的內(nèi)部包含了原始格式文件讀寫的實(shí)現(xiàn),使得開發(fā)人員從繁重的工作中擺脫了出來。但是它側(cè)重于文件轉(zhuǎn)換,而且不夠智能,需要人工來識(shí)別文件類型,并需要指定解碼器以及復(fù)雜的參數(shù)才能進(jìn)行處理,也就是說,還需要每種媒體類型都使用不同參數(shù)。微軟提出了一個(gè)DerectShow架構(gòu),將每一種媒體(文件和網(wǎng)絡(luò)流)都抽象成一個(gè)數(shù)據(jù)源過濾器(Filter),將它們之間的共性提取出來,屏蔽掉底層的差異,使用鏈路的方式構(gòu)建一個(gè)過濾器圖表(Filter Graph),當(dāng)圖表建立完成,即可進(jìn)行播放。無需知道具體是何種格式,也無需指定文件打開的參數(shù),就可以進(jìn)行自動(dòng)匹配。微軟的媒體播放器就是在這個(gè)技術(shù)之上實(shí)現(xiàn)的成功案例。建立圖表有兩種方法,一種是手工建立,需要建立每一級(jí)的過濾器,手工連接,這個(gè)操作比較復(fù)雜,同時(shí)不具有通用性,換了一臺(tái)機(jī)器可能就連接失敗。另外還有智能連接技術(shù),每一種媒體都能自動(dòng)匹配到最佳鏈路,但是不能精確控制連接的過程。對于播放器的應(yīng)用來說,智能連接的方法已經(jīng)足夠完善,因?yàn)樗詣?dòng)構(gòu)建了文件讀取、分離、解碼、播放的全部過濾器。但是對于抽取媒體數(shù)據(jù)的應(yīng)用,這個(gè)就實(shí)現(xiàn)不了,傳統(tǒng)的方法是采用手工構(gòu)建的方式,如暴風(fēng)影音的媒體鏈路技術(shù),就是這樣一種方式,將每種媒體格式都做一個(gè)或者多個(gè)最佳鏈路的配置,好處是能夠快速搭建鏈路、精確控制播放效果。但是太復(fù)雜,暴風(fēng)自己公布的鏈路就有幾百條,普通應(yīng)用要維護(hù)、管理這些鏈路是困難的事情。從上面的闡述可以看出,手工處理所有媒體格式的方式最原始,工作量巨大,實(shí) 在不可取。使用FFMPEG進(jìn)行轉(zhuǎn)換,參數(shù)設(shè)置麻煩,每種格式都要不同的參數(shù)進(jìn)行指定,所以在抽取媒體數(shù)據(jù)的應(yīng)用場合中,具有較大局限性。使用DirectShow手工構(gòu)建鏈路,工作量也較大,同時(shí)每種格式都要不同的配置進(jìn)行構(gòu)建。使用智能連接的方式,因?yàn)閺?qiáng)調(diào)的是全自動(dòng),所以手工控制方面很弱,只能播放文件,不能抽取數(shù)據(jù)。
發(fā)明內(nèi)容
本發(fā)明主要是解決現(xiàn)有技術(shù)所存在的手工構(gòu)建鏈路抽取音視頻數(shù)據(jù)工作量大、速度慢、通用性差, 難以獲得需要的數(shù)據(jù)的技術(shù)問題,提供一種可以自動(dòng)構(gòu)建鏈路且具有較好通用性的從多媒體中抽取音視頻的方法。本發(fā)明針對上述技術(shù)問題主要是通過下述技術(shù)方案得以解決的一種從多媒體中抽取音視頻的方法,包括以下步驟
步驟一、構(gòu)建完整的媒體渲染鏈路;
步驟二、通過搜索鏈路的方式,找到最末端的渲染器,然后找到對應(yīng)的引腳,調(diào)用UnConnent方式,將渲染器手動(dòng)斷開;
步驟三、將自定義的若干個(gè)過濾器插入鏈路的斷開處,調(diào)用Connent方式將斷開的渲染器重新連接;
步驟四、通過插入的過濾器抽取音視頻數(shù)據(jù);
步驟五、將抽取出來的數(shù)據(jù)進(jìn)行分流,變作多路輸出,然后針對每一路的數(shù)據(jù),采用不同的編碼參數(shù)進(jìn)行處理;
步驟六、將處理后的數(shù)據(jù)交給應(yīng)用層。DirectShow是微軟的多媒體框架庫,提供了眾多的函數(shù)方法,Windows系統(tǒng)都支持。過濾器圖表Filter Graph是微軟DirectShow庫中的組件,用于管理過濾器組件,其中包含Render、Run等接口,用于操作過濾器。過濾器Filter是微軟DirectShow庫中的組件,將它放于圖表管理器中,并連接正確,才能發(fā)揮作用。過濾器的引腳Pin是過濾器的附屬組件,用于過濾器的手動(dòng)連接操作,提供了Connent、UnConnent 等接口。作為優(yōu)選,步驟一中,構(gòu)建媒體渲染鏈路具體為使用DirectShow智能連接方式,調(diào)用圖表管理器的Render方法,得到完整的鏈路圖表。作為優(yōu)選,步驟三中,插入的過濾器包括篩選器。本方案采用DerectShow媒體框架,采用智能渲染,動(dòng)態(tài)插入技術(shù)來實(shí)現(xiàn),能夠?qū)Ω鞣N媒體文件、MMS網(wǎng)絡(luò)流自適應(yīng)。DerectShow的圖表管理器(Graph),提供了 Render方法,能夠自動(dòng)對文件、網(wǎng)絡(luò)流進(jìn)行自動(dòng)的配置,將各個(gè)過濾器(Filter)串聯(lián)在一起,構(gòu)成完整的播放鏈路。手動(dòng)構(gòu)建的時(shí)候,可以先遍歷過濾器的引腳(Pin),然后使用引腳的的Connect、UnConnect方法,將不同的過濾器連接在一起,這是手動(dòng)的方法。注意最末端的是渲染器,它的功能是調(diào)用聲卡的顯卡的底層接口,播放最終的RGB、YUV視頻或者PCM格式的音頻數(shù)據(jù)。本發(fā)明綜合背景技術(shù)中各種方案的優(yōu)點(diǎn),實(shí)現(xiàn)用自動(dòng)匹配的方式,無需指定參數(shù),就能夠抽取音視頻數(shù)據(jù)。本發(fā)明的優(yōu)點(diǎn)是能夠支持廣泛的媒體格式,并且克服了現(xiàn)有方案的復(fù)雜性的問題,能夠以不變應(yīng)萬變的方式,簡便有效進(jìn)行數(shù)據(jù)的抽取。對新的格式也能夠很好的支持,具有可擴(kuò)充性。 同時(shí)該方案的思路還可以推廣到其它應(yīng)用場合,比如電影截圖、虛擬視頻、虛擬音頻、視頻美化特效等等。
圖I是本發(fā)明的一種流程 圖2是本發(fā)明的一種自動(dòng)構(gòu)建得到的播放用鏈路 圖3是圖2插入篩選器后的鏈路圖。圖中1、源過濾器,2、前置過濾器,3、音視頻分離器,4、音頻解碼器,5、音頻過濾器,6、音頻渲染器,7、視頻解碼器,8、視頻過濾器,9、視頻渲染器,10、音頻篩選器,11、視頻篩選器。
具體實(shí)施例方式下面通過實(shí)施例,并結(jié)合附圖,對本發(fā)明的技術(shù)方案作進(jìn)一步具體的說明。實(shí)施例本實(shí)施例的一種從多媒體中抽取音視頻數(shù)據(jù)的方法,如圖I所示,具體如下
I.構(gòu)建完整的媒體渲染鏈路只要該文件能正常播放,就可以使用DerectShow智能連接的方式,調(diào)用圖表管理器的Render方法,直接得到完整的鏈路圖表(見圖2),多媒體數(shù)據(jù)依次經(jīng)過源過濾器I、前置過濾器2后被音視頻分離器3分離為音頻信號(hào)和視頻信號(hào),音頻信號(hào)進(jìn)入音頻解碼器4解碼后經(jīng)過音頻過濾器5過濾接著進(jìn)入音頻渲染器6渲染播放,視頻信號(hào)進(jìn)入視頻解碼器7解碼后經(jīng)過視頻過濾器8過濾接著進(jìn)入視頻渲染器9渲染播放,前置過濾器2、音頻過濾器5和視頻過濾器8都為過濾器的集合而不僅僅只包含一個(gè)過濾器,各種媒體文件和網(wǎng)絡(luò)媒體都能夠得到支持。2.動(dòng)態(tài)插入技術(shù)這一步是關(guān)鍵,通過搜索鏈路的方式,找到最末端的渲染器,然后找到對應(yīng)的引腳(Pin),調(diào)用UnConnect方法,將渲染器手動(dòng)斷開,將自定義的多個(gè)過濾器(包含篩選器)插入中間,然后再調(diào)用Connect方法,將斷開的渲染器重新接起來,這時(shí)候就恢復(fù)了完整的鏈路(見圖3),具體包含兩個(gè)部分,一是將音頻過濾器5和音頻渲染器6之間的連接斷開,然后插入音頻篩選器10,接著將音頻過濾器5的輸出和音頻篩選器10的輸入連接,并將音頻篩選器10和音頻渲染器6連接;二是將視頻過濾器8和視頻渲染器9之間的連接斷開,然后插入視頻篩選器11,接著將視頻過濾器8的輸出和視頻篩選器11的輸入連接,并將視頻篩選器11和視頻渲染器9連接,視頻篩選器11和音頻篩選器10即為捕捉器,恢復(fù)之后文件仍然可以正常播放,但是播放的過程中,數(shù)據(jù)已經(jīng)被源源不斷的被中間插入的篩選器抽取出來。3.重編碼將抽取出來的數(shù)據(jù)進(jìn)行分流,變作多路輸出,然后針對每一路的數(shù)據(jù),采用不同的編碼參數(shù)進(jìn)行處理,最后交給應(yīng)用層。用偽代碼的形式說明如下
//初始化的處理
CComPtr< IGraphBuilder > m_pGB;
m—pGB. CoCreateInstance( CLSID—FilterGraph );m—pGB_>RenderFile (〃c:\\myfile. mp4〃,NULL) ; // 可以是任意格式文件
//
//執(zhí)行到這里,已經(jīng)構(gòu)造好完整播放鏈路,就可以調(diào)用nfediaC0ntr0l->Run()的方式,直接出現(xiàn)一個(gè)視頻播放窗口
//但是現(xiàn)在不是做播放器,所以創(chuàng)新了一下,繼續(xù)往下走
//
//加入過濾器ACMWrapper IBaseFilter ^pACMWrapper;
AddFilterByCLSID (m—pGB,CLSID_ACMWrapper, —T("ACMWrapper"),&pACMWrapper);//加入過濾器Converter
AddFilterByCLSID(m_pGB, CLSID_AVConverter, —T("Converter"), &pConverter);//加入篩選器CComPtr< ISampleGrabber > m—pAudioGrabber;m_pAudioGrabber. CoCreateInstance ( CLSID_SampIeGrabber );
CComQIPtr< IBaseFilterj &IID_IBaseFilter > pGrabBase ( m—pAudioGrabber );m—pGB_>AddFilter( pGrabBase, L〃audio Grabber");
//數(shù)據(jù)釆集的時(shí)候還出現(xiàn)視頻播放窗口是不合適的,所以這里用空的播放窗口代替,這樣就不彈出播放窗口
IBaseFilter ^pNullRender = NULL;
hr = AddFiIterByCLSID (m—pGB,CLSID—NulIRenderer,—T ("Nu11Render"),&pNullRender);
//
//動(dòng)態(tài)插入的過程
//將過濾器ACMWrapper替換掉原有的音頻Render,最后一個(gè)參數(shù)指定了音頻還是視頻,函數(shù)內(nèi)部對斷開做了處理
ReplaceRenderFilter(m—pGB, pACMWrapper, TRUE);
//pACMWrapper 連接 pConverter
ConnectFilters(m—pGB, pACMWrapper, pConverter);
//pConverter 連接 pGrabBase
ConnectFilters(m—pGB, pConverter, pGrabBase);
//pGrabBase 連接 pNulIRender
ConnectFilters(m—pGB, pGrabBase, pNullRender);
//鏈路構(gòu)造完畢,開始運(yùn)行鏈路了 CComQIPtr< IMediaControlj &IID_IMediaControl > pControl = m—pGB; hr = pControl->Run();
//后面的篩選器就源源不斷得到了音頻原始PCM數(shù)據(jù)
本實(shí)施例能夠以不變應(yīng)萬變的方式,處理大部分的媒體類型,對于快速開發(fā)特別有效,另外對于不支持的文件格式,還可以擴(kuò)充,在操作系統(tǒng)中,把對應(yīng)的源過濾器文件添加到Windows注冊表即可支持,原有程序代碼一行都不用修改。
同時(shí),本發(fā)明還提供了不同格式的數(shù)據(jù)輸出,比如從一個(gè)視頻文件中可以采用RGB格式抽取,也可以同時(shí)抽取YUV格式,多路輸出,非常的靈活。這是通過抽取數(shù)據(jù)后,內(nèi)部進(jìn)行色彩空間轉(zhuǎn)換實(shí)現(xiàn)的。本文中所描述的具體實(shí)施例僅僅是對本發(fā)明精神作舉例說明。本發(fā)明所屬技術(shù)領(lǐng)域的技術(shù)人員可以對所描述的具體實(shí)施例做各種各樣的修改或補(bǔ)充或采用類似的方式替代,但并不會(huì)偏離本發(fā)明的精神或者超越所附權(quán)利要求書所定義的范圍。盡管本文較多地使用了鏈路、渲染器、過濾器等術(shù)語,但并不排除使用其它術(shù)語的可能性。使用這些術(shù)語僅僅是為了更方便地描述和解釋本發(fā)明的本質(zhì);把它們解釋成任何一種附加的限制都是與本發(fā)明精神相違背的?!?br>
權(quán)利要求
1.一種從多媒體中抽取音視頻的方法,基于DirectShow架構(gòu),其特征在于,包括以下步驟 步驟一、在過濾器圖表中構(gòu)建完整的媒體渲染鏈路; 步驟二、通過搜索鏈路的方式,找到最末端的渲染器,然后找到對應(yīng)的引腳,調(diào)用UnConnent方式,將渲染器手動(dòng)斷開; 步驟三、將自定義的若干個(gè)過濾器插入鏈路的斷開處,調(diào)用Connent方式將斷開的渲染器重新連接; 步驟四、通過插入的過濾器抽取音視頻數(shù)據(jù),然后執(zhí)行過濾器圖表; 步驟五、將抽取出來的數(shù)據(jù)進(jìn)行分流,變作多路輸出,然后針對每一路的數(shù)據(jù),采用不同的編碼參數(shù)進(jìn)行處理; 步驟六、將處理后的數(shù)據(jù)交給應(yīng)用層。
2.根據(jù)權(quán)利要求I所述的一種從多媒體中抽取音視頻的方法,其特征在于,所述步驟一中,構(gòu)建媒體渲染鏈路具體為使用DirectShow智能連接方式,調(diào)用圖表管理器的Render方法,得到完整的鏈路圖表。
3.根據(jù)權(quán)利要求I或2所述的一種從多媒體中抽取音視頻的方法,其特征在于,所述步驟三中,插入的過濾器包括篩選器。
全文摘要
本發(fā)明公開了一種從多媒體中抽取音視頻的方法,主要過程如下一、用DirectShow方式構(gòu)建完整的媒體渲染鏈路;二、斷開最末端的渲染器;三、在最末端的渲染器之前插入篩選器并恢復(fù)連接;四、通過插入的過濾器抽取音視頻數(shù)據(jù);五、將抽取出來的數(shù)據(jù)進(jìn)行分流、處理;六、將處理后的數(shù)據(jù)交給應(yīng)用層。至此在播放過程中可以得到音視頻數(shù)據(jù)。本發(fā)明能夠支持廣泛的媒體格式,適用于音視頻應(yīng)用領(lǐng)域。
文檔編號(hào)H04N21/439GK102710983SQ20121011028
公開日2012年10月3日 申請日期2012年4月16日 優(yōu)先權(quán)日2012年4月16日
發(fā)明者陳剛 申請人:杭州米加科技有限公司