李凱+段良濤+董林林
摘要:隨著科學(xué)技術(shù)的發(fā)展,用戶對(duì)視頻訪問(wèn)的需求也與日俱增,有效存儲(chǔ)和管理海量的視頻文件,為用戶提供更好的體驗(yàn),越來(lái)越引起人們的關(guān)注。Hadoop則提供了一種新的思路,通過(guò)Hadoop的HDFS和ffmpeg的結(jié)合,視頻的轉(zhuǎn)碼和存儲(chǔ)得到了更好的效果。
關(guān)鍵詞:Hadoop ;視頻; 轉(zhuǎn)碼;存儲(chǔ)
中圖分類號(hào):TP37 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):1009-3044(2015)30-0157-03
Research for Transcoding and Storage of Videos Based on Hadoop
LI Kai 1, DUAN Liang-tao2 , DONG Lin-lin2
(College of Computer Engineering, Qingdao Technological University, Qingdao 266033, China)
Abstract: With the development of science and technology ,the demands of the users for video access are more and more .It is more and more attact peoples attention that the effective storage and management of video files and providing users with better experience.Hadoop provides a new train of thought. Through the combination of Hadoop HDFS function and ffmpeg,the transcoding and storage of the videos obtain the better effect.
Key words: Hadoop; videos; transcoding; storage
隨著移動(dòng)互聯(lián)網(wǎng)的迅猛發(fā)展,與之相應(yīng)的視頻app也越來(lái)越多,網(wǎng)絡(luò)帶寬狀況也都不相同,終端的播放設(shè)備和軟件的千差萬(wàn)別便成了困擾視頻應(yīng)用的難題;隨著電信網(wǎng),互聯(lián)網(wǎng)和廣播電視網(wǎng)的三網(wǎng)融合的發(fā)展,更要求視頻在三個(gè)平臺(tái)上都能播放,因此視頻編碼格式需要進(jìn)行轉(zhuǎn)換。由于用戶和網(wǎng)絡(luò)環(huán)境都比較復(fù)雜,特別是像視頻點(diǎn)播這樣的應(yīng)用,對(duì)海量視頻進(jìn)行轉(zhuǎn)碼的需要更大,否則不能滿足多樣化終端環(huán)境和不同網(wǎng)絡(luò)的需求。視頻轉(zhuǎn)碼業(yè)務(wù)面臨越來(lái)越嚴(yán)峻的問(wèn)題:海量化的視頻數(shù)據(jù),多平臺(tái)的視頻應(yīng)用,多樣性的視頻編碼標(biāo)準(zhǔn)。[1]
針對(duì)上述問(wèn)題,首先必須有效地存儲(chǔ)和管理視頻數(shù)據(jù),才能為用戶提供良好的下載、播放等服務(wù),Hadoop和ffmpeg為我們提供了新的思路。
1 相關(guān)知識(shí)
Hadoop是一種可以對(duì)海量數(shù)據(jù)進(jìn)行分布式處理的軟件框架。Hadoop對(duì)數(shù)據(jù)的處理有可靠、高效、可伸縮的特點(diǎn)。HDFS是Hadoop的分布式文件系統(tǒng),是Hadoop的重要組成部分。在使用的時(shí)候,HDFS既能夠作為存儲(chǔ)組件來(lái)配合Hadoop其他組件實(shí)現(xiàn)云功能;也可以單獨(dú)的用來(lái)構(gòu)建集群;通過(guò)Hadoop的HDFS,用戶便能夠開(kāi)發(fā)分布式程序,而不用了解分布式文件系統(tǒng)的底層細(xì)節(jié),充分利用集群的特點(diǎn)進(jìn)行存儲(chǔ)和高速運(yùn)輸。MapReduce是一個(gè)編程模型,也是一個(gè)處理和生成超大規(guī)模數(shù)據(jù)集的算法模型的實(shí)現(xiàn)[2]。map和reduce函數(shù)是其底層過(guò)程。Map函數(shù)負(fù)責(zé)讀取文件分片中的數(shù)據(jù)記錄,把所有的數(shù)據(jù)記錄都轉(zhuǎn)換成鍵值對(duì),并把文件分片的統(tǒng)計(jì)數(shù)據(jù)記錄下來(lái)。Map函數(shù)生成的中間結(jié)果作為Reduce函數(shù)的輸入,它會(huì)根據(jù)鍵以合并方式來(lái)縮小鍵/值對(duì)列表。
FFmpeg擁有領(lǐng)先的音/視頻編碼庫(kù)—libavcodec,是用來(lái)轉(zhuǎn)換、記錄數(shù)字音頻、視頻,并可以將其轉(zhuǎn)化成流的開(kāi)源視頻工具軟件。Ffmpeg雖然是在Linux下開(kāi)發(fā)出來(lái)的,但它能夠在大部分操作系統(tǒng)中編譯,其中就包括Windows系統(tǒng),能夠完成多種視頻格式的相互轉(zhuǎn)換,F(xiàn)FMPEG支持FLV,AC3,DV,DivX,MPEG,MPEG4等40多種編碼,Matroska,ASF,OGG,AVI,MPEG,等90多種解碼[3]。
2 總體架構(gòu)
利用Hadoop平臺(tái)及FFMPEG工具實(shí)現(xiàn)視頻數(shù)據(jù)轉(zhuǎn)儲(chǔ)的架構(gòu)描述如圖1所示[4]:
視頻轉(zhuǎn)儲(chǔ)的流程如下:
1) 本地服務(wù)器獲取源視頻文件,將源視頻文件分割成Chuck_1,Chuck_2,Chuck_3,Chuck_4等視頻片段;
2) 將視頻片段上傳到HDFS;
3) 在Hadoop集群用map對(duì)視頻片段進(jìn)行轉(zhuǎn)碼生成新的視頻片段Chuckm_1,Chuckm_2,Chuckm_3,Chuckm_4等;
4) 利用reduce對(duì)Chuckm_1, Chuckm_2,Chuckm_3,Chuckm_4等視頻片段進(jìn)行合并。
3 模塊實(shí)現(xiàn)
根據(jù)視頻轉(zhuǎn)儲(chǔ)處理流程,系統(tǒng)可以分為視頻分割、視頻轉(zhuǎn)碼、視頻合并、視頻上傳、視頻下載五個(gè)模塊。
3.1視頻分割
ffmpeg分割視頻的指令示例如下:
ffmpeg -ss 00:00:00 -i f.avi -vcodec copy -acodec copy -t 00:06:00 output.avi
首先,調(diào)用Convervideo類,然后調(diào)用getTime()方法獲取視頻的總時(shí)長(zhǎng),再根據(jù)要分割的分片數(shù),獲取每一分片的時(shí)長(zhǎng),最后調(diào)用ffmpeg分割視頻指令對(duì)視頻進(jìn)行分割,并將分割后的視頻路徑寫(xiě)入txt中。
視頻分割流程如圖2所示,分割后的效果圖如圖3所示,
一般來(lái)說(shuō),視頻分片存儲(chǔ)在HDFS上,而視頻轉(zhuǎn)碼是在本地文件系統(tǒng)進(jìn)行的,所以首先需要將視頻分片文件下載到本地。之后map( )函數(shù)接收
視頻合并的ffmpeg指令示例:
ffmpeg -f concat -i /home/hadoop/videotest/codelist.txt -c copy outtest.flv
視頻的合并處理工作是由Reducer的reduce( )函數(shù)完成的。視頻合并過(guò)程如圖6所示:
首先,map()函數(shù)將轉(zhuǎn)碼視頻分片信息傳遞給reduce()函數(shù),reduce( )函數(shù)根據(jù)接收的信息,將轉(zhuǎn)碼視頻分片從目標(biāo)節(jié)點(diǎn)下載到本地,最后調(diào)用視頻處理類的合并方法將視頻合并,把視頻合并結(jié)果上傳至HDFS。reduce函數(shù)不輸出鍵值對(duì)。
3.4視頻上傳
如何實(shí)現(xiàn)通過(guò)云存儲(chǔ)平臺(tái)把文件上傳至HDFS集群,關(guān)鍵是后臺(tái)代碼的編寫(xiě)。這里調(diào)用HDFS的API,使用的是HDFS中DistributedFileSystem的copyFromLocalFile 方法,將本地文件根據(jù)給出的文件路徑上傳到HDFS,最終實(shí)現(xiàn)文件從用戶本地上傳到HDFS集群。
上傳文件調(diào)用的org.apache.hadoop.hdfs.DistributedFileSystem類是繼承的抽象類 org.apache.hadoop.fs.FileSystem??蛻舳巳绻胍M(jìn)行相關(guān)文件操作,訪問(wèn)HDFS集群,必須通過(guò)該類來(lái)實(shí)現(xiàn)。客戶端與集群中NameNode通過(guò)DistributedFileSystem類建立連接,然后與NameNode進(jìn)行通信和相關(guān)交互,調(diào)用DistributedFileSystem類的相關(guān)方法來(lái)完成元數(shù)據(jù)的相關(guān)操作。具體流程圖7所示。
3.5視頻下載
客戶端通過(guò)DistributedFileSystem類與NameNode建立連接,完成元數(shù)據(jù)的相關(guān)操作后,再調(diào)用DistributedFileSystem中的open方法,隨后打開(kāi)HDFS輸入流FSDataInputStream,將HDFS文件輸入流轉(zhuǎn)向本地文件輸出流,利用copyToLocalFile方法便實(shí)現(xiàn)了文件從HDFS集群到本地的下載過(guò)程。具體流程如圖8所示:
4 結(jié)論
隨著互聯(lián)網(wǎng)的迅猛發(fā)展,云存儲(chǔ)、云計(jì)算成為了國(guó)內(nèi)外研究的熱點(diǎn)。在海量數(shù)據(jù)存儲(chǔ)方面,云存儲(chǔ)的優(yōu)越性使之成為業(yè)界關(guān)注的焦點(diǎn)。開(kāi)源分布式系統(tǒng)框架Hadoop擁有強(qiáng)大的數(shù)據(jù)存儲(chǔ)能力和計(jì)算能力,在云存儲(chǔ)的解決方案和系統(tǒng)架構(gòu)上,基于Hadoop文件系統(tǒng)的應(yīng)用越來(lái)越廣泛[6]。本文中,這種通過(guò)Hadoop和ffmpeg的結(jié)合的方法,能夠很好地提升視頻轉(zhuǎn)儲(chǔ)的效率,為用戶提供良好的用戶體驗(yàn)。
參考文獻(xiàn):
[1] 方陽(yáng).海量視頻實(shí)時(shí)云轉(zhuǎn)碼系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)[D]. 大連:大連理工大學(xué),2013.
[2] 李曉波.基于Hadoop的海量視頻數(shù)據(jù)存儲(chǔ)及轉(zhuǎn)碼系統(tǒng)的研究與設(shè)計(jì)[D].杭州:浙江工業(yè)大學(xué),2013.
[3] 趙淑漫. FFMPEG轉(zhuǎn)碼技術(shù)在HTML5視頻系統(tǒng)中的研究與應(yīng)用[D].上海:東華大學(xué),2013.
[4] 熊曉蕓,段良濤,王金龍.云平臺(tái)上AVS視頻轉(zhuǎn)碼系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)[J].電視技術(shù),2016(6).
[5] 郭奕希.基于Hadoop的視頻轉(zhuǎn)碼系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)[D].武漢:華中科技大學(xué),2011.
[6] 張興.基于Hadoop的云存儲(chǔ)平臺(tái)的研究與實(shí)現(xiàn)[D].成都:電子科技大學(xué),2013.