APP下载

基于FFmpeg的DES视频剪辑技术的研究与应用

2016-07-10刘蒙

电子技术与软件工程 2016年7期

刘蒙

FFmpeg以其丰富的编解码库和强大的解码能力著称,DES(DirectShow Editing Service)是非常方便的基于DirectShow的非线性视频编辑接口。然而由于DES技术在解码方面的局限性,实际应用中很少使用它。本文提出一种基于DirectShow Filter开发技术封装FFmpeg解码库的技术,实现了结合DES技术剪辑视频的视频处理系统,即弥补了DES解码方面的缺陷,又能体现DES技术便于开发、使用简单的特性。

【关键词】FFmpeg DES DirectShow Filter

1 相关背景

视频技术的发展、视频压缩标准的推陈出新以及应用在多种场景中的视频显示的大量要求,视频解码技术的研究随之不断深入。一方面,实际应用中需要根据需求选取最适合的解码方法;一方面,视频剪辑技术在各种体育项目中的应用也愈加的普遍,这种技术一般具有一定的解码局限性,需要与具体的解码器适配。

目前几乎所有的主流多媒体播放器都是基于开源多媒体框架ffmpeg来做的,FFmpeg几乎覆盖全部视频格式。DirectShow开发框架是微软公司提供的针对流媒体控制的解决方案,它总体的应用框架和底层工作由DirectShow来完成,为用户自定义的解决方案提供了底层流控制框架,从而使用户可以自行创建支持新的文件格式或其它用途的DirectShow组件。

DES非线性视频剪辑技术是基于DirectShow开发框架的一个核心编程框架的接口,使得音视频的编辑工作更加方便、快捷,大大提高了开发效率。但是DES视频剪辑技术在视频解码方面存在缺陷,一些特殊编码格式的视频由于不能采用此技术播放而无法剪辑。本文介绍的基于FFmpeg的DES视频剪辑系统很好的处理了这一问题。

2 基于FFmpeg的DirectShow Filter解码器实现

FFmpeg视频解码内核是通过封装FFmpeg中的解码功能为解码Filter而实现的。设计一个H.264视频解码器就是设计一个能实现H.264视频解码功能的DirectShow Filter。从Filter Graph的设计和功能定义上分析,H.264 解码Filter是一种Transform Filter,有一个输入Pin和一个输出Pin。

综合考虑各种因素,决定采用CSource作为Filter基类,因为CSource的输出Pin是从CSourceStream派生的,CSourceStream已经实现了一个县城,在这个线程中可以控制整个编码过程。Filters框架类的编程关系如图1所示。

基类选好后接着就是应用控制类的实现,设计一个控制类实现系统初始化、反初始化、调用解码算法解码、解码输出等函数。

H.264解码Filter的功能主要在于控制模块、输入输出Pin的处理、视频算法处理、过滤器处理和过滤器的注册等几部分构成。创建一个CH264MengInputPin类重写几个重要的基类函数:Receive、BeginFlush、NewSegment和CheckMediaType等。设计一个用作处理H.264视频的CMengH264Filter类,它主要实现的基类函数有FindPin、Stop、GetPinCount、GetPin和Pause等,其中还实现了输入输出Pin委托的功能。

H.264标准解码Filter结构如图2所示。

3 DES结合FFmpeg实现视频剪辑系统

本文所述的视频剪辑系统的实现首先需要建立DES时间线模型,然后针对视频剪辑需要事先查看的要求(这里就用到了前文所诉的解码Filter),实现剪辑视频预览的功能,最后在建立文件保存剪辑好的视频文件。

3.1 DirectShow Editing Service时间线的构建

构建时间线模型需要调用系统提供的一个虚接口(没有具体的实现,只提供函数名称表示,供应用层调用)即时间线接口IAMTimeline,遵循时间线的结构模型,定义实际所需的属性和函数,并且创建出时间线对象。其中主要属性包括组(Group)、集合(Composition)、轨道(Track)和媒体源(Source)。

根据接口提供的方法创建时间线对象时间线框架,根据实际需要在“树形”时间线结构的框架上填充“枝叶”。“枝叶”便是DES对象,需要使用虚接口中的方法CreateEmptyNode来定义,包括:IAMTimelineGroup、IAMTimelineComp、IAMTimelineTrack、 IAMTimelineSrc。其中每个对象都需要创建视频和音频两种。下一步就是要在组中加入轨道,然后实现视频剪切过程。设置媒体源的剪切时间和其在时间线上的时间,将其放到相应的轨道上。

3.2 DirectShow Editing Service预览功能的实现

实现视频剪辑的预览功能需要在创建好时间线模型后创建基本渲染引擎IRenderEngine,它能通过已经建立好的时间线构建Filter Graph供预览或者输出文件。需把时间线的信息传递给IRenderEngine。接下来使用ConnectFrontEnd函数,连接时间线模型建立时建立的滤波器(Filter),调用RenderOutputPins完成滤波器图的构建。最后调用IMediaControl接口的Run()函数就可以进行实现预览的功能。

3.3 DirectShow Editing Service保存功能实现

视频剪辑功能完成之后,最后就是要实现保存的功能。由于之前时间线模型的创建完成以后上一级的数据流输出是非压缩的音频流和视频流,然而根据实际需要,保存在存储介质上的视频数据必须是压缩以后的数据。所以必须向滤波器图中加入音频编码器和视频编码器以及复用器。

首先将视频编码器、音频编码器和复用器以及文件写入程序滤波器加入到滤波器图中,然后得到组的个数及输出引脚指针,根据引脚的媒体类型将其连接到相应的编码器上,接着将视频编码器和音频编码器滤波器连接到复用器滤波器上,下一步连接复用器和文件写入程序滤波器, 最终的视频保存和预览功能一样,调用DirectShow提供的IMediaControl接口的Run()函数。

4 结束语

结合DES非线性编辑技术的视频处理分析系统的项目实现了针对MTS格式视频文件剪辑处理的便捷开发。系统支持快放慢放、多剪辑插播、过渡效果和剪辑效果预览功能。此系统扩展性强,可以适配多种Filter解码器进行相应的视频剪辑。

参考文献

[1]李闪闪,王洪玉.H.264视频解码过滤器的设计与实现[C].2010年通信理论与信号处理学术年会论文集,2010,08-20.

[2]郭映月,黄焱.基于DirectShow/DES的MPEG-2音视频编辑软件的实现方案[J].广播与电视技术,2006,09-30.

[3]王彤,殷福亮.基于FFmpeg的H.264解码器实现[D].沈阳:大连理工大学(硕士论文),2011-11-09.

[4]谭毅,黄欢,刘辉.基于DirectShow的视频压缩系统的设计与实现[J].计算机与数字工程,2006,06-20.

[5]于洋,宿富林.基于DirectShow的多线程AVS转码器的研究与实现[D].哈尔滨:哈尔滨工业大学(硕士论文),2009,06-01.

作者单位

中国海洋大学信息科学与工程学院 山东省青岛市 266100