程會敏 周恕義 李小勇 陳圣奇
北京工業(yè)大學(xué) 北京 100124
隨著Internet和多媒體通信業(yè)務(wù)的發(fā)展,網(wǎng)絡(luò)視頻的應(yīng)用越來越廣泛,在教育領(lǐng)域中的應(yīng)用也達(dá)到前所未有的高度,如各商業(yè)網(wǎng)站的視頻公開課、國家級視頻公開課以及近期正在進(jìn)行的國家級精品資源共享課等平臺。但是視頻資源的應(yīng)用面臨3個問題:(1)用戶接入網(wǎng)絡(luò)的形式多樣化,這些不同的網(wǎng)絡(luò)具有不同的信道特征,如帶寬等;(2)不同的用戶端,如手持計算機(jī)、Pda、機(jī)頂盒等具有不同的計算和顯示能力;(3)在現(xiàn)有視頻資源格式不統(tǒng)一的情況下,如何根據(jù)用戶的網(wǎng)絡(luò)特征以及終端設(shè)備的特性,提供匹配的視頻資源將直接影響到資源的應(yīng)用效果。鑒于以上問題,需要對視頻文件進(jìn)行轉(zhuǎn)碼。為確保轉(zhuǎn)換的效率和穩(wěn)定性,筆者在學(xué)校服務(wù)器端運行一個程序?qū)σ曨l文件進(jìn)行定時檢測和處理。這樣可以避免訪問高峰期由于客戶端同時調(diào)用服務(wù)器上的多個視頻處理程序,給服務(wù)器造成負(fù)擔(dān)[1]。該程序利用FFmpeg開源組件對視頻文件進(jìn)行轉(zhuǎn)碼操作[2-4],以下分別介紹FFmpeg組件和自動轉(zhuǎn)碼功能實現(xiàn)。
FFmpeg是一個開源編解碼框架,是在Linux下開發(fā)出來的,但它可以在包括Windows在內(nèi)的大多數(shù)操作系統(tǒng)中編譯。它提供了錄制、轉(zhuǎn)換以及流化音視頻的完整解決方案,并包含了非常先進(jìn)的音頻/視頻編解碼庫libavcodec[5,6],可以輕易實現(xiàn)多種視頻格式之間的相互轉(zhuǎn)換,例如:可以將攝錄的avi視頻等轉(zhuǎn)成現(xiàn)在視頻網(wǎng)站常用的flv格式。FFmpeg除包含視頻格式轉(zhuǎn)換功能外,還具有視頻采集、視頻抓圖、給視頻加水印等功能。在轉(zhuǎn)碼過程中對視頻抓圖,便于進(jìn)行視頻宣傳;給視頻添加水印以達(dá)到版權(quán)保護(hù)的目的[7,8]。在自動轉(zhuǎn)碼的實現(xiàn)中,利用FFmpeg完成視頻文件的轉(zhuǎn)換。
該系統(tǒng)提供了一個視頻自動批量轉(zhuǎn)碼的平臺,通過該平臺,用戶可以指定轉(zhuǎn)換時間段,即轉(zhuǎn)換的開始時間和結(jié)束時間,轉(zhuǎn)碼參數(shù)以及視頻文件的源目錄和目標(biāo)目錄。用戶指定以上信息后,系統(tǒng)會啟動定時器,當(dāng)?shù)竭_(dá)開始時間時,系統(tǒng)會自動遍歷指定的視頻源目錄,檢測源目錄包括其子目錄下是否有未轉(zhuǎn)換的視頻文件,如果有未轉(zhuǎn)換的視頻文件且未到結(jié)束時間,系統(tǒng)會調(diào)用FFmpeg組件,根據(jù)配置文件中的轉(zhuǎn)碼參數(shù)對視頻文件進(jìn)行轉(zhuǎn)換,并根據(jù)轉(zhuǎn)換成功與否生成相應(yīng)的日志文件;如果有未轉(zhuǎn)換的視頻文件但到達(dá)結(jié)束時間時,系統(tǒng)就會停止執(zhí)行轉(zhuǎn)碼任務(wù)和檢測源目錄,并等待下一次開始時間;如果沒有要轉(zhuǎn)換的視頻文件,無論是否到達(dá)結(jié)束時間,都不會調(diào)用檢測模塊和轉(zhuǎn)碼模塊。其流程如圖1所示:
圖1 自動轉(zhuǎn)碼流程
筆者從5個基本模塊對自動轉(zhuǎn)碼功能的實現(xiàn)進(jìn)行說明。
該模塊提供信息輸入接口,包括執(zhí)行轉(zhuǎn)換任務(wù)的起始時間和結(jié)束時間、視頻源目錄、目標(biāo)文件目錄以及所選擇的轉(zhuǎn)碼配置名稱。程序啟動后,用戶可在前臺頁面中更改或者添加以上信息,并保存到屬性文件中(如圖2所示):
圖2 信息輸入界面
該模塊調(diào)用用戶輸入且保存在屬性文件中的時間參數(shù),記錄下執(zhí)行轉(zhuǎn)換任務(wù)的起始時間和結(jié)束時間,并與當(dāng)前的時間進(jìn)行比較,當(dāng)滿足起始時間時調(diào)用檢測模塊執(zhí)行轉(zhuǎn)換任務(wù),滿足結(jié)束時間時,停止檢測目錄,并允許正在轉(zhuǎn)換的任務(wù)繼續(xù)執(zhí)行直到結(jié)束。該模塊通過監(jiān)聽器(Listener)和定時器(Timer)實現(xiàn)。定時器采用了Java JDK中提供的Timer定時器,定時調(diào)度所擁有的TimerTasks。一個TimerTask實際上是一個擁有run方法的類,需要定時執(zhí)行的代碼放到run方法體內(nèi),其大致實現(xiàn)如下所示:
該模塊主要實現(xiàn)對用戶指定的目錄及其子目錄進(jìn)行檢測,當(dāng)發(fā)現(xiàn)有未轉(zhuǎn)換的視頻文件且沒有到結(jié)束時間時,調(diào)用視頻轉(zhuǎn)碼模塊執(zhí)行轉(zhuǎn)碼任務(wù)。其中目錄中已經(jīng)轉(zhuǎn)換成功的視頻文件不會被刪除,并存在一個與之對應(yīng)的同名的并以.ok為后綴的屬性文件,該文件記錄了視頻轉(zhuǎn)換成功后文件的存放位置和轉(zhuǎn)換時間。
該模塊為核心模塊,根據(jù)用戶指定的轉(zhuǎn)碼配置名稱,獲取相應(yīng)的轉(zhuǎn)碼參數(shù),利用開源工具FFmpeg對視頻文件進(jìn)行批量轉(zhuǎn)換。系統(tǒng)默認(rèn)每次可啟動FFmpeg的進(jìn)程上限為3,即每次最多啟動3個FFmpeg進(jìn)程同時對3個視頻文件進(jìn)行轉(zhuǎn)換,如果其中一個視頻文件轉(zhuǎn)換完畢,此時啟動的FFmpeg進(jìn)程數(shù)沒有達(dá)到上限值,在還有視頻文件需要轉(zhuǎn)換的情況下,系統(tǒng)將啟動一個新的FFmpeg進(jìn)程對另一個視頻文件轉(zhuǎn)碼,該上限值也可由用戶在信息輸入頁面手動指定。經(jīng)過反復(fù)調(diào)試,我們總結(jié)出在執(zhí)行轉(zhuǎn)換操作時常用的FFmpeg參數(shù)(見表1)。
表1 FFmpeg常用參數(shù)
以上參數(shù)是該系統(tǒng)實現(xiàn)自動轉(zhuǎn)碼所必需的,此外在轉(zhuǎn)換過程中,對H264視頻編碼我們還需添加“-threads 8”參數(shù),使用多線程轉(zhuǎn)碼。
針對以上轉(zhuǎn)碼參數(shù),系統(tǒng)提供了轉(zhuǎn)碼參數(shù)的配置頁面,允許用戶根據(jù)自己的需求設(shè)定參數(shù)并選擇相應(yīng)的轉(zhuǎn)碼配置名稱對視頻文件進(jìn)行轉(zhuǎn)碼,轉(zhuǎn)碼參數(shù)的配置頁面如圖3所示:
圖3 轉(zhuǎn)碼參數(shù)配置頁面
以上轉(zhuǎn)碼參數(shù)將被保存到配置文件profile-defs.xml中,參數(shù)的定義格式如下:
其中參數(shù)contentType和videoVisual中的codec是必須指定的,其他參數(shù)可以不指定,contentType指定轉(zhuǎn)換后視頻文件的封裝格式即后綴名,videoVisual中的codec則指定視頻的編碼格式。根據(jù)以上配置文件中的參數(shù)和前臺頁面中指定的轉(zhuǎn)碼配置名稱profileID=“所有到MP4”,系統(tǒng)會將指定目錄下的視頻資源轉(zhuǎn)換成Adobe Flash Player主流播放器支持的MP4格式。例如對源目錄下的“0806.mpg”文件進(jìn)行轉(zhuǎn)換操作,系統(tǒng)獲取參數(shù)后啟動FFmpeg進(jìn)程并執(zhí)行圖4所示的命令:
圖4
如果用戶需要將指定目錄下的視頻文件轉(zhuǎn)換成其他視頻格式,例如手機(jī)播放的3gp格式,可根據(jù)實際情況配置參數(shù),并在信息輸入頁面中選擇相應(yīng)的轉(zhuǎn)碼配置名稱。
該模塊根據(jù)執(zhí)行轉(zhuǎn)換的時間每天生成一個日志文件,該文件中記錄了每次轉(zhuǎn)換的信息,包括轉(zhuǎn)換命令和轉(zhuǎn)換過程中的信息,便于以后對轉(zhuǎn)換失敗的情況進(jìn)行分析。
基于FFmpeg的自動轉(zhuǎn)碼的配置比較方便,允許用戶自己配置參數(shù),轉(zhuǎn)碼參數(shù)的提取也比較靈活;可同時啟動多個FFmpeg進(jìn)程對視頻文件進(jìn)行并行批量轉(zhuǎn)換;提供友好的Web界面,使用方便;國家級視頻公開課以及國家級精品資源共享課等平臺可使用該轉(zhuǎn)碼系統(tǒng)在訪問非高峰期對視頻資源進(jìn)行定時自動轉(zhuǎn)換,既不影響用戶的正常訪問,也方便用戶學(xué)習(xí)平臺上的視頻資源。由于FFmpeg可轉(zhuǎn)換的視頻種類有限,例如轉(zhuǎn)換.wmv文件容易出現(xiàn)花屏現(xiàn)象,MEncoder[9]開源工具可轉(zhuǎn)換的視頻種類多、質(zhì)量高,但其轉(zhuǎn)換速度較FFmpeg慢,因此后期可結(jié)合MEncoder實現(xiàn)支持更多格式的視頻轉(zhuǎn)換,并與當(dāng)前應(yīng)用廣泛的格式工廠進(jìn)行轉(zhuǎn)換時間、性能等方面的比較分析,以改善優(yōu)化該轉(zhuǎn)碼平臺。
[1] 趙鑫瑩.一種基于批處理的服務(wù)器端視頻轉(zhuǎn)換模塊的實現(xiàn)[J].計算機(jī)系統(tǒng)應(yīng)用,2011,20(3):136-139.
[2] 張學(xué)武,楊學(xué)星,江采.基于H.263的視頻編碼、解碼的研究及軟件實現(xiàn)[J].計算機(jī)工程與設(shè)計,2005,26(9):2491-2493.
[3] 郭奕希.基于Hadoop的視頻轉(zhuǎn)碼系統(tǒng)設(shè)計與實現(xiàn)[D].武漢:華中科技大學(xué),2011.
[4] FFmpeg工程組.FFmpeg的詳細(xì)說明[DB/OL].http://www.ffmpeg.com.cn/.
[5] 趙鑫瑩.一種基于批處理的服務(wù)器端視頻轉(zhuǎn)換模塊的實現(xiàn)[J].計算機(jī)系統(tǒng)應(yīng)用,2011,20(3):136-139.
[6] 張國慶.基于FFmpeg的視頻轉(zhuǎn)碼與保護(hù)系統(tǒng)的設(shè)計與實現(xiàn)[D].武漢:華中師范大學(xué),2011.
[7] 黃詩文.基于FFmpeg的高性能高清流媒體播放器軟件設(shè)計[D].杭州:浙江大學(xué),2012.
[8] 任嚴(yán),韓臻,劉麗.基于FFMPEG的視頻轉(zhuǎn)換與發(fā)布系統(tǒng)[J].計算機(jī)工程與設(shè)計,2007,28(20):4962-4963,4967.
[9] 黃麗福,陳鋒,繆文.高清視頻編碼和編解碼器MEncoder的研究[J].福建電腦,2007(4):35-36,38.