directshow采集多媒體音視頻同步_第1頁
directshow采集多媒體音視頻同步_第2頁
directshow采集多媒體音視頻同步_第3頁
directshow采集多媒體音視頻同步_第4頁
全文預(yù)覽已結(jié)束

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

隨著計(jì)算機(jī)網(wǎng)絡(luò)和多媒體技術(shù)的發(fā)展,多媒體應(yīng)用如視頻會(huì)議、遠(yuǎn)程監(jiān)控、遠(yuǎn)程教育、可視電話、醫(yī)療視頻會(huì)診等迅速興起,視頻和音頻捕獲成為多媒體應(yīng)用中的關(guān)鍵環(huán)節(jié)和重要前提。目前采用較多的基于設(shè)備軟件開發(fā)工具箱(SDK)的捕獲方式存在成本較高、靈活性和擴(kuò)展性較差等問題,難以滿足用戶需求和網(wǎng)絡(luò)環(huán)境的變化。微軟公司推出的多媒體開發(fā)軟件包———DirectShow成為解決這些問題的一個(gè)有力工具。DirectShow提供高質(zhì)量的多媒體數(shù)據(jù)流的捕獲和回放功能,廣泛支持多種媒體格式,包括ASF、MPEG、AVI、DV、MP3和WAV等。同時(shí)DirectShow對VFW具有良好的兼容性,并具有其無法比擬的優(yōu)勢,包括支持大量多媒體數(shù)據(jù)捕獲的同時(shí)可通過網(wǎng)絡(luò)傳播和播放,支持視頻與音頻在捕獲和播放中的完全同步,支持來自不同媒體源數(shù)據(jù)捕獲的合成等。本文著重介紹如何利用VisualC++實(shí)現(xiàn)基于DirectShow的視頻和音頻捕獲以及其中涉及到的關(guān)鍵問題,以供工程人員和開發(fā)人員參考使用。DirectShow的原理1、 DirectShow的體系結(jié)構(gòu)。應(yīng)用程序與DirectShow組件以及DirectShow所支持的軟硬件之間的關(guān)系如圖1所示。DirectShow使用模塊化的架構(gòu),系統(tǒng)中的基礎(chǔ)模塊稱為過濾器(Filter)。過濾器作為軟件的組件,可完成單一的數(shù)據(jù)流處理功能。按照功能,過濾器大致分為3類:源過濾器(SourceFilter)、轉(zhuǎn)換過濾器(TransformFilter)和表現(xiàn)過濾器(RenderingFilter)。源過濾器負(fù)責(zé)從媒體源獲取數(shù)據(jù);轉(zhuǎn)換過濾器負(fù)責(zé)數(shù)據(jù)的格式轉(zhuǎn)換、傳輸,如數(shù)據(jù)流分離/合成、編碼/解碼等;表現(xiàn)過濾器負(fù)責(zé)數(shù)據(jù)的最終去向,將數(shù)據(jù)送往顯卡和聲卡進(jìn)行播放,或輸出到文件進(jìn)行存儲(chǔ)。過濾器之間通過引腳(Pin)進(jìn)行有序連接,組合而成過濾器圖(FilterGraph),用以實(shí)現(xiàn)組合的一系列功能。應(yīng)用程序創(chuàng)建過濾器圖管理器(FilterGraphManager),負(fù)責(zé)過濾器圖的組織和連接功能并控制數(shù)據(jù)在其中的流動(dòng)。為了提高系統(tǒng)的穩(wěn)定性,Windows操作系統(tǒng)對硬件操作進(jìn)行了隔離;應(yīng)用程序一般不能直接訪問硬件。過濾器工作在用戶模式(Usermode,操作系統(tǒng)特權(quán)級別為Ring3),而硬件工作在內(nèi)核模式(Kernelmode,操作系統(tǒng)特權(quán)級別為Ring0)。2、 DirectShow的開發(fā)方法。開發(fā)DirectShow應(yīng)用程序,主要有以下三個(gè)基本步驟:(1)調(diào)用CoCreateInstance函數(shù),創(chuàng)建一個(gè)過濾器圖管理器組件;根據(jù)項(xiàng)目實(shí)際需求,構(gòu)建一條完整的過濾器鏈路(也可應(yīng)用其它的DirectShow幫助組件來完成過濾器圖的構(gòu)建);調(diào)用過濾器圖管理器上的接口方法來控制過濾器圖,并完成過濾器圖管理器與應(yīng)用程序的事件交互。DirectShow技術(shù)建立在COM(ComponentObjectModel)技術(shù)基礎(chǔ)上,所有部件和功能都可由COM接口來構(gòu)建和實(shí)現(xiàn)。過濾器圖管理器的重要COM接口包括:IGraphBuilder:用于創(chuàng)建過濾器圖。IMediaControl:用于控制媒體流在過濾器圖中的傳輸。IMediaEventEx:用于控制過濾器圖的事件。IVideoWindow:用于設(shè)置多媒體播放窗口的屬性。IBasicAudio:用于控制音頻特性。IBasicVideo:用于控制視頻特性。IMediaPosition:用于查找和定位數(shù)據(jù)流。IPin:用于管理兩個(gè)過濾器之間的引腳,從而連接過濾器。另外,由于直接使用IGraphBuilder接口構(gòu)建視頻和音頻捕獲過濾器圖比較復(fù)雜,DirectShow提供了輔助組件 捕獲圖構(gòu)建器(CaptureGraphBuilder),通過調(diào)用其IcaptureGraphBuilder2的接口方法,可以簡便地完成過濾器圖的構(gòu)建和控制?;贒irectShow視頻和音頻捕獲的實(shí)現(xiàn)1、 編譯環(huán)境的設(shè)置。安裝MicrosoftDirectXSDK后,需要設(shè)置VC編譯環(huán)境。包括:在VC系統(tǒng)目錄中添加DirectXSDK的Include和Lib目錄;創(chuàng)建工程,選擇Win32動(dòng)態(tài)庫;選擇_stdcall函數(shù)調(diào)用協(xié)議;添加已編譯基類源代碼生成的庫Strmbase.lib(發(fā)布版)或Strmbasd.lib(調(diào)試版)。2、 過濾器圖的構(gòu)建設(shè)計(jì)。捕獲系統(tǒng)需要實(shí)現(xiàn)的功能:從視頻采集設(shè)備和音頻采集設(shè)備實(shí)時(shí)獲取數(shù)據(jù)流,預(yù)覽視頻和監(jiān)聽音頻,并將視頻流與音頻流合成后存儲(chǔ)。設(shè)計(jì)如圖2所示的過濾器圖,各個(gè)過濾器組件功能:VideoCapture和AudioCapture分別負(fù)責(zé)實(shí)時(shí)捕獲視頻和音頻;VideoRenderer將視頻流送往顯卡進(jìn)行視頻預(yù)覽;SmartTee負(fù)責(zé)音頻流的分流;AVIMuxer將視頻流與音頻流合成AVI流,F(xiàn)ileWriter將合成后數(shù)據(jù)存儲(chǔ)在硬盤;AudioRenderer將數(shù)據(jù)送往聲卡進(jìn)行音頻播放。需要說明的是,一般視頻捕獲器提供有預(yù)覽和捕獲兩個(gè)輸出引腳,而音頻捕獲器只有捕獲輸出引腳。對于只有捕獲輸出引腳的視頻捕獲器也可使用插入SmartTee的方法實(shí)現(xiàn)數(shù)據(jù)分流。3、 程序?qū)崿F(xiàn)。在這一部分,分析和說明捕獲功能的實(shí)現(xiàn)步驟,并給出核心代碼:(1)創(chuàng)建過濾器圖管理器組件。CoInitialize(NULL);//初始化COM庫//創(chuàng)建過濾器圖管理器IGraphBuilder*pGraphBuilder;CoCreateInstance(CLSID_FilterGraph,NULL,CLSCTX_INPROC_SERVER,IID_IGraphBuilder,(void**)&pGraphBuilder);//創(chuàng)建捕獲圖構(gòu)建器ICaptureGraphBuilder2*pCapGraphBuilder;CoCreateInstance(CLSID_CaptureGraphBuilder2,NULL,CLSCTX_INPROC_SERVER,IID_ICaptureGraphBuilder2,(void**)&pCapGraphBuilder);pCapGraphBuilder->SetFiltergraph(pGraphBuilder);//添加捕獲圖構(gòu)建器到管理器中//獲得有用接口IMediaControl*pControl;IMediaEventEx*pEventEx;pGraphBuilder->QueryInterface(IID_IMediaControl,(void**)&pControl);pGraphBuilder->QueryInterface(IID_ImediaEventEx,(void**)&pEventEx);(2)創(chuàng)建捕獲過濾器。//枚舉采集設(shè)備ICreateDevEnum*pCreateDevEnum=NULL;CoCreateInstance(CLSID_SystemDeviceEnum,NULL,CLSCTX_INPROC_SERVER,IID_ICreateDevEnum,(void**)&pCreateDevEnum);//創(chuàng)建設(shè)備枚舉器IEnumMoniker*pVideoEnumMoniker=NULL;pCreateDevEnum->CreateClassEnumerator(CLSID_VideoInputDeviceCategory,&pVideoEnumMoniker,0);//指定類型目錄/*以枚舉視頻設(shè)備為例。枚舉音頻設(shè)備與此類似,代表音頻采集的過濾器注冊為CLSID_AudioInputDeviceCategory類型*/IMoniker*pVideoMoniker=NULL;IPropertyBag*pVideoPropBag;pVideoMoniker->BindToStorage(0,0,IID_IPropertyBag,(void**)(&pVideoPropBag));//枚舉設(shè)備標(biāo)識(shí)VARIANTvarVideoName;VariantInit(&varVideoName);pVideoPropBag->Read(L"VideoFriendName",&varVideoName,0);/取/得設(shè)備的友好名稱/創(chuàng)建VideoCaptur過濾器IBaseFilter*pVideoCap;pVideoMoniker->BindToObject(0,0,IID_IbaseFilter,(void**)&pVideoCap);/添加VideoCaptur過濾器到過濾器圖pGraphBuilder->AddFilter(pVideoCap,L"VideoCaptureFilter");構(gòu)建其它過濾器,并加入過濾器圖。/*ICaptureGraphBuilde提供了RenderStream函數(shù),可以自動(dòng)構(gòu)建SmartTee和Renderer過濾器,并將它們連接成一個(gè)完整的過濾器圖。如果Capture過濾器既有預(yù)覽引腳又有捕獲引腳,那么RenderStream)將兩個(gè)引腳和Render過濾器連接;如果Caprtur過濾器只有捕獲引腳,那么捕獲圖構(gòu)建器自動(dòng)插入SmartTeeS濾器將視頻流或音頻流分流,并完成過濾器之間的連接。*///構(gòu)建視頻預(yù)覽的過濾器鏈路IBaseFilter*pVideoCap;//pCapGraphBuilder->RenderStream(&PIN_CATEGORY_PREVIEW,&MEDIATYPE_Video,pVideoCap,NULL,NULL);//構(gòu)建音頻監(jiān)聽的過濾器鏈路IBaseFilter*pAudioCap;pCapGraphBuilder->RenderStream(&PIN_CATEGORY_PREVIEW,&MEDIATYPE_Audio,pAudioCap,NULL,NULL);//構(gòu)建視音頻合成并保存文件過濾器鏈路/*SetOutputFileNam函數(shù)會(huì)自動(dòng)創(chuàng)建AVIMuxer過濾器和FileWrit過濾器,并且將這兩個(gè)過濾器添加到過濾器圖中。*/IBaseFilter*pMux;pCapGraphBuilder->SetOutputFileName(&MEDIASUBTYPE_Avi,L"C:\\Capture.avi",&pMux,NULL);/連接捕獲器和AVIMuxer過濾器pCapGraphBuilder->RenderStream(&PIN_CATEGORY_CAPTURE,&MEDIATYPE_Video,pVideoCap,NULL,pMux);pCapGraphBuilder->RenderStream(&PIN_CATEGORY_CAPTURE,&MEDIATYPE_Audio,pAudioCap,NULL,pMux);//設(shè)置音頻流為主流IConfigAviMux*pConfigAviMux;pMux->QueryInterface(IID_IConfigAviMux,(void**)&pConfigAviMux);pConfigAviMux->SetMasterStream(1);控制過濾器圖pControl-〉Run()開/臺(tái)捕獲pControl-〉Pause(暫停pControl-〉S

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論