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