陳志峰 田裕鵬 王珊珊
摘 要:MPEG-2文件標(biāo)準(zhǔn)出現(xiàn)得比較早,MPEG-2作為DVD標(biāo)準(zhǔn),現(xiàn)存的許多視頻資源中就保留了很多這種格式的文件。如何對(duì)現(xiàn)有資源文件進(jìn)行整理再編輯,成為一個(gè)現(xiàn)實(shí)應(yīng)用中常見(jiàn)的問(wèn)題。在此提出兩種針對(duì)MPEG-2文件的剪輯方案,分別基于MPEG-2格式標(biāo)準(zhǔn)字節(jié)流分析和DirectShow的DES技術(shù)兩方面說(shuō)明了視頻文件的編輯方法,并從上述兩方面著手,既指出了各自的實(shí)現(xiàn)細(xì)節(jié),又將這兩種方法進(jìn)行比較,分析它們各自的優(yōu)缺點(diǎn),最后指出DirectShow技術(shù)在音視頻編輯應(yīng)用方面有它獨(dú)到的優(yōu)勢(shì)。綜合當(dāng)前主流的音視頻編輯軟件實(shí)現(xiàn)方案,為音視頻編輯應(yīng)用指出實(shí)踐的方法。
關(guān)鍵詞:MPEG-2;視頻編輯;Directshow;DES;時(shí)間線
中圖分類號(hào):TP311文獻(xiàn)標(biāo)識(shí)碼:A
文章編號(hào):1004-373X(2009)10-100-04
Implementation of MPEG-2 Audio and Video Edit Software
CHEN Zhifeng,TIAN Yupeng,WANG Shanshan
(College of Information Science and Technology,Nanjing University of Aeronautics and Astronautics,Nanjing,210016,China)
Abstract:MPEG-2 format appears much more earlier.MPEG-2 is used as DVD standard and many media files use this format.How to edit these resources becomes a common problem.This article lists two ways to edit MPEG-2 format files:one is based on analyzing MPEG-2 file format through packet stream,and the other is based on directshow′s DES technology.This article first points out some details of each way,and then compares them,points out each characteristic,at last conclude that directshow technology has unique advantage.This article combines common ways of implementation of audio and video edit software,and shows a practice way to it.
Keywords:MPEG-2;video edit;Directshow;DES;timeline
MPEG是運(yùn)動(dòng)圖像專家組(Moving Picture Experts Group)的簡(jiǎn)稱,其任務(wù)是制定世界通用的視音頻編碼標(biāo)準(zhǔn)。MPEG組織于1994年推出MPEG-2壓縮標(biāo)準(zhǔn),用以實(shí)現(xiàn)視/音頻服務(wù)與應(yīng)用互操作的可能性。MPEG-2標(biāo)準(zhǔn)是針對(duì)標(biāo)準(zhǔn)數(shù)字電視和高清晰度電視在各種應(yīng)用下的壓縮方案和系統(tǒng)層的詳細(xì)規(guī)定,標(biāo)準(zhǔn)的正式規(guī)范定義在ISO/IEC13818中。MPEG-2特別適用于廣播級(jí)數(shù)字電視的編碼和傳送,被認(rèn)定為SDTV和HDTV的編碼標(biāo)準(zhǔn)。
MPEG-2圖像壓縮的原理是利用圖像中的兩種特性:空間相關(guān)性和時(shí)間相關(guān)性。這兩種相關(guān)性使得圖像中存在大量的冗余信息。通過(guò)去除冗余信息,只保留少量非相關(guān)信息進(jìn)行傳輸,可以大大節(jié)省傳輸頻帶,而接收方利用這些非相關(guān)信息,按照一定解碼算法,可以在保證一定的圖像質(zhì)量的前提下重建原始圖像。
1 MPEG-2編碼方法
MPEG-2視頻流可分為視頻序列層、圖像組層、圖像層、宏塊條層、宏塊層和像塊層共6個(gè)層次。各層之間的作用與關(guān)系如下:
(1) 視頻序列層(Sequence):一系列圖像組構(gòu)成一個(gè)視頻序列。包含圖像尺寸、寬高比、圖像速率等信息。
(2) 圖像組層(GOP):由相互關(guān)聯(lián)的一組I,B,P幀組成,I幀為第一幀。GOP頭包括時(shí)間信息。
(3) 圖像層(Picture):一系列像條可以構(gòu)成一幅圖像,圖像分為I,B,P三類,包括圖像編碼類型和時(shí)間參考信息。
(4) 宏塊條層(Slice):一連串的宏塊構(gòu)成一個(gè)宏塊條,包括一定數(shù)量的宏塊,其順序與掃描順序一致。
(5) 宏塊層(MacroBlock):在4∶2∶2取樣中,一個(gè)宏塊由4個(gè)亮度像塊,2個(gè)Cr像塊和2個(gè)Cb像塊構(gòu)成;另外還有4∶2∶0,4∶4∶4的取樣方式。MPEG-2定義3種宏塊結(jié)構(gòu),代表構(gòu)成一個(gè)宏塊的亮點(diǎn)像塊和色差像塊的數(shù)量關(guān)系。
(6) 像塊層(Block):由8×8個(gè)像素點(diǎn)構(gòu)成的DCT變化基本單元。
MPEG-2的編碼圖像被分為三類,分別稱為I幀,P幀和B幀。I幀圖像采用幀內(nèi)編碼方式,只利用單幀圖像內(nèi)的空間相關(guān)性,而沒(méi)有利用連續(xù)幀之間的時(shí)間相關(guān)性。P幀和B幀圖像采用幀間編碼方式,同時(shí)利用了空間和時(shí)間上的相關(guān)性。P幀圖像只采用前向時(shí)間預(yù)測(cè),可以提高壓縮效率和圖像質(zhì)量。P幀圖像中可以包含幀內(nèi)編碼的部分,即P幀中的每一個(gè)宏塊可以是前向預(yù)測(cè),也可以是幀內(nèi)編碼。B幀圖像采用雙向時(shí)間預(yù)測(cè),可以大大提高壓縮倍數(shù)。
2 基于MPEG-2視頻流的剪輯方案
2.1 MPEG-2視頻流的構(gòu)成
MPEG-2視頻流分為程序流和傳輸流兩種編碼方式。通常用于存儲(chǔ)的視頻文件都是由程序流構(gòu)成的。程序流由組首部、系統(tǒng)首部和PES分組構(gòu)成,程序流的構(gòu)成如圖1所示。
組以一個(gè)32位(0x00-00-01-BA)碼字開(kāi)始。組首部包含系統(tǒng)參考時(shí)的(SCR)數(shù)據(jù),表明了程序流中最后一個(gè)解碼單元到達(dá)解碼器的預(yù)定時(shí)間。系統(tǒng)首部?jī)H存在于第一個(gè)圖像組中。PES分組由分組首部與分組數(shù)據(jù)組成。分組的頭部包含有分組長(zhǎng)度、時(shí)間戳PTS,DTS等關(guān)鍵信息。
2.2 剪切點(diǎn)的選擇
一個(gè)視頻序列由一個(gè)或多個(gè)圖像組連接而成。一個(gè)圖像組內(nèi)的編碼序列可能是 I1 B2 B3 P4 B5 B6 P7 B8 B9 I10,而輸出的解碼序列是I1 P4 B2 B3 P7 B5 B6 I10 B8 B9。因此,若當(dāng)前選取的剪切點(diǎn)在一個(gè)圖像組內(nèi)部,則牽涉到源視頻序列的解碼再編碼過(guò)程。一個(gè)簡(jiǎn)便的方法是將剪切點(diǎn)的起始位置移至一個(gè)圖像組的起始處,也就是尋找一個(gè)I幀作為程序的切入點(diǎn)。因此一對(duì)起終點(diǎn)的選擇方法如下:
(1) 從當(dāng)前文件之處讀取4個(gè)字節(jié),與圖組頭關(guān)鍵字group_start_code(0x00-00-01-b3)或序列頭關(guān)鍵字(0x00-00-01-ba)進(jìn)行比較,若相同,則記為合適的剪切點(diǎn)。
(2) 若不相同且當(dāng)前點(diǎn)為剪切的起點(diǎn),則從文件中向上讀取一個(gè)字節(jié),重復(fù)(1)的過(guò)程,直到找到一個(gè)合適的切入點(diǎn)。
(3) 若不相同且當(dāng)前點(diǎn)為剪切的終點(diǎn),則從文件中向下讀取一個(gè)字節(jié),重復(fù)(1)的過(guò)程,直到找到一個(gè)合適的切入點(diǎn)。
經(jīng)過(guò)如上的過(guò)程,就能夠找到一系列的起終點(diǎn),使得在每一對(duì)起終點(diǎn)的區(qū)間內(nèi)包含完整的圖像信息,可以獨(dú)立地從現(xiàn)有幀序列中得到所有的視頻信息。避免了因幀之間存在依賴關(guān)系,導(dǎo)致圖像不能正確解碼而生成的馬賽克與拖幀現(xiàn)象。
2.3 時(shí)間戳的修正
得到圖像的信息后,由于已經(jīng)將不需要的圖像信息丟棄,剪輯下來(lái)的圖像信息已經(jīng)不能用原有的時(shí)間標(biāo)記回放,所以要修正保留下來(lái)的圖像的時(shí)間戳。
PTS,DTS,SCR被用于解碼器中的同步操作。其中PTS(Presentation Timestamp)是一個(gè)33位的字節(jié)流。表明此分組中第一個(gè)訪問(wèn)單元在系統(tǒng)目標(biāo)解碼器中的預(yù)定顯示時(shí)間;DTS(Decoding Time Stamp)也是一個(gè)33位的字節(jié)流,表示在分組中開(kāi)始的第一個(gè)訪問(wèn)單元預(yù)計(jì)在系統(tǒng)目標(biāo)解碼器中的解碼時(shí)間;SCR(System Clock Reference)也是一個(gè)33位的字節(jié)流,表示系統(tǒng)目標(biāo)解碼器SCR域最后字節(jié)到達(dá)所需要的時(shí)間,編碼器用數(shù)據(jù)碼率和90 kHz的時(shí)鐘頻率把SCR字節(jié)域轉(zhuǎn)換為SCR值。
將剪切前視頻流首部的時(shí)間標(biāo)志(SCR0,PTS0,DTS0)提取出來(lái),替換剪切后第一段文件相對(duì)應(yīng)的數(shù)據(jù),依次修改該段文件中的所有SCR,PTS,DTS,并記下最后一組SCR1,PTS1,DTS1,將它們與SCR0,PTS0,DTS0對(duì)應(yīng)相加,作為剪切后第二段文件的起始SCR,PTS,DTS。重復(fù)此過(guò)程,直到修改完所有的時(shí)間戳標(biāo)記位。
最后,先將源文件的第一個(gè)分組中的系統(tǒng)首部等相關(guān)信息提取出來(lái),拼接到剪切后的文件頭部,再給剪切后的文件尾加上結(jié)束碼字(0x00-00-01-b9)。
經(jīng)過(guò)以上的過(guò)程,一段MPEG-2文件的剪切過(guò)程完成。
3 基于DirectShow技術(shù)的剪輯方案
3.1 DirectShow簡(jiǎn)介
DirectX軟件開(kāi)發(fā)包是微軟公司提供的在Windows操作平臺(tái)上開(kāi)發(fā)高性能圖形、聲音、輸入、輸出和網(wǎng)絡(luò)游戲的一套編程接口。DirectX被定義為“硬件設(shè)備無(wú)關(guān)性”,可以用與設(shè)備無(wú)關(guān)的方法提供設(shè)備相關(guān)的高性能。
DirectShow是DirectX中的一套組件,用來(lái)處理各種格式媒體文件的回放、音視頻采集等多媒體應(yīng)用。DirectShow的設(shè)計(jì)初衷是盡量要讓應(yīng)用程序開(kāi)發(fā)人員從復(fù)雜的數(shù)據(jù)傳輸、硬件差異、同步性等工作中解脫出來(lái),總體應(yīng)用框架和底層工作由DirectShow來(lái)完成。DirectShow的構(gòu)成如圖2所示。
3.2 非線性編輯DES
DES(DirectShow Editing Services)是一套基于DirectShow核心框架的編程接口,它的出現(xiàn)簡(jiǎn)化了視頻編輯任務(wù)。DES的系統(tǒng)結(jié)構(gòu)如圖3所示。
基于時(shí)間線的模型如圖4所示。
3.3 實(shí)現(xiàn)方法
運(yùn)用DirectShow的DES方法,實(shí)現(xiàn)方案如下:
(1) 首先選定待剪切文件上的起點(diǎn)與終點(diǎn)。以時(shí)間為標(biāo)記,記為startpoint,endpoint。
(2) 為目標(biāo)文件生成一個(gè)時(shí)間線對(duì)象(TimeLine):
IAMTimeline*pTL=NULL;
CoCreatelnstance(CLSID_IAMTimeline,NULL,CLSCTX_INPROC_SERVER,IID_IAMTimeline,(void* *)&pTL;);
接下來(lái)要將時(shí)間線上的視頻組和音頻組的信息填寫完整。
(3) 為時(shí)間線對(duì)像生成一個(gè)組,以視頻組為例,首先生成一個(gè)視頻組(video group):
IAMTimelineGroup *pVideoGroup=NULL;
IAMTimelineObj *pVideoGroupObj=NULL;
pTL->CreateEmptyNode(&pVideoGroupObj;,TIMELINE_MAJOR_TYPE_GROUP);
pGroupObj->Querylnterface(IID_IAMTimelineGroup,(void **)&pVideoGroup;);
組是由軌道組成的,所以接下來(lái)要為視頻組添加軌道(Track):
pVideoComp->VTracklnsBefore(pVideoTrackObj,-1);
pVideoTrackObj->Querylnterface(IID_IAMTimelineTrack,(void **)&pVideoTrack;)
(4) 為軌道添加視頻時(shí)間點(diǎn)和文件信息:
首先,設(shè)置時(shí)間線上的時(shí)間,這個(gè)時(shí)間是源文件中的時(shí)間點(diǎn)在剪切后的文件中出現(xiàn)的時(shí)間:
pVideoSrcObj->SetStartStop(startpoint1,endpoint1);
接下來(lái)要設(shè)置源媒體的時(shí)間,這個(gè)時(shí)間就是想得到的源媒體文件中的視頻信息出現(xiàn)的時(shí)間:
pVideoSrcObj->SetMediaTimes(startpoint.endpoint);
還要設(shè)置源媒體文件的名字:
pVideoSrcObj->SetMediaName(源媒體文件名)
將信息加入的軌道中:
pVideoTrack->SrcAdd(pVideoSrcObj);
(5) 把時(shí)間線對(duì)象放入DirectShow回放控制引擎中:
IRenderEngine *pRenderEngine = NULL;
CoCreatelnstance(CLSID_RenderEngine,NULL,CLSCTX_INPROC_SERVER,IID_IRenderEngine,(void**)&pRenderEngine;);
pRender->SetTimelineObject(pTL);
pRenderEngine->ConnectFrontEnd( );
(6) 為時(shí)間線對(duì)象指定輸出信息的壓縮方法。DirectShow默認(rèn)只支持AVI格式的輸出,因此,要指定一個(gè)自己定義的輸出格式,這里選擇一個(gè)MPEG-2的壓縮器:
IGraphBuilder *pGraph=NULL;
IMediaControl *pControl=NULL;
pRender->GetFilterGraph(&pGraph;);
AddFilterByCLSID(pGraph,LSID_VIDEO_ENCODER,L"MPE-2",&pVideoEncoder;);
long NumGroups;
pTL->GetGroupCount(&NumGroups;);
IPin *pPin;
for (i=0;i if (pRenderEngine->GetGroupOutputPin(i,&pPin;)==S_OK){ ConnectFilters(pGraph,pPin,pVideoEncoder, TRUE); } } (7) 為時(shí)間線對(duì)象指定輸出文件: AddFilterByCLSID(pGraph,LSID_VIDEO_WRITER,Writer' ',&pfilewriter;); ConnectFilters(pGraph,pVideoEncoder,pMux,TRUE); ConnectFilters(pGraph,pMux,pfilewriter,TRUE);
IFileSinkFilter *pSin= 0;
pfilewriter->QueryInterface(IID_IFileSinkFilter,(void**)&pSink;);
pSink->SetFileName(剪切后的文件名,NULL);
(8) 啟動(dòng)回放功能:
pGraph->QueryInterface(IID_IMediaControl,(void **)&pControl;);
pControl->Run();
回放時(shí),DirectShow會(huì)把輸出的數(shù)據(jù)以MPEG-2的形式輸出到指定的文件中去。
最后,當(dāng)時(shí)間線對(duì)象的數(shù)據(jù)流回放完畢后,所生成的就是剪輯完畢的文件了。
4 結(jié) 語(yǔ)
通過(guò)對(duì)比上述兩種實(shí)現(xiàn)方案,可以得出如下結(jié)論:
(1) 基于解析MPEG-2文件視頻文件的剪輯方案需要對(duì)MPEG-2格式內(nèi)容進(jìn)行深入的了解,程序的設(shè)計(jì)與實(shí)現(xiàn)的復(fù)雜度很高,而通過(guò)DirectShow技術(shù)則大大簡(jiǎn)化了這種復(fù)雜性。
(2) DirectShow本身的開(kāi)放性框架使得它可以處理更多更復(fù)雜的媒體內(nèi)容,通過(guò)給它接上不同的目標(biāo)輸出控制單元,可以處理更多格式類型媒體文件。
(3) 通過(guò)DirectShow框架,設(shè)計(jì)人員可以從繁雜的背景知識(shí)的學(xué)習(xí)中解脫出來(lái),從而更加專注于視頻的應(yīng)用處理中,這無(wú)疑使它更容易為應(yīng)用人員所掌握。
參考文獻(xiàn)
[1]陸其明.DirectShow開(kāi)發(fā)指南[M].北京:清華大學(xué)出版社,2003.
[2]Microsoft Corporation.DirectX 9.0 Programmerps Reference[CP/DK].2002.
[3]余兆明.MPEG標(biāo)準(zhǔn)及其應(yīng)用[M].北京:北京郵電大學(xué)出版社,2002.
[4]陸其明.DirectShow 實(shí)務(wù)精選[M].北京:科學(xué)出版社,2004.
[5]張勇,羅靜.基于DirectShow的多媒體文件音視頻的重新壓縮[J].現(xiàn)代電視技術(shù),2005(5):87-91.
[6]楊欣穎.非線性視頻編輯技術(shù)在多媒體課件制作中的處理與應(yīng)用[J].文教資料,2006(21):183-184.
[7]胡春華,曹元大,張磊.基于DirectShow的視頻流媒體存儲(chǔ)系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)[J].計(jì)算機(jī)工程與設(shè)計(jì),2003(11):31-33.
[8]胡海峰,陳喜,張文淵,等.DirectShow非線性音頻-視頻編輯應(yīng)用的實(shí)現(xiàn)[J].微計(jì)算機(jī)應(yīng)用,2004,25(1):58-63.
[9]徐燃,潘接林.DirectShow技術(shù)在音頻格式轉(zhuǎn)換及音視頻分離方面的應(yīng)用[J].計(jì)算機(jī)應(yīng)用,2005(Z1):269-272.
[10]豐偉偉.DirectShow播放視頻和MP3[J].電腦編程技巧與維護(hù),2006(12):15-17.