李官敏,金俊秀(解放軍國防信息學(xué)院,武漢 430010)
基于FFmpeg的視頻客戶端的設(shè)計與實現(xiàn)
李官敏,金俊秀
(解放軍國防信息學(xué)院,武漢 430010)
本文以Android手機操作系統(tǒng)為平臺,設(shè)計和實現(xiàn)了基于FFmpeg的視頻客戶端軟件。采用模塊化的設(shè)計思想,將該客戶端分為用戶登錄模塊、視頻接收模塊、視頻解碼模塊和視頻顯示模塊。軟件采用C/S架構(gòu)模式,在完成基于RTP/RTCP協(xié)議的數(shù)據(jù)包接收后,借助FFmpeg進行視頻轉(zhuǎn)換。經(jīng)測試,該視頻客戶端對視頻的處理效果良好,具有廣闊的應(yīng)用前景。
Android;FFmpeg;C/S;RTP/RTCP;客戶端
隨著網(wǎng)絡(luò)技術(shù)和通信技術(shù)的不斷發(fā)展,網(wǎng)絡(luò)視頻監(jiān)控技術(shù)突破了地域的限制,廣泛地應(yīng)用于各個領(lǐng)域。但是傳統(tǒng)視頻監(jiān)控系統(tǒng)采用將采集的實時視頻傳輸?shù)奖O(jiān)控中心并由專業(yè)人員處理突發(fā)事件的方式,并不能滿足用戶多元化的需求。
本文旨在設(shè)計基于FFmpeg的視頻客戶端軟件,即移動終端上的視頻監(jiān)控系統(tǒng)。該客戶端可以讓用戶遠程地使用手機接收視頻了解監(jiān)控情況并迅速做出處理,在降低了監(jiān)控服務(wù)成本的同時滿足了人們對監(jiān)控便捷性的要求[1]。
本文結(jié)合Android操作系統(tǒng)的特點和流媒體協(xié)議,設(shè)計并實現(xiàn)了基于FFmpeg的視頻客戶端軟件。考慮到客戶端處理問題的需求及安全性,整體系統(tǒng)采用C/S的架構(gòu)模式,擺脫了Android對B/S架構(gòu)中瀏覽器功能的局限性,可以采用多種視頻編解碼標(biāo)準(zhǔn)展示不同的視頻格式。系統(tǒng)的總體架構(gòu)圖如圖1所示。
本文視頻客戶端軟件基于Android平臺開發(fā),運用Java語言編寫代碼設(shè)計并實現(xiàn)了用戶登錄、視頻接收、視頻解碼和視頻顯示四個模塊。
3.1 用戶登錄模塊
為了視頻的安全保密性,用戶在登陸前需要通過身份信息的驗證。若用戶名密碼均驗證通過則進入攝像頭選擇界面,可選擇攝像頭編號并進行視頻顯示。
3.2 視頻接收模塊
視頻接收模塊主要負責(zé)與遠程服務(wù)器連接,并接收遠程服務(wù)端以數(shù)據(jù)包形式傳輸?shù)囊曨l,最后把數(shù)據(jù)包存入待解碼緩沖區(qū)。目前,視頻的傳輸采用流媒體技術(shù),本客戶端采用實時傳輸協(xié)議RTP完成端到端的傳輸,RTP通常運行于UDP協(xié)議之上,是一種基于網(wǎng)絡(luò)的一對一或一對多的多媒體數(shù)據(jù)流的傳輸協(xié)議。與數(shù)據(jù)傳輸控制協(xié)議RTCP一同使用,RTCP負責(zé)在RTP會話期間向應(yīng)用程序提供會話、廣播性能質(zhì)量的統(tǒng)計信息[2]。
由于在客戶端接收過程中,較大的數(shù)據(jù)包會被分割,因此需要對不完整的視頻幀進行重新組幀。在緩沖后解碼前,從緩沖區(qū)內(nèi)獲取數(shù)據(jù)包,并根據(jù)其時間戳和序列號來判斷是否接收到充足的數(shù)據(jù),再根據(jù)幀算法完成幀的合成。幀處理算法流程圖如圖2所示。
3.3 視頻解碼模塊
由于攝像頭采集的視頻數(shù)據(jù)量很大,而且依賴于無線網(wǎng)絡(luò)完成傳輸,對于視頻的存儲和傳輸都相對困難。因此需要將視頻進行壓縮,在保持視頻清晰度的同時減少視頻的存儲空間,提高視頻的傳輸速度。
在解碼之前,首先需要通過av_registerall( )注冊FFmpeg的各種解碼格式,然后通過avformat_find_stream_info( )獲取數(shù)據(jù)已經(jīng)解析的編碼信息,并通過avcodec_find_decoder( )選擇合適的解碼器,在運用avcodec_alloc_frame( )為解碼數(shù)據(jù)幀分配內(nèi)存后,利用av_get_ frame( )獲取待解碼緩存區(qū)內(nèi)的幀數(shù)據(jù),并用avcodec_decode_video()進行解碼,解碼完成的幀需要通過av_set_frame( )放入待播放緩沖區(qū)。在此過程中,需要通過av_has_next_frame( )進行判斷待解碼緩沖區(qū)內(nèi)是否還存在數(shù)據(jù)幀,若解碼完成則調(diào)用avcodec_close( )釋放內(nèi)存。解碼模塊的流程圖如圖3所示。
3.4 視頻顯示模塊
視頻在解碼后就可以進行播放,視頻播放模塊主要面向用戶,考慮到用戶體驗本客戶端軟件界面設(shè)計簡約美觀。視頻采用實時播放,一般情況下視頻解碼完成一幀后,視頻播放模塊讀取該幀數(shù)據(jù)進行播放。但是這就會導(dǎo)致視頻播放可能出現(xiàn)抖動,因此本客戶端軟件對視頻播放模塊進行了改進,采用幀延遲的方法緩存待播放的幀,從而提高視頻的播放效果,幀延時算法如圖4所示。視頻的顯示效果圖如圖5所示。
本文設(shè)計并實現(xiàn)了基于FFmpeg的視頻客戶端的軟件,完成了用戶登錄、視頻接收、視頻解碼和視頻顯示功能。本客戶端安裝并運行于Android手機,結(jié)合視頻監(jiān)控系統(tǒng)硬件設(shè)備進行了功能測試。測試結(jié)果表明各項功能均達到要求,客戶端具較好的通用性機及廣闊的應(yīng)用前景。
[1]詹青龍.網(wǎng)絡(luò)視頻技術(shù)及應(yīng)用[M].西安:西安電子科技大學(xué)出版社,2004.
[2]史凱雒,江濤,張治中.基于RTP的H.264無線視頻傳輸和Qos控制[J].微計算機信息,2009,25(02):162.
李官敏,碩士,解放軍國防信息學(xué)院二系助教,研究方向:軍事裝備學(xué)。