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