胡銳,胡伏原,陳麗春
(1.蘇州科技大學(xué)網(wǎng)絡(luò)與教育技術(shù)中心,江蘇蘇州215009;2.蘇州科技大學(xué)電子與信息工程學(xué)院,江蘇蘇州215009;3.中國(guó)電信股份有限公司吳江分公司,江蘇蘇州215200)
基于Hadoop的分布式視頻轉(zhuǎn)碼系統(tǒng)的研究與設(shè)計(jì)
胡銳1,胡伏原2,陳麗春3
(1.蘇州科技大學(xué)網(wǎng)絡(luò)與教育技術(shù)中心,江蘇蘇州215009;2.蘇州科技大學(xué)電子與信息工程學(xué)院,江蘇蘇州215009;3.中國(guó)電信股份有限公司吳江分公司,江蘇蘇州215200)
視頻轉(zhuǎn)碼是視頻錄制到播放不可或缺的一個(gè)重要環(huán)節(jié)之一,然而單機(jī)版視頻轉(zhuǎn)碼耗時(shí)長(zhǎng),特別是大視頻轉(zhuǎn)碼。該文采用一種基于Hadoop的分布式視頻轉(zhuǎn)碼系統(tǒng),使用Hadoop的MapReduce分布式框架,通過(guò)JNI對(duì)FFmpeg庫(kù)的調(diào)用,實(shí)現(xiàn)分布式的視頻轉(zhuǎn)碼。實(shí)驗(yàn)結(jié)果,相比單機(jī)版視頻轉(zhuǎn)碼,分布式視頻轉(zhuǎn)碼有明顯的優(yōu)勢(shì)。
Hadoop;視頻轉(zhuǎn)碼;FFmpeg;分布式
近年來(lái),隨著視頻應(yīng)用的增加,人們?cè)絹?lái)越趨向觀看視頻娛樂(lè),比如國(guó)內(nèi)土豆、優(yōu)酷等,國(guó)外YouTube;通過(guò)觀看視頻進(jìn)行學(xué)習(xí),比如網(wǎng)易公開(kāi)課、Mooc等。視頻需求量越來(lái)越多。由于視頻播放的需求具有多樣性,因此,需要進(jìn)行轉(zhuǎn)碼的需求量也越來(lái)越多。由于單機(jī)版視頻轉(zhuǎn)碼耗時(shí)較長(zhǎng),服務(wù)器資源占用高,如何降低視頻轉(zhuǎn)碼所需時(shí)間,提高轉(zhuǎn)碼效率,是視頻轉(zhuǎn)碼發(fā)展必須解決的問(wèn)題。
筆者提出基于Hadoop的分布式視頻轉(zhuǎn)碼系統(tǒng),是在Hadoop的架構(gòu)基礎(chǔ)上,通過(guò)MapReduce編程框架,將轉(zhuǎn)碼任務(wù)分布到節(jié)點(diǎn)上,在Map函數(shù)里調(diào)用FFmpeg庫(kù)實(shí)現(xiàn)轉(zhuǎn)碼,進(jìn)而實(shí)現(xiàn)了分布式的視頻轉(zhuǎn)碼。
1.1 Hadoop
Hadoop是一個(gè)分布式系統(tǒng)基礎(chǔ)架構(gòu),它可以分布式地操縱大量數(shù)據(jù)。用戶可以在不了解分布式底層細(xì)節(jié)的情況下,開(kāi)發(fā)分布式程序,充分利用集群的高速運(yùn)算和存儲(chǔ)能力[1]。Hadoop主要包括兩個(gè)部分:HDFS(Hadoop Distributed File System)和MapReduce。最底層是HDFS,它存儲(chǔ)Hadoop集群中所有存儲(chǔ)節(jié)點(diǎn)上的文件,HDFS的上一層是MapReduce引擎,該引擎由JobTracker和TaskTrackers組成[2]。HDFS是一個(gè)分布式文件存儲(chǔ)系統(tǒng),包括NameNode和DataNode,NameNode提供元數(shù)據(jù)服務(wù),負(fù)責(zé)管理,DataNode為HDFS提供存儲(chǔ)塊。為了避免機(jī)器故障給數(shù)據(jù)帶來(lái)毀滅性的災(zāi)難,HDFS將文件分塊,且每個(gè)數(shù)據(jù)塊以多個(gè)數(shù)據(jù)副本的形式存儲(chǔ)在多個(gè)數(shù)據(jù)節(jié)點(diǎn)上[3]。MapReduce是Google提出的分布式并行計(jì)算編程模型,用于大規(guī)模數(shù)據(jù)的并行處理[4]。MapReduce在功能上實(shí)現(xiàn)將一個(gè)任務(wù)分割成多個(gè)Key/Value對(duì)形式的子任務(wù),并把子任務(wù)Map到多個(gè)節(jié)點(diǎn)上進(jìn)行并行處理,之后以單個(gè)數(shù)據(jù)集的形式加載(Reduce)返回任務(wù)結(jié)果。Map階段對(duì)數(shù)據(jù)進(jìn)行并行處理,Reduce階段對(duì)Map階段的結(jié)果進(jìn)行合并,得到最終結(jié)果[5]。
1.2 FFmpeg
FFmpeg是一款強(qiáng)大的音視頻編碼器與解碼器的集合,支持多種文件格式。FFmpeg是一個(gè)開(kāi)源免費(fèi)跨平臺(tái)的視頻和音頻流方案,屬于自由軟件,采用LGPL或GPL許可證(依據(jù)選擇的組件)可以自由獲取所有FFmpeg的源代碼[6]。FFmpeg是將音視頻的錄制、格式轉(zhuǎn)換以及流化綜合為一身的解決方案,可以將音視頻
文件轉(zhuǎn)化為流,然后進(jìn)行處理[7]。
基于FFmpeg的視頻轉(zhuǎn)碼開(kāi)發(fā)主要用到如下4個(gè)常用庫(kù)文件:libavcodec、libavformat、libavutil和libswscale。其中,libavcodec是目前領(lǐng)先的的音頻/視頻編解碼庫(kù),用于存放編/解碼各種類型音/視頻的模塊;libavformat具有讀取音視頻幀、獲取解碼所需信息以生成解碼上下文結(jié)構(gòu)等功能,主要用于存放各種音/視頻封裝格式的復(fù)用/解復(fù)用模塊;libavutil包含一些公共的工具函數(shù),用于存放內(nèi)存操作等模塊;libswscale主要用來(lái)處理色彩映射的轉(zhuǎn)換以及視頻場(chǎng)景的比例縮放[8]。
2.1 系統(tǒng)架構(gòu)
文中所設(shè)計(jì)的基于Hadoop的分布式視頻轉(zhuǎn)碼系統(tǒng),可以實(shí)現(xiàn)多種視頻格式的轉(zhuǎn)換。分布式視頻轉(zhuǎn)碼系統(tǒng),分為三個(gè)部分:視頻分割、視頻轉(zhuǎn)碼和視頻合并。整個(gè)系統(tǒng)架構(gòu)如圖1所示。
圖1 系統(tǒng)整體架構(gòu)
(1)視頻分割是實(shí)現(xiàn)一個(gè)待轉(zhuǎn)碼視頻文件分割成多個(gè)視頻小文件,并將分割后的小文件寫入HDFS;
(2)視頻轉(zhuǎn)碼是在Hadoop的MapReduce的Map階段,通過(guò)調(diào)用第三方視頻轉(zhuǎn)碼庫(kù)FFmpeg將多個(gè)視頻小文件轉(zhuǎn)換為對(duì)應(yīng)格式的視頻小文件;
貴州蘋果主產(chǎn)區(qū)喬化砧蘋果主要采用小冠疏層形和自由紡錘形。小冠疏層形是在疏散分層形的基礎(chǔ)上改進(jìn)而成的適宜中密度栽植的中冠樹(shù)形,全樹(shù)有2層主枝,小冠疏層形的整形修剪要點(diǎn)可以參照疏散分層形。自由紡錘形有直立而長(zhǎng)勢(shì)強(qiáng)健的中央領(lǐng)導(dǎo)干,在主干上均勻分布的主枝8~12個(gè),長(zhǎng)勢(shì)均衡,呈螺旋式上升排列。
(3)視頻合并是在Hadoop的MapReduce的Reduce階段,將已經(jīng)轉(zhuǎn)碼完成后的多個(gè)視頻小文件合并成一個(gè)視頻文件,并將合并的視頻文件寫入到HDFS,給用戶提供相關(guān)的視頻文件地址。
2.2 視頻分割
一般視頻文件都是經(jīng)過(guò)壓縮的,根據(jù)H.264的不同類別,視頻編碼器會(huì)使用類型不同的幀。視頻幀可以為分:IF、PF和BF。IF為關(guān)鍵幀是GOP的第一個(gè)幀,保留了一個(gè)場(chǎng)景的所有信息;PF是單項(xiàng)預(yù)測(cè)幀,只保留了與前一幀的差值;BF是雙向預(yù)測(cè)幀,存儲(chǔ)前后幀的畫面信息。因此,視頻不能隨意分割,必須根據(jù)IF進(jìn)行分割,才保證不丟幀及GOP畫面的完整,如圖2所示。
圖2 視頻分割
根據(jù)IF關(guān)鍵幀進(jìn)行分割,視頻分割可以借助于開(kāi)源視頻工具mkvmerge實(shí)現(xiàn),將分割后的視頻塊上傳到Hadoop的HFDS分布式文件系統(tǒng)。
2.3 分布式視頻轉(zhuǎn)碼
通過(guò)Hadoop的MapReduce應(yīng)用,在Mapper函數(shù)中調(diào)用視頻轉(zhuǎn)碼程序,在Reduce函數(shù)中進(jìn)行轉(zhuǎn)碼后視頻的合并工作,如圖3所示。
轉(zhuǎn)碼程序通過(guò)調(diào)用FFmpeg庫(kù)進(jìn)行實(shí)現(xiàn),由于Hadoop是Java語(yǔ)言程序,而FFmpeg庫(kù)是C/C++編寫,所以可使用JNI技術(shù)來(lái)實(shí)現(xiàn)Java調(diào)用FFmpeg庫(kù)進(jìn)行實(shí)視頻轉(zhuǎn)碼工作,如圖4所示。
圖3 分布式視頻轉(zhuǎn)碼流程
圖4 JNI調(diào)用接口
編譯FFmpeg庫(kù)會(huì)生成相應(yīng)的JNI.h文件com_transcoding_jni_JNI.h,在對(duì)應(yīng)的C文件(com_transcoding_ jni_JNI.c)里,手動(dòng)添加調(diào)用FFmpeg庫(kù)里的函數(shù),格式為:JNICALLJava_com_transcoding_jni_JNI_XXXXX,工作流程如圖5所示。調(diào)用FFmpeg庫(kù)的核心函數(shù)如下:
av_read_frame()//函數(shù)功能讀取碼流中的視頻一幀或音頻若干幀;
avcodec_decode_video2()//函數(shù)功能解碼一幀視頻數(shù)據(jù);
avcodec_encode_video2()//函數(shù)功能重新編碼一幀視頻數(shù)據(jù),實(shí)現(xiàn)轉(zhuǎn)碼功能。
視頻轉(zhuǎn)碼的步驟是先解碼,后編碼。解碼的實(shí)現(xiàn)首先是通過(guò)調(diào)用av_read_frame()讀取碼流中的音頻若干幀或者視頻一幀;其次,通過(guò)調(diào)用avcodec_decode_video2()解碼一幀視頻數(shù)據(jù)(例如,輸入一個(gè)壓縮編碼的結(jié)構(gòu)體AVPacket,輸出一個(gè)解碼后的結(jié)構(gòu)體AVFrame),編碼的實(shí)現(xiàn)是通過(guò)調(diào)用avcodec_encode_video2(),將編碼后的結(jié)構(gòu)體AVFrame,編碼為一個(gè)AVPacket;最后,寫入文件。
2.4 視頻合并
通過(guò)Hadoop的MapReduce應(yīng)用,在Reduce函數(shù)中調(diào)用視頻合并程序。在Reduce函數(shù)里通過(guò)JNI調(diào)用FFmpeg庫(kù)里的函數(shù),工作流程如圖6所示,調(diào)用FFmpeg庫(kù)的核心函數(shù)如下:
圖5 轉(zhuǎn)碼流程圖
圖6 視頻合并流程圖
av_read_frame()//函數(shù)功能讀取碼流中的視頻一幀或音頻若干幀;
avcodec_copy_context()//拷貝待合視頻碼流的AVCodecContext到合并的輸出的AVCodecContext;
av_interleaved_write_frame()//合并后AVPacket到輸出文件。
進(jìn)行初始化,打開(kāi)輸入視頻文件,創(chuàng)建輸出文件,根據(jù)輸入來(lái)創(chuàng)建輸入流,調(diào)用Copy函數(shù)拷貝輸入流到輸出流,判斷是否完成一段視頻,設(shè)置pts和dts,寫入到輸出文件,完成一段視頻,進(jìn)入下一段輸入視頻。
文中在一臺(tái)32核CPU,128內(nèi)存的Dell PowerEdge R920服務(wù)器上創(chuàng)建了8個(gè)虛擬機(jī)進(jìn)行性能測(cè)試,Hadoop集群部署,如表1所示。
表1 集群環(huán)境
系統(tǒng)運(yùn)行環(huán)境為Hadoop版本:hadoop-2.2.0;FFmpeg版本:1.0;Java版本:jdk1.7.0_40。
筆者通過(guò)將相同的視頻在單機(jī)通過(guò)FFmpeg命令行進(jìn)行轉(zhuǎn)碼與分布式視頻轉(zhuǎn)碼進(jìn)行對(duì)比實(shí)驗(yàn),數(shù)據(jù)如圖7所示。從圖7可以看出與單機(jī)版相比,隨著轉(zhuǎn)碼視頻增大,分布式轉(zhuǎn)碼效率高,相對(duì)單機(jī)版節(jié)省了一半以上的時(shí)間。
圖7 轉(zhuǎn)碼耗時(shí)對(duì)比
基于Hadoop的分布式視頻轉(zhuǎn)碼系統(tǒng),使用Hadoop的MapReduce編程接口,實(shí)現(xiàn)了分布式框架結(jié)構(gòu),在Map函數(shù)中通過(guò)JNI對(duì)FFmpeg庫(kù)的調(diào)用,實(shí)現(xiàn)分布式的視頻轉(zhuǎn)碼。通過(guò)實(shí)驗(yàn)數(shù)據(jù),可以看出與單機(jī)版視頻轉(zhuǎn)碼相比,分布式視頻轉(zhuǎn)碼有明顯的優(yōu)勢(shì)。
[1]胡銳,胡伏原,陳麗春.基于Hadoop的高校公共數(shù)據(jù)平臺(tái)的構(gòu)建[J].蘇州科技學(xué)院學(xué)報(bào)(自然科學(xué)版),2015,32(3):52-55.
[2]郝樹(shù)魁.Hadoop HDFS和MapReduce架構(gòu)淺析[J].郵電設(shè)計(jì)技術(shù),2012(7):37-42.
[3]羅鵬,龔勛.HDFS數(shù)據(jù)存放策略的研究與改進(jìn)[J].計(jì)算機(jī)工程與設(shè)計(jì),2014,35(4):1127-1131.
[4]李成華,張新訪,金海,等.MapReduce:新型的分布式并行計(jì)算編程模型[J].計(jì)算機(jī)工程與科學(xué),2011,33(3):129-135.
[5]黃潔琛,倪明.基于Hadoop的分布式視頻轉(zhuǎn)碼方案[J].計(jì)算機(jī)工程,2015,41(8):218-222.
[6]覃艷.基于FFMPEG的視頻格式轉(zhuǎn)換技術(shù)研究[J].電腦知識(shí)與技術(shù),2011,7(12):2912-2913.
[7]劉紅,盧程.FFmpeg開(kāi)源項(xiàng)目移植到Android的研究[J].價(jià)值工程,2016,35(4):166-169.
[8]何圓圓,何凱.基于FFmpeg的H.264視頻解碼器的研究與實(shí)現(xiàn)[J].電腦知識(shí)與技術(shù),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
責(zé)任編輯:艾淑艷
2016-08-06
國(guó)家自然科學(xué)基金資助項(xiàng)目(61472267)
胡銳(1986-),男,安徽六安人,助理工程師,碩士,研究方向:大數(shù)據(jù)與物聯(lián)網(wǎng)。
蘇州科技大學(xué)學(xué)報(bào)(自然科學(xué)版)2016年4期