基于FFmpeg开源组件的视频自动转码

2014-04-03 05:58程会敏周恕义李小勇陈圣奇
中国现代教育装备 2014年7期
关键词:转码视频文件自动

程会敏 周恕义 李小勇 陈圣奇

北京工业大学 北京 100124

随着Internet和多媒体通信业务的发展,网络视频的应用越来越广泛,在教育领域中的应用也达到前所未有的高度,如各商业网站的视频公开课、国家级视频公开课以及近期正在进行的国家级精品资源共享课等平台。但是视频资源的应用面临3个问题:(1)用户接入网络的形式多样化,这些不同的网络具有不同的信道特征,如带宽等;(2)不同的用户端,如手持计算机、Pda、机顶盒等具有不同的计算和显示能力;(3)在现有视频资源格式不统一的情况下,如何根据用户的网络特征以及终端设备的特性,提供匹配的视频资源将直接影响到资源的应用效果。鉴于以上问题,需要对视频文件进行转码。为确保转换的效率和稳定性,笔者在学校服务器端运行一个程序对视频文件进行定时检测和处理。这样可以避免访问高峰期由于客户端同时调用服务器上的多个视频处理程序,给服务器造成负担[1]。该程序利用FFmpeg开源组件对视频文件进行转码操作[2-4],以下分别介绍FFmpeg组件和自动转码功能实现。

1 FFmpeg组件

FFmpeg是一个开源编解码框架,是在Linux下开发出来的,但它可以在包括Windows在内的大多数操作系统中编译。它提供了录制、转换以及流化音视频的完整解决方案,并包含了非常先进的音频/视频编解码库libavcodec[5,6],可以轻易实现多种视频格式之间的相互转换,例如:可以将摄录的avi视频等转成现在视频网站常用的flv格式。FFmpeg除包含视频格式转换功能外,还具有视频采集、视频抓图、给视频加水印等功能。在转码过程中对视频抓图,便于进行视频宣传;给视频添加水印以达到版权保护的目的[7,8]。在自动转码的实现中,利用FFmpeg完成视频文件的转换。

2 自动转码功能的实现

该系统提供了一个视频自动批量转码的平台,通过该平台,用户可以指定转换时间段,即转换的开始时间和结束时间,转码参数以及视频文件的源目录和目标目录。用户指定以上信息后,系统会启动定时器,当到达开始时间时,系统会自动遍历指定的视频源目录,检测源目录包括其子目录下是否有未转换的视频文件,如果有未转换的视频文件且未到结束时间,系统会调用FFmpeg组件,根据配置文件中的转码参数对视频文件进行转换,并根据转换成功与否生成相应的日志文件;如果有未转换的视频文件但到达结束时间时,系统就会停止执行转码任务和检测源目录,并等待下一次开始时间;如果没有要转换的视频文件,无论是否到达结束时间,都不会调用检测模块和转码模块。其流程如图1所示:

图1 自动转码流程

笔者从5个基本模块对自动转码功能的实现进行说明。

2.1 信息输入模块

该模块提供信息输入接口,包括执行转换任务的起始时间和结束时间、视频源目录、目标文件目录以及所选择的转码配置名称。程序启动后,用户可在前台页面中更改或者添加以上信息,并保存到属性文件中(如图2所示):

图2 信息输入界面

2.2 自动触发模块

该模块调用用户输入且保存在属性文件中的时间参数,记录下执行转换任务的起始时间和结束时间,并与当前的时间进行比较,当满足起始时间时调用检测模块执行转换任务,满足结束时间时,停止检测目录,并允许正在转换的任务继续执行直到结束。该模块通过监听器(Listener)和定时器(Timer)实现。定时器采用了Java JDK中提供的Timer定时器,定时调度所拥有的TimerTasks。一个TimerTask实际上是一个拥有run方法的类,需要定时执行的代码放到run方法体内,其大致实现如下所示:

2.3 检测模块

该模块主要实现对用户指定的目录及其子目录进行检测,当发现有未转换的视频文件且没有到结束时间时,调用视频转码模块执行转码任务。其中目录中已经转换成功的视频文件不会被删除,并存在一个与之对应的同名的并以.ok为后缀的属性文件,该文件记录了视频转换成功后文件的存放位置和转换时间。

2.4 视频转码模块

该模块为核心模块,根据用户指定的转码配置名称,获取相应的转码参数,利用开源工具FFmpeg对视频文件进行批量转换。系统默认每次可启动FFmpeg的进程上限为3,即每次最多启动3个FFmpeg进程同时对3个视频文件进行转换,如果其中一个视频文件转换完毕,此时启动的FFmpeg进程数没有达到上限值,在还有视频文件需要转换的情况下,系统将启动一个新的FFmpeg进程对另一个视频文件转码,该上限值也可由用户在信息输入页面手动指定。经过反复调试,我们总结出在执行转换操作时常用的FFmpeg参数(见表1)。

表1 FFmpeg常用参数

以上参数是该系统实现自动转码所必需的,此外在转换过程中,对H264视频编码我们还需添加“-threads 8”参数,使用多线程转码。

针对以上转码参数,系统提供了转码参数的配置页面,允许用户根据自己的需求设定参数并选择相应的转码配置名称对视频文件进行转码,转码参数的配置页面如图3所示:

图3 转码参数配置页面

以上转码参数将被保存到配置文件profile-defs.xml中,参数的定义格式如下:

其中参数contentType和videoVisual中的codec是必须指定的,其他参数可以不指定,contentType指定转换后视频文件的封装格式即后缀名,videoVisual中的codec则指定视频的编码格式。根据以上配置文件中的参数和前台页面中指定的转码配置名称profileID=“所有到MP4”,系统会将指定目录下的视频资源转换成Adobe Flash Player主流播放器支持的MP4格式。例如对源目录下的“0806.mpg”文件进行转换操作,系统获取参数后启动FFmpeg进程并执行图4所示的命令:

图4

如果用户需要将指定目录下的视频文件转换成其他视频格式,例如手机播放的3gp格式,可根据实际情况配置参数,并在信息输入页面中选择相应的转码配置名称。

2.5 日志生成模块

该模块根据执行转换的时间每天生成一个日志文件,该文件中记录了每次转换的信息,包括转换命令和转换过程中的信息,便于以后对转换失败的情况进行分析。

3 结束语

基于FFmpeg的自动转码的配置比较方便,允许用户自己配置参数,转码参数的提取也比较灵活;可同时启动多个FFmpeg进程对视频文件进行并行批量转换;提供友好的Web界面,使用方便;国家级视频公开课以及国家级精品资源共享课等平台可使用该转码系统在访问非高峰期对视频资源进行定时自动转换,既不影响用户的正常访问,也方便用户学习平台上的视频资源。由于FFmpeg可转换的视频种类有限,例如转换.wmv文件容易出现花屏现象,MEncoder[9]开源工具可转换的视频种类多、质量高,但其转换速度较FFmpeg慢,因此后期可结合MEncoder实现支持更多格式的视频转换,并与当前应用广泛的格式工厂进行转换时间、性能等方面的比较分析,以改善优化该转码平台。

[1] 赵鑫莹.一种基于批处理的服务器端视频转换模块的实现[J].计算机系统应用,2011,20(3):136-139.

[2] 张学武,杨学星,江采.基于H.263的视频编码、解码的研究及软件实现[J].计算机工程与设计,2005,26(9):2491-2493.

[3] 郭奕希.基于Hadoop的视频转码系统设计与实现[D].武汉:华中科技大学,2011.

[4] FFmpeg工程组.FFmpeg的详细说明[DB/OL].http://www.ffmpeg.com.cn/.

[5] 赵鑫莹.一种基于批处理的服务器端视频转换模块的实现[J].计算机系统应用,2011,20(3):136-139.

[6] 张国庆.基于FFmpeg的视频转码与保护系统的设计与实现[D].武汉:华中师范大学,2011.

[7] 黄诗文.基于FFmpeg的高性能高清流媒体播放器软件设计[D].杭州:浙江大学,2012.

[8] 任严,韩臻,刘丽.基于FFMPEG的视频转换与发布系统[J].计算机工程与设计,2007,28(20):4962-4963,4967.

[9] 黄丽福,陈锋,缪文.高清视频编码和编解码器MEncoder的研究[J].福建电脑,2007(4):35-36,38.

猜你喜欢
转码视频文件自动
流媒体视频文件相似性识别的方法
随心定制视频文件的缩略图
天津台新闻云系统外来视频文件转码方案
视频转码技术在广播电视中的应用研究
自动捕盗机
视频转码软件的需求和框架分析
快速检索,抓取电影中的精彩篇章
让小鸭子自动转身
自动摇摆的“跷跷板”
关于自动驾驶