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