APP下载

MPEG-2音视频编辑软件的实现方案

2009-08-13陈志峰田裕鹏王珊珊

现代电子技术 2009年10期
关键词:宏块音视频字节

陈志峰 田裕鹏 王珊珊

摘 要:MPEG-2文件标准出现得比较早,MPEG-2作为DVD标准,现存的许多视频资源中就保留了很多这种格式的文件。如何对现有资源文件进行整理再编辑,成为一个现实应用中常见的问题。在此提出两种针对MPEG-2文件的剪辑方案,分别基于MPEG-2格式标准字节流分析和DirectShow的DES技术两方面说明了视频文件的编辑方法,并从上述两方面着手,既指出了各自的实现细节,又将这两种方法进行比较,分析它们各自的优缺点,最后指出DirectShow技术在音视频编辑应用方面有它独到的优势。综合当前主流的音视频编辑软件实现方案,为音视频编辑应用指出实践的方法。

关键词:MPEG-2;视频编辑;Directshow;DES;时间线

中图分类号:TP311文献标识码:A

文章编号: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是运动图像专家组(Moving Picture Experts Group)的简称,其任务是制定世界通用的视音频编码标准。MPEG组织于1994年推出MPEG-2压缩标准,用以实现视/音频服务与应用互操作的可能性。MPEG-2标准是针对标准数字电视和高清晰度电视在各种应用下的压缩方案和系统层的详细规定,标准的正式规范定义在ISO/IEC13818中。MPEG-2特别适用于广播级数字电视的编码和传送,被认定为SDTV和HDTV的编码标准。

MPEG-2图像压缩的原理是利用图像中的两种特性:空间相关性和时间相关性。这两种相关性使得图像中存在大量的冗余信息。通过去除冗余信息,只保留少量非相关信息进行传输,可以大大节省传输频带,而接收方利用这些非相关信息,按照一定解码算法,可以在保证一定的图像质量的前提下重建原始图像。

1 MPEG-2编码方法

MPEG-2视频流可分为视频序列层、图像组层、图像层、宏块条层、宏块层和像块层共6个层次。各层之间的作用与关系如下:

(1) 视频序列层(Sequence):一系列图像组构成一个视频序列。包含图像尺寸、宽高比、图像速率等信息。

(2) 图像组层(GOP):由相互关联的一组I,B,P帧组成,I帧为第一帧。GOP头包括时间信息。

(3) 图像层(Picture):一系列像条可以构成一幅图像,图像分为I,B,P三类,包括图像编码类型和时间参考信息。

(4) 宏块条层(Slice):一连串的宏块构成一个宏块条,包括一定数量的宏块,其顺序与扫描顺序一致。

(5) 宏块层(MacroBlock):在4∶2∶2取样中,一个宏块由4个亮度像块,2个Cr像块和2个Cb像块构成;另外还有4∶2∶0,4∶4∶4的取样方式。MPEG-2定义3种宏块结构,代表构成一个宏块的亮点像块和色差像块的数量关系。

(6) 像块层(Block):由8×8个像素点构成的DCT变化基本单元。

MPEG-2的编码图像被分为三类,分别称为I帧,P帧和B帧。I帧图像采用帧内编码方式,只利用单帧图像内的空间相关性,而没有利用连续帧之间的时间相关性。P帧和B帧图像采用帧间编码方式,同时利用了空间和时间上的相关性。P帧图像只采用前向时间预测,可以提高压缩效率和图像质量。P帧图像中可以包含帧内编码的部分,即P帧中的每一个宏块可以是前向预测,也可以是帧内编码。B帧图像采用双向时间预测,可以大大提高压缩倍数。

2 基于MPEG-2视频流的剪辑方案

2.1 MPEG-2视频流的构成

MPEG-2视频流分为程序流和传输流两种编码方式。通常用于存储的视频文件都是由程序流构成的。程序流由组首部、系统首部和PES分组构成,程序流的构成如图1所示。

组以一个32位(0x00-00-01-BA)码字开始。组首部包含系统参考时的(SCR)数据,表明了程序流中最后一个解码单元到达解码器的预定时间。系统首部仅存在于第一个图像组中。PES分组由分组首部与分组数据组成。分组的头部包含有分组长度、时间戳PTS,DTS等关键信息。

2.2 剪切点的选择

一个视频序列由一个或多个图像组连接而成。一个图像组内的编码序列可能是 I1 B2 B3 P4 B5 B6 P7 B8 B9 I10,而输出的解码序列是I1 P4 B2 B3 P7 B5 B6 I10 B8 B9。因此,若当前选取的剪切点在一个图像组内部,则牵涉到源视频序列的解码再编码过程。一个简便的方法是将剪切点的起始位置移至一个图像组的起始处,也就是寻找一个I帧作为程序的切入点。因此一对起终点的选择方法如下:

(1) 从当前文件之处读取4个字节,与图组头关键字group_start_code(0x00-00-01-b3)或序列头关键字(0x00-00-01-ba)进行比较,若相同,则记为合适的剪切点。

(2) 若不相同且当前点为剪切的起点,则从文件中向上读取一个字节,重复(1)的过程,直到找到一个合适的切入点。

(3) 若不相同且当前点为剪切的终点,则从文件中向下读取一个字节,重复(1)的过程,直到找到一个合适的切入点。

经过如上的过程,就能够找到一系列的起终点,使得在每一对起终点的区间内包含完整的图像信息,可以独立地从现有帧序列中得到所有的视频信息。避免了因帧之间存在依赖关系,导致图像不能正确解码而生成的马赛克与拖帧现象。

2.3 时间戳的修正

得到图像的信息后,由于已经将不需要的图像信息丢弃,剪辑下来的图像信息已经不能用原有的时间标记回放,所以要修正保留下来的图像的时间戳。

PTS,DTS,SCR被用于解码器中的同步操作。其中PTS(Presentation Timestamp)是一个33位的字节流。表明此分组中第一个访问单元在系统目标解码器中的预定显示时间;DTS(Decoding Time Stamp)也是一个33位的字节流,表示在分组中开始的第一个访问单元预计在系统目标解码器中的解码时间;SCR(System Clock Reference)也是一个33位的字节流,表示系统目标解码器SCR域最后字节到达所需要的时间,编码器用数据码率和90 kHz的时钟频率把SCR字节域转换为SCR值。

将剪切前视频流首部的时间标志(SCR0,PTS0,DTS0)提取出来,替换剪切后第一段文件相对应的数据,依次修改该段文件中的所有SCR,PTS,DTS,并记下最后一组SCR1,PTS1,DTS1,将它们与SCR0,PTS0,DTS0对应相加,作为剪切后第二段文件的起始SCR,PTS,DTS。重复此过程,直到修改完所有的时间戳标记位。

最后,先将源文件的第一个分组中的系统首部等相关信息提取出来,拼接到剪切后的文件头部,再给剪切后的文件尾加上结束码字(0x00-00-01-b9)。

经过以上的过程,一段MPEG-2文件的剪切过程完成。

3 基于DirectShow技术的剪辑方案

3.1 DirectShow简介

DirectX软件开发包是微软公司提供的在Windows操作平台上开发高性能图形、声音、输入、输出和网络游戏的一套编程接口。DirectX被定义为“硬件设备无关性”,可以用与设备无关的方法提供设备相关的高性能。

DirectShow是DirectX中的一套组件,用来处理各种格式媒体文件的回放、音视频采集等多媒体应用。DirectShow的设计初衷是尽量要让应用程序开发人员从复杂的数据传输、硬件差异、同步性等工作中解脱出来,总体应用框架和底层工作由DirectShow来完成。DirectShow的构成如图2所示。

3.2 非线性编辑DES

DES(DirectShow Editing Services)是一套基于DirectShow核心框架的编程接口,它的出现简化了视频编辑任务。DES的系统结构如图3所示。

基于时间线的模型如图4所示。

3.3 实现方法

运用DirectShow的DES方法,实现方案如下:

(1) 首先选定待剪切文件上的起点与终点。以时间为标记,记为startpoint,endpoint。

(2) 为目标文件生成一个时间线对象(TimeLine):

IAMTimeline*pTL=NULL;

CoCreatelnstance(CLSID_IAMTimeline,NULL,CLSCTX_INPROC_SERVER,IID_IAMTimeline,(void* *)&pTL;);

接下来要将时间线上的视频组和音频组的信息填写完整。

(3) 为时间线对像生成一个组,以视频组为例,首先生成一个视频组(video group):

IAMTimelineGroup *pVideoGroup=NULL;

IAMTimelineObj *pVideoGroupObj=NULL;

pTL->CreateEmptyNode(&pVideoGroupObj;,TIMELINE_MAJOR_TYPE_GROUP);

pGroupObj->Querylnterface(IID_IAMTimelineGroup,(void **)&pVideoGroup;);

组是由轨道组成的,所以接下来要为视频组添加轨道(Track):

pVideoComp->VTracklnsBefore(pVideoTrackObj,-1);

pVideoTrackObj->Querylnterface(IID_IAMTimelineTrack,(void **)&pVideoTrack;)

(4) 为轨道添加视频时间点和文件信息:

首先,设置时间线上的时间,这个时间是源文件中的时间点在剪切后的文件中出现的时间:

pVideoSrcObj->SetStartStop(startpoint1,endpoint1);

接下来要设置源媒体的时间,这个时间就是想得到的源媒体文件中的视频信息出现的时间:

pVideoSrcObj->SetMediaTimes(startpoint.endpoint);

还要设置源媒体文件的名字:

pVideoSrcObj->SetMediaName(源媒体文件名)

将信息加入的轨道中:

pVideoTrack->SrcAdd(pVideoSrcObj);

(5) 把时间线对象放入DirectShow回放控制引擎中:

IRenderEngine *pRenderEngine = NULL;

CoCreatelnstance(CLSID_RenderEngine,NULL,CLSCTX_INPROC_SERVER,IID_IRenderEngine,(void**)&pRenderEngine;);

pRender->SetTimelineObject(pTL);

pRenderEngine->ConnectFrontEnd( );

(6) 为时间线对象指定输出信息的压缩方法。DirectShow默认只支持AVI格式的输出,因此,要指定一个自己定义的输出格式,这里选择一个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) 为时间线对象指定输出文件:

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) 启动回放功能:

pGraph->QueryInterface(IID_IMediaControl,(void **)&pControl;);

pControl->Run();

回放时,DirectShow会把输出的数据以MPEG-2的形式输出到指定的文件中去。

最后,当时间线对象的数据流回放完毕后,所生成的就是剪辑完毕的文件了。

4 结 语

通过对比上述两种实现方案,可以得出如下结论:

(1) 基于解析MPEG-2文件视频文件的剪辑方案需要对MPEG-2格式内容进行深入的了解,程序的设计与实现的复杂度很高,而通过DirectShow技术则大大简化了这种复杂性。

(2) DirectShow本身的开放性框架使得它可以处理更多更复杂的媒体内容,通过给它接上不同的目标输出控制单元,可以处理更多格式类型媒体文件。

(3) 通过DirectShow框架,设计人员可以从繁杂的背景知识的学习中解脱出来,从而更加专注于视频的应用处理中,这无疑使它更容易为应用人员所掌握。

参考文献

[1]陆其明.DirectShow开发指南[M].北京:清华大学出版社,2003.

[2]Microsoft Corporation.DirectX 9.0 Programmerps Reference[CP/DK].2002.

[3]余兆明.MPEG标准及其应用[M].北京:北京邮电大学出版社,2002.

[4]陆其明.DirectShow 实务精选[M].北京:科学出版社,2004.

[5]张勇,罗静.基于DirectShow的多媒体文件音视频的重新压缩[J].现代电视技术,2005(5):87-91.

[6]杨欣颖.非线性视频编辑技术在多媒体课件制作中的处理与应用[J].文教资料,2006(21):183-184.

[7]胡春华,曹元大,张磊.基于DirectShow的视频流媒体存储系统的设计与实现[J].计算机工程与设计,2003(11):31-33.

[8]胡海峰,陈喜,张文渊,等.DirectShow非线性音频-视频编辑应用的实现[J].微计算机应用,2004,25(1):58-63.

[9]徐燃,潘接林.DirectShow技术在音频格式转换及音视频分离方面的应用[J].计算机应用,2005(Z1):269-272.

[10]丰伟伟.DirectShow播放视频和MP3[J].电脑编程技巧与维护,2006(12):15-17.

猜你喜欢

宏块音视频字节
No.8 字节跳动将推出独立出口电商APP
3KB深圳市一禾音视频科技有限公司
No.10 “字节跳动手机”要来了?
WIFI音视频信号传输的关键问题探究
简谈MC7字节码
高速公路整合移动音视频系统应用
基于选择特征宏块的快速视频稳像
Roland专业音视频新技术研讨会在上海召开
基于宏块合并的H.264模式选择算法
一种适合硬件实现的低复杂度MAD预测算法