胡锐,胡伏原,陈丽春
(1.苏州科技大学网络与教育技术中心,江苏苏州215009;2.苏州科技大学电子与信息工程学院,江苏苏州215009;3.中国电信股份有限公司吴江分公司,江苏苏州215200)
基于Hadoop的分布式视频转码系统的研究与设计
胡锐1,胡伏原2,陈丽春3
(1.苏州科技大学网络与教育技术中心,江苏苏州215009;2.苏州科技大学电子与信息工程学院,江苏苏州215009;3.中国电信股份有限公司吴江分公司,江苏苏州215200)
视频转码是视频录制到播放不可或缺的一个重要环节之一,然而单机版视频转码耗时长,特别是大视频转码。该文采用一种基于Hadoop的分布式视频转码系统,使用Hadoop的MapReduce分布式框架,通过JNI对FFmpeg库的调用,实现分布式的视频转码。实验结果,相比单机版视频转码,分布式视频转码有明显的优势。
Hadoop;视频转码;FFmpeg;分布式
近年来,随着视频应用的增加,人们越来越趋向观看视频娱乐,比如国内土豆、优酷等,国外YouTube;通过观看视频进行学习,比如网易公开课、Mooc等。视频需求量越来越多。由于视频播放的需求具有多样性,因此,需要进行转码的需求量也越来越多。由于单机版视频转码耗时较长,服务器资源占用高,如何降低视频转码所需时间,提高转码效率,是视频转码发展必须解决的问题。
笔者提出基于Hadoop的分布式视频转码系统,是在Hadoop的架构基础上,通过MapReduce编程框架,将转码任务分布到节点上,在Map函数里调用FFmpeg库实现转码,进而实现了分布式的视频转码。
1.1 Hadoop
Hadoop是一个分布式系统基础架构,它可以分布式地操纵大量数据。用户可以在不了解分布式底层细节的情况下,开发分布式程序,充分利用集群的高速运算和存储能力[1]。Hadoop主要包括两个部分:HDFS(Hadoop Distributed File System)和MapReduce。最底层是HDFS,它存储Hadoop集群中所有存储节点上的文件,HDFS的上一层是MapReduce引擎,该引擎由JobTracker和TaskTrackers组成[2]。HDFS是一个分布式文件存储系统,包括NameNode和DataNode,NameNode提供元数据服务,负责管理,DataNode为HDFS提供存储块。为了避免机器故障给数据带来毁灭性的灾难,HDFS将文件分块,且每个数据块以多个数据副本的形式存储在多个数据节点上[3]。MapReduce是Google提出的分布式并行计算编程模型,用于大规模数据的并行处理[4]。MapReduce在功能上实现将一个任务分割成多个Key/Value对形式的子任务,并把子任务Map到多个节点上进行并行处理,之后以单个数据集的形式加载(Reduce)返回任务结果。Map阶段对数据进行并行处理,Reduce阶段对Map阶段的结果进行合并,得到最终结果[5]。
1.2 FFmpeg
FFmpeg是一款强大的音视频编码器与解码器的集合,支持多种文件格式。FFmpeg是一个开源免费跨平台的视频和音频流方案,属于自由软件,采用LGPL或GPL许可证(依据选择的组件)可以自由获取所有FFmpeg的源代码[6]。FFmpeg是将音视频的录制、格式转换以及流化综合为一身的解决方案,可以将音视频
文件转化为流,然后进行处理[7]。
基于FFmpeg的视频转码开发主要用到如下4个常用库文件:libavcodec、libavformat、libavutil和libswscale。其中,libavcodec是目前领先的的音频/视频编解码库,用于存放编/解码各种类型音/视频的模块;libavformat具有读取音视频帧、获取解码所需信息以生成解码上下文结构等功能,主要用于存放各种音/视频封装格式的复用/解复用模块;libavutil包含一些公共的工具函数,用于存放内存操作等模块;libswscale主要用来处理色彩映射的转换以及视频场景的比例缩放[8]。
2.1 系统架构
文中所设计的基于Hadoop的分布式视频转码系统,可以实现多种视频格式的转换。分布式视频转码系统,分为三个部分:视频分割、视频转码和视频合并。整个系统架构如图1所示。
图1 系统整体架构
(1)视频分割是实现一个待转码视频文件分割成多个视频小文件,并将分割后的小文件写入HDFS;
(2)视频转码是在Hadoop的MapReduce的Map阶段,通过调用第三方视频转码库FFmpeg将多个视频小文件转换为对应格式的视频小文件;
贵州苹果主产区乔化砧苹果主要采用小冠疏层形和自由纺锤形。小冠疏层形是在疏散分层形的基础上改进而成的适宜中密度栽植的中冠树形,全树有2层主枝,小冠疏层形的整形修剪要点可以参照疏散分层形。自由纺锤形有直立而长势强健的中央领导干,在主干上均匀分布的主枝8~12个,长势均衡,呈螺旋式上升排列。
(3)视频合并是在Hadoop的MapReduce的Reduce阶段,将已经转码完成后的多个视频小文件合并成一个视频文件,并将合并的视频文件写入到HDFS,给用户提供相关的视频文件地址。
2.2 视频分割
一般视频文件都是经过压缩的,根据H.264的不同类别,视频编码器会使用类型不同的帧。视频帧可以为分:IF、PF和BF。IF为关键帧是GOP的第一个帧,保留了一个场景的所有信息;PF是单项预测帧,只保留了与前一帧的差值;BF是双向预测帧,存储前后帧的画面信息。因此,视频不能随意分割,必须根据IF进行分割,才保证不丢帧及GOP画面的完整,如图2所示。
图2 视频分割
根据IF关键帧进行分割,视频分割可以借助于开源视频工具mkvmerge实现,将分割后的视频块上传到Hadoop的HFDS分布式文件系统。
2.3 分布式视频转码
通过Hadoop的MapReduce应用,在Mapper函数中调用视频转码程序,在Reduce函数中进行转码后视频的合并工作,如图3所示。
转码程序通过调用FFmpeg库进行实现,由于Hadoop是Java语言程序,而FFmpeg库是C/C++编写,所以可使用JNI技术来实现Java调用FFmpeg库进行实视频转码工作,如图4所示。
图3 分布式视频转码流程
图4 JNI调用接口
编译FFmpeg库会生成相应的JNI.h文件com_transcoding_jni_JNI.h,在对应的C文件(com_transcoding_ jni_JNI.c)里,手动添加调用FFmpeg库里的函数,格式为:JNICALLJava_com_transcoding_jni_JNI_XXXXX,工作流程如图5所示。调用FFmpeg库的核心函数如下:
av_read_frame()//函数功能读取码流中的视频一帧或音频若干帧;
avcodec_decode_video2()//函数功能解码一帧视频数据;
avcodec_encode_video2()//函数功能重新编码一帧视频数据,实现转码功能。
视频转码的步骤是先解码,后编码。解码的实现首先是通过调用av_read_frame()读取码流中的音频若干帧或者视频一帧;其次,通过调用avcodec_decode_video2()解码一帧视频数据(例如,输入一个压缩编码的结构体AVPacket,输出一个解码后的结构体AVFrame),编码的实现是通过调用avcodec_encode_video2(),将编码后的结构体AVFrame,编码为一个AVPacket;最后,写入文件。
2.4 视频合并
通过Hadoop的MapReduce应用,在Reduce函数中调用视频合并程序。在Reduce函数里通过JNI调用FFmpeg库里的函数,工作流程如图6所示,调用FFmpeg库的核心函数如下:
图5 转码流程图
图6 视频合并流程图
av_read_frame()//函数功能读取码流中的视频一帧或音频若干帧;
avcodec_copy_context()//拷贝待合视频码流的AVCodecContext到合并的输出的AVCodecContext;
av_interleaved_write_frame()//合并后AVPacket到输出文件。
进行初始化,打开输入视频文件,创建输出文件,根据输入来创建输入流,调用Copy函数拷贝输入流到输出流,判断是否完成一段视频,设置pts和dts,写入到输出文件,完成一段视频,进入下一段输入视频。
文中在一台32核CPU,128内存的Dell PowerEdge R920服务器上创建了8个虚拟机进行性能测试,Hadoop集群部署,如表1所示。
表1 集群环境
系统运行环境为Hadoop版本:hadoop-2.2.0;FFmpeg版本:1.0;Java版本:jdk1.7.0_40。
笔者通过将相同的视频在单机通过FFmpeg命令行进行转码与分布式视频转码进行对比实验,数据如图7所示。从图7可以看出与单机版相比,随着转码视频增大,分布式转码效率高,相对单机版节省了一半以上的时间。
图7 转码耗时对比
基于Hadoop的分布式视频转码系统,使用Hadoop的MapReduce编程接口,实现了分布式框架结构,在Map函数中通过JNI对FFmpeg库的调用,实现分布式的视频转码。通过实验数据,可以看出与单机版视频转码相比,分布式视频转码有明显的优势。
[1]胡锐,胡伏原,陈丽春.基于Hadoop的高校公共数据平台的构建[J].苏州科技学院学报(自然科学版),2015,32(3):52-55.
[2]郝树魁.Hadoop HDFS和MapReduce架构浅析[J].邮电设计技术,2012(7):37-42.
[3]罗鹏,龚勋.HDFS数据存放策略的研究与改进[J].计算机工程与设计,2014,35(4):1127-1131.
[4]李成华,张新访,金海,等.MapReduce:新型的分布式并行计算编程模型[J].计算机工程与科学,2011,33(3):129-135.
[5]黄洁琛,倪明.基于Hadoop的分布式视频转码方案[J].计算机工程,2015,41(8):218-222.
[6]覃艳.基于FFMPEG的视频格式转换技术研究[J].电脑知识与技术,2011,7(12):2912-2913.
[7]刘红,卢程.FFmpeg开源项目移植到Android的研究[J].价值工程,2016,35(4):166-169.
[8]何圆圆,何凯.基于FFmpeg的H.264视频解码器的研究与实现[J].电脑知识与技术,2012,8(35):8519-8521.
Research and design of distributed video transcoding system based on Hadoop
HU Rui1,HU Fuyuan2,CHEN Lichun3
(1.Network and Educational Technology Center,SUST,Suzhou 215009,China;2.School of Electronic&Information Engineering,SUST,Suzhou 215009,China;3.Wujiang Branch of China Telecom Co.,Ltd,Suzhou 215200,China)
Video transcoding plays a vital role in the process of video recording and video play.The single version of the video transcoding is time-consuming.Therefore,this paper proposes a distributed video transcoding system based on Hadoop,which employs MapReduce distributed framework and JNI.The experiments show that the distributed video transcoding system has obvious advantages over the single video transcoding.
Hadoop;video transcoding;FFmpeg;distribution
TP393
A
1672-0687(2016)04-0057-05
责任编辑:艾淑艳
2016-08-06
国家自然科学基金资助项目(61472267)
胡锐(1986-),男,安徽六安人,助理工程师,硕士,研究方向:大数据与物联网。