欧美三区_成人在线免费观看视频_欧美极品少妇xxxxⅹ免费视频_a级毛片免费播放_鲁一鲁中文字幕久久_亚洲一级特黄

基于DirectShow/DES的MPEG-2音視頻編輯軟件的實(shí)

系統(tǒng) 1650 0

引言

1994年歐洲制定的數(shù)字視頻廣播(DVB)標(biāo)準(zhǔn)和1996年美國(guó)聯(lián)邦通信委員會(huì)(FCC)的先進(jìn)電視制式委員會(huì)(ATSC)地面廣播電視標(biāo)準(zhǔn),在視頻部分都采用了MPEG-2 標(biāo)準(zhǔn)。我國(guó)的CATV 數(shù)字網(wǎng),也采用DVB 標(biāo)準(zhǔn)。MPEG-2 標(biāo)準(zhǔn)的出現(xiàn),大大推動(dòng)了數(shù)字視頻業(yè)務(wù)的發(fā)展。越來(lái)越多的節(jié)目交換是以MPEG-2壓縮方式進(jìn)行的,使演播室制作涉及大量對(duì)MPEG編碼壓縮節(jié)目的處理,如非線性編輯涉及的不同節(jié)目間的切換、剪切和串編、在畫面上加字幕、臺(tái)標(biāo)、實(shí)現(xiàn)淡入淡出等。其中節(jié)目剪切和串編是實(shí)現(xiàn)其他編輯功能的基礎(chǔ),因此實(shí)現(xiàn)節(jié)目剪切和串編功能更加重要。

本文針對(duì)MPEG-2 音視頻,采用DirectShow(微軟公司提供的在Windows 平臺(tái)上進(jìn)行流媒體處理的開發(fā)包)的DirectShow編輯業(yè)務(wù)(DES,DirectShow Editing Services)來(lái)實(shí)現(xiàn)MPEG-2音視頻節(jié)目的剪切和串編。DES作為DirectShow的增強(qiáng)應(yīng)用,簡(jiǎn)化了原本煩瑣的視頻編輯,彌補(bǔ)了非線性編輯應(yīng)用軟件的空白,可方便地進(jìn)行音視頻編輯,因此用它來(lái)編輯MPEG-2音視頻文件不失為一個(gè)行之有效的方法。

DES 簡(jiǎn)介

時(shí)間線模型
DES的內(nèi)部結(jié)構(gòu)模型,是一個(gè)基于時(shí)間線(Timeline)的模型,它提出了一個(gè)時(shí)間線和軌道的概念,將所有的多媒體編輯組織到一個(gè)虛擬的時(shí)間線之上,實(shí)際上代表了最終的音視頻剪輯作品。而對(duì)于程序員來(lái)說(shuō),這些時(shí)間線和軌道同一般的通信(COM)接口一樣,都是一個(gè)個(gè)的純虛類,可以通過(guò)繼承、派生和添加必要的函數(shù),來(lái)實(shí)現(xiàn)編輯操作。圖1給出了DES的時(shí)間線內(nèi)部模型。

這是一個(gè)樹形結(jié)構(gòu),在這棵樹中,音視頻文件是葉結(jié)點(diǎn),稱作為媒體源(Source);一個(gè)或多個(gè)Source組成一個(gè)軌道(Track),每個(gè)Track都有統(tǒng)一的媒體格式輸出;Track的集合Express總線回傳給CPU。CPU或者將數(shù)據(jù)通過(guò)PCI總線傳輸給I/O板卡轉(zhuǎn)換成基帶信號(hào)輸出,或者再回送到軟件編解碼器編碼成DV格式的數(shù)據(jù)并通過(guò)1394總線輸出。

相對(duì)于基于專門硬件的非編系統(tǒng),基于CPU+GPU軟件架構(gòu)的非編系統(tǒng)完全擺脫了對(duì)硬件板卡的依賴,突破了專用硬 件結(jié)構(gòu)的局限,利用通用的硬件系統(tǒng)資源實(shí)現(xiàn)了高性能的視頻編輯和處理。

在性能方面,目前基于CPU+GPU的主流非編系統(tǒng)已經(jīng)可以輕松實(shí)現(xiàn)4~6層三維特技的實(shí)時(shí)輸出,遠(yuǎn)遠(yuǎn)超越了目前基 于專用板卡的主流非編系統(tǒng)。

在可擴(kuò)展性方面,由于系統(tǒng)完全采取軟件架構(gòu),一方面通過(guò)提高計(jì)算機(jī)平臺(tái)的配置來(lái)獲得更高的硬件性能,從而直接提高非編系統(tǒng)的性能;另一方面,通過(guò)軟件模塊的添加和升級(jí),可以支持更多的編輯格式、獲得更多的特技效果。

在穩(wěn)定性方面,由于拋棄了專用的硬件板卡,改用結(jié)構(gòu)簡(jiǎn)單的I/O板卡實(shí)現(xiàn)基帶信號(hào)輸出,系統(tǒng)故障率、功耗、發(fā)熱量等都大大下降,穩(wěn)定性則大大提高。通過(guò)進(jìn)一步優(yōu)化系統(tǒng)硬件結(jié)構(gòu),選用設(shè)計(jì)更成熟和安全的品牌圖形工作站,同時(shí)將I/O板卡作進(jìn)一步的模塊拆分,將模擬處理電路從板卡中拆分出來(lái)作為一個(gè)獨(dú)立供電、獨(dú)立散熱的接口盒,可使非編系統(tǒng)實(shí)現(xiàn)工作站和服務(wù)器級(jí)的安全性和穩(wěn)定性,從而大大降低維護(hù)成本,提高設(shè)備利用率。

在成本方面,目前基于CPU+GPU的非編系統(tǒng),其缺點(diǎn)主要是對(duì)計(jì)算機(jī)系統(tǒng)的配置要求高,計(jì)算機(jī)平臺(tái)上的成本投入高昂,但由于沒(méi)有專用板卡上的成本投入,總體成本并沒(méi)有增加。由于計(jì)算機(jī)技術(shù)快速發(fā)展和性價(jià)比不斷提高,基于CPU+GPU的非編系統(tǒng)在性能不斷提高的同時(shí)總體成本呈下降趨勢(shì)。

基于DirectShow/DES的MPEG-2音視頻編輯軟件的實(shí)現(xiàn)方案

基于DirectShow/DES的MPEG-2音視頻編輯軟件的實(shí)現(xiàn)方案
稱作為集合(Composition),每個(gè)Composition可以對(duì)其所有的Composition 或Track 進(jìn)行各種復(fù)雜的編輯;頂級(jí)的Composition或Track就組成了組(Group);每個(gè)Group輸出單一格式的媒體流,所有的Group組成一個(gè)時(shí)間線(Timeline),Timeline表示一個(gè)視頻編輯的項(xiàng)目,它是這棵樹的根節(jié)點(diǎn)。一個(gè)Timeline項(xiàng)目必須至少包含一個(gè)Group,最典型的情況一般包含兩個(gè)Group: 音頻組(Audio Group)和視頻組(VideoGroup)。

圖2所示的是一個(gè)典型的基于時(shí)間線的媒體軌道圖,箭頭方向即是時(shí)間線的方向。這個(gè)時(shí)間線由兩個(gè)組組成,每個(gè)組中包含兩個(gè)媒體源軌道(SourceTrack)。在視頻組中,軌道是有優(yōu)先級(jí)的(軌道0具有最低的優(yōu)先級(jí),依次類推)。運(yùn)行時(shí),總是輸出高優(yōu)先級(jí)的軌道中的媒體源內(nèi)容。如果此時(shí)高優(yōu)先級(jí)的軌道中沒(méi)有媒體源輸出,則讓低優(yōu)先級(jí)的軌道中的媒體源輸出。如圖1中視頻組的輸出順序?yàn)槊襟w源A→媒體源C→媒體源B。而對(duì)于音頻組,它的所有軌道的輸出只是簡(jiǎn)單的合成。我們利用時(shí)間線的這一原理,將媒體素材挨個(gè)賦予到相應(yīng)的媒體源上去,隨后將媒體源組織到不同優(yōu)先級(jí) 別的軌道上,最終在時(shí)間線模型的組織下輸出我們所需要的合成節(jié)目。這也就是MPEG-2 音視頻編輯功能的核心模型。

時(shí)間概念
DES中大致有3種時(shí)間:
(1) 時(shí)間線時(shí)間(Timeline Time):相對(duì)于整個(gè)時(shí)間線項(xiàng)目的時(shí)間;
(2) 媒體時(shí)間(Media Time):相對(duì)于媒體源的時(shí)間,比如媒體源是一個(gè)文件,那么媒體時(shí)間實(shí)際上是指相對(duì)于文件開頭的位置時(shí)間;
(3) 父對(duì)象時(shí)間(Parent Time):相對(duì)于時(shí)間線中已編排的某個(gè)對(duì)象的時(shí)間。

設(shè)計(jì)方案

設(shè)計(jì)方案如下:首先要完成播放MPEG-2音視頻文件的功能,在瀏覽的過(guò)程中對(duì)需要的音視頻片斷的編入點(diǎn)和編出點(diǎn)作標(biāo)記。其次要完成可對(duì)編輯好的音視頻預(yù)覽的功能,如果編輯結(jié)果比較滿意,要將其保存到文件中。剪切時(shí),僅需對(duì)播放中的文件設(shè)置入出點(diǎn),按保存按鈕即可邊預(yù)覽邊保存;串編時(shí),依次打開要編輯的文件,設(shè)置入出點(diǎn),然后再按預(yù)覽或保存按鈕即可。

實(shí)現(xiàn)過(guò)程

用DirectShow實(shí)現(xiàn)播放功能非常方便。該功能模塊主要是由GetCurrentPosition()函數(shù)得到編入點(diǎn)和編出點(diǎn)的時(shí)間,為后面的編輯提供媒體起始時(shí)間。下面主要介紹用DES進(jìn)行預(yù)覽和保存的實(shí)現(xiàn)方法。

時(shí)間線的構(gòu)建
用DES實(shí)現(xiàn)剪輯后的預(yù)覽或保存功能首先必須構(gòu)建時(shí)間線模型。首先調(diào)用了系統(tǒng)提供的一個(gè)虛接口(虛接口的含義是:該接口包含許多未被定義的函數(shù)方法,它只提供了一個(gè)面向應(yīng)用層的接口)。這個(gè)虛接口,稱為IAMTimeline。我們要做的事情就是,遵循圖1中時(shí)間線的結(jié)構(gòu)定義自己所需要的屬性和函數(shù),并且建立出我們的時(shí)間線對(duì)象。最基本的屬性包括有圖1中所提到的組(Group),集合(Composition),軌道(Track)和媒體源(Source)。

(1) 首先創(chuàng)建一個(gè)時(shí)間線對(duì)象
IAMTimeline*pTL=NULL;
hr=CoCreatelnstance(CLSID_IAMTimeline,NULL,CLSCTX_INPROC_SERVER,IID IAMTimeline,(void* *)&pTL);
這時(shí),我們面對(duì)的是一個(gè)空的時(shí)間線框架,接下來(lái)所作的是根據(jù)自己的需要為我們的“樹形”時(shí)間線結(jié)構(gòu)填上“枝 葉”。

(2) 接下來(lái)使用接口方法IAMTimeline::CreateEmptyNode創(chuàng)建各種DES 對(duì)象。包括:IAMTimelineGroup(視頻組pVideoGroup,音頻組pAudioGroup)、IAMTimelineComp(視頻pVideoComp,音頻pAuioComp)、IAMTimelineTrack(視頻pVideoTrack,音頻pAuioTrack)、IAMTimelineSrc(視頻pVideoSrc,音頻pAuioSrc)。
以下示例均為視頻組代碼,音頻組與視頻組類似。
IAMTimelineGroup *pVideoGroup=NULL;
IAMTimelineObj *pVideoGroupObj=NULL;
pTL → CreateEmptyNode(&pVideoGroupObj,TIMELINE_MAJOR_TYPE_GROUP);
pGroupObj→Querylnterface(IID_IAMTimelineGroup,(void **)&pVideoGroup);
調(diào)用IAMTimeline::CreateEmptyNode成功后,我們可以得到一個(gè)IAMTimelineObj接口指針。也就是說(shuō),每個(gè)我們創(chuàng)造的DES對(duì)象上都實(shí)現(xiàn)了IAMTimelineObj接口。

(3) 接著在組中加入軌道
pVideoComp→VTracklnsBefore(pVideoTrackObj, -1);
pVideoTrackObj→Querylnterface(IID_IAMTimelineTrack,(void **)&pVideoTrack)。

(4) 這是最關(guān)鍵的一步,設(shè)置媒體源的剪切時(shí)間和其在時(shí)間線上的時(shí)間,然后將其放到相應(yīng)的軌道上。串編情況下,筆者設(shè)計(jì)了一個(gè)類記錄該媒體源的文件名、片斷長(zhǎng)度、編入點(diǎn)和編出點(diǎn),并用模版類CArray管理該類。
"class CFileInfo
" {
"public:
" CString filename;
" LONGLONG ClipLen;
" LONGLONG Outdot;
" LONGLONG Indot;
" CFileInfo();
" virtual ~CFileInfo();
" } ;
"CArrayFileArray
" for (i=1; i<=FileArray.GetSize();i++)
" {
"FileArray[0].ClipLen = 0;
hr=pVideoSrcObj→SetStartStop(FileArray[i-1].ClipLen,FileArray[i-1].ClipLen+FileArray[i].ClipLen);//設(shè)置時(shí)間線時(shí)間
hr=pVideoSrcObj→SetMediaTimes(FileArray[i].Indot,FileArray[i].Outdot );//設(shè)置媒體源時(shí)間
hr=pVideoSrcObj → SetMediaName(T2W(FileArray[i].filename));//設(shè)置媒體源文件名
hr=pVideoTrack→SrcAdd(pVideoSrcObj);//將媒體源添加到相應(yīng)的軌道上
FileArray[i].ClipLen=FileArray[i-1].ClipLen+FileArray[i].ClipLen;//下一個(gè)媒體源的時(shí)間線起點(diǎn)時(shí)間是前一個(gè)媒體源時(shí)間線的終點(diǎn)時(shí)間。
" }

預(yù)覽功能的實(shí)現(xiàn)
創(chuàng)建好時(shí)間線后,創(chuàng)建基本渲染引擎IRenderEngine,它的作用是通過(guò)已經(jīng)建立好的時(shí)間線構(gòu)建濾波器圖(FilterGraph)供預(yù)覽或者輸出文件。所以,我們需把時(shí)間線的信息傳遞給它。接下來(lái)的過(guò)程很簡(jiǎn)單了,調(diào)用ConnectFrontEnd連接時(shí)間線部分所建立的濾波器(F i l t e r ),調(diào)用RenderOutputPins。至此,濾波器圖已成功建立,只要調(diào)用IMediaControl接口的Run()函數(shù)即可進(jìn)行預(yù)覽了。
IRenderEngine *pRenderEngine = NULL;
hr=CoCreatelnstance(CLSID_RenderEngine, NULL,CLSCTX_INPROC_SERVER,IID_IRenderEngine, (void**)&pRenderEngine); //創(chuàng)建基本渲染引擎
hr=pRender→SetTimelineObject(pTL); //確定要渲染的時(shí)間線
hr=pRenderEngine→ConnectFrontEnd( );//構(gòu)建graph的前端
hr=pRenderEngine→RenderOutputPins( );//將前端出來(lái)的引腳根據(jù)媒體類型分別連接到音視頻渲染器,完成graph的構(gòu)建
IGraphBuilder *pGraph=NULL;
IMediaControl *pControl=NULL;
hr=pRender→GetFilterGraph(&pGraph);
hr=pGraph→QueryInterface(IID_IMediaControl, (void **)&pControl);
hr=pControl→Run();//運(yùn)行Filter Graph。

保存功能實(shí)現(xiàn)
創(chuàng)建好時(shí)間線和前端后,前端輸出的是非壓縮的音頻流和視頻流,而我們要保存的是壓縮數(shù)據(jù),所以必須向?yàn)V波器圖中加入MPEG-2音頻編碼器和視頻編碼器以及復(fù)用器。

第一步,將視頻編碼器、音頻編碼器和復(fù)用器以及文件寫入程序?yàn)V波器加入到濾波器圖中
hr=AddFilterByCLSID(pGraph,LSID_VIDEO_ENCODER,L"mpeg video encoder",&pVideoEncoder);
第二步,得到組的個(gè)數(shù)及輸出引腳指針,根據(jù)引腳的媒體類型將其連接到相應(yīng)的編碼器上。
long NumGroups;
pTL->GetGroupCount(&NumGroups);
IPin *pPin;
"for (i = 0; i < NumGroups; i++)
" {
" if (pRenderEngine->GetGroupOutputPin(i, &pPin)== S_OK)
" {
" hr=GetMediaType(pPin);
" if (hr==TRUE) // 返回值為TRUE,則引腳輸出的是視頻流
" ConnectFilters(pGraph,pPin,pVideoEncoder,TRUE);
" else
" ConnectFilters(pGraph,pPin,pAudioEncoder,TRUE);
" }
" }
第三步,將視頻編碼器和音頻編碼器濾波器連接到復(fù)用器濾波器上
hr=ConnectFilters(pGraph,pVideoEncoder,pMux,TRUE);
hr=ConnectFilters(pGraph,pAudioEncoder,pMux,TRUE);
第四步,連接復(fù)用器和文件寫入程序?yàn)V波器
hr=ConnectFilters(pGraph,pMux,pfilewriter,TRUE);
第五步,創(chuàng)建MPEG輸出文件IFileSinkFilter *pSin= 0;pfilewriter→QueryInterface(IID_IFileSinkFilter,(void**)&pSink);
pSink→SetFileName(T2W(strSaveFile), NULL);
最后調(diào)用IMediaControl接口的Run()函數(shù)即可進(jìn)行保存了。

測(cè)試效果
基于DirectShow/DES的MPEG-2音視頻編輯軟件的實(shí)現(xiàn)方案
實(shí)現(xiàn)MPEG-2 音視頻剪輯的界面如圖3 所示。列表框顯示了待編輯的文件列表,雙擊文件名即可顯示該文件的第一圖3 MPEG-2 音視頻剪輯界面幀,點(diǎn)擊播放按鈕可實(shí)現(xiàn)對(duì)本地文件的回放。點(diǎn)擊入點(diǎn)按鈕可設(shè)置要剪切文件的入點(diǎn),點(diǎn)擊出點(diǎn)按鈕后,將先暫停播放并得到剪切終止點(diǎn)。依次對(duì)多個(gè)文件進(jìn)行出入點(diǎn)設(shè)置后點(diǎn)擊預(yù)覽按鈕后,回放的畫面流暢,無(wú)馬賽克現(xiàn)象,無(wú)明顯延時(shí)。點(diǎn)擊保存按鈕可保存串編結(jié)果,保存后的MPEG-2音視頻流,用暴風(fēng)影音等軟件對(duì)該文件進(jìn)行回放,回放的畫面流暢,質(zhì)量令人滿意。

結(jié)束語(yǔ)

音視頻剪輯,無(wú)論是對(duì)電視臺(tái)的節(jié)目編輯制作,還是對(duì)一般的家庭用戶,都具有很大的吸引力。因此,視頻剪輯功能的實(shí)用化、普及化具有很強(qiáng)的現(xiàn)實(shí)意義。采用DES可使時(shí)間線管理、特技合成更加方便可靠,同時(shí)DES采用插件方式,可以有很多支持微軟DirectX的第三方插件使用,使軟件更易于擴(kuò)展,為用戶提供更多的選擇。DES使得程序的模塊化更強(qiáng),有利于軟件的開發(fā),同時(shí)在不斷升級(jí)過(guò)程中,更可以方便地集成新的功能。當(dāng)然,這種視頻編輯的方法也存在著它的局限性,即編輯的精度較傳統(tǒng)的硬件實(shí)現(xiàn)方法低,不適合應(yīng)用于精度要求很高的編輯,這也是該軟件實(shí)現(xiàn)視頻編輯的一個(gè)缺陷。

基于DirectShow/DES的MPEG-2音視頻編輯軟件的實(shí)現(xiàn)方案


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對(duì)您有幫助就好】

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長(zhǎng)會(huì)非常 感謝您的哦?。?!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 日韩特级毛片 | 午夜在线免费观看 | 加勒比久久综合 | 亚洲成人av | 成人淫片免费视频95视频 | wwwxxx日本在线观看 | 欧美视频99 | 亚洲精品第一综合99久久 | 色综合欧美| 国产精品久久久久久久久久久新郎 | 亚洲欧美韩国日产综合在线 | 三级毛片免费 | 国产12孩岁A片被A午夜 | 亚洲精品久久久久一区二区三 | 草草国产成人免费视频 | 男女做性无遮挡免费视频 | jdav视频在线观看免费 | 成年视频在线观看免费 | 丁香久久 | 最新的黄色网址 | 49pao强力免费打造在线高清 | 国产嫩草影院在线观看 | 久久综合九九 | 亚洲午夜精品一区二区蜜桃 | 国产欧美日韩在线观看 | 无遮挡一级毛片私人影院 | 99久久国产综合精品网成人影院 | 国产无遮挡裸体免费视频 | 日本亚洲一区 | 九月婷婷开心九月 | 中文字幕在线不卡 | 男女xx| 香港全黄一级毛片在线播放 | 精品欧美成人高清视频在线观看 | 亚洲欧洲日韩国产aa色大片 | 亚洲日韩中文字幕一区 | 婷婷久久五月天 | 成人福利在线 | 日本三级黄色片网站 | 国产精品99久久久久久久女警 | 91久久亚洲精品一区二区 |