鮑 軒,章堅武
(杭州電子科技大學通信工程學院,浙江杭州310018)
目前,國內(nèi)外眾多IT公司在移動視頻監(jiān)控領(lǐng)域,投入了大規(guī)模的人力物力進行項目研究與開發(fā)。移動視頻相關(guān)技術(shù)也已經(jīng)成為國內(nèi)各高校和研究所的研究熱點?;跓o線網(wǎng)絡(luò)將是今后監(jiān)控設(shè)備的必然選擇,移動智能終端是監(jiān)控應(yīng)用的最佳平臺,隨著3G成熟,LTE網(wǎng)絡(luò)商用時代的到來,移動視頻監(jiān)控技術(shù)將逐步走向成熟與穩(wěn)定[1]。本文介紹一種以Android智能手機為終端的音視頻監(jiān)控系統(tǒng),該系統(tǒng)把網(wǎng)絡(luò)視頻監(jiān)控和智能移動終端相結(jié)合,不僅克服了普通網(wǎng)絡(luò)視頻監(jiān)控對監(jiān)控客戶端地點上的限制,還進一步縮短了處理緊急情況的反映時間。
Android是基于Linux開放性內(nèi)核的操作系統(tǒng),是Google公司在2007年11月5日公布的手機操作系統(tǒng),Android采用軟件堆層的架構(gòu),主要為3部分:底層以Linux核心為基礎(chǔ),提供基本功能;中間層包括函數(shù)庫和虛擬機;最上層是各種應(yīng)用軟件[2]。
Android應(yīng)用程序用Java語言編寫,每個應(yīng)用程序都擁有一個獨立的Dalvik虛擬機實例,這個實例駐留在一個由Linux內(nèi)核管理的進程中。Dalvik支持Java Native Interface(JNI)編程方式,Android應(yīng)用程序可以通過JNI調(diào)用C/C++開發(fā)的共享庫,實現(xiàn)“JAVA+C”的編程方式。開發(fā)Android應(yīng)用程序最簡捷的方式是安裝Android SDK和Eclipse IDE。
Eclipse提供了一個豐富的Java環(huán)境,Java代碼通過編譯后,Android Developer Tools會將它打包,用于安裝。
網(wǎng)絡(luò)監(jiān)控系統(tǒng)由服務(wù)器端(視頻采集端)、網(wǎng)絡(luò)和客戶端(視頻播放端)組成。服務(wù)器端將流媒體數(shù)據(jù)經(jīng)過編碼處理通過網(wǎng)絡(luò)傳輸?shù)娇蛻舳???蛻舳丝梢酝ㄟ^一系列的處理恢復原始流媒體數(shù)據(jù),也可以根據(jù)用戶需求發(fā)送控制命令,實現(xiàn)對前端設(shè)備的控制操作,如云臺控制等[3]。如圖1所示。
圖1 音視頻監(jiān)控系統(tǒng)
服務(wù)器端包括4個模塊,它們是數(shù)據(jù)采集,數(shù)據(jù)壓縮,數(shù)據(jù)打包和RTP包發(fā)送。數(shù)據(jù)采集模塊負責將音視頻模擬信號轉(zhuǎn)化為數(shù)字信號。為了減少網(wǎng)絡(luò)傳輸?shù)臄?shù)據(jù)量和提高傳輸效率從采集模塊得到的數(shù)據(jù)必須通過壓縮模塊進行處理。音視頻分別選用了G.711和H.264壓縮標準。數(shù)據(jù)打包模塊負責將數(shù)據(jù)添加一些必要包頭信息(如數(shù)據(jù)類型,時間信息,序列號等),在客戶端通過包頭中的信息來實現(xiàn)音視頻同步。RTP包發(fā)送模塊的作用是將已經(jīng)打包好的數(shù)據(jù)通過網(wǎng)絡(luò)發(fā)送到客戶端。
客戶端的各個模塊是服務(wù)器端的逆過程,在網(wǎng)絡(luò)傳輸過程中由于網(wǎng)絡(luò)延遲等原因會導致接收到的RTP數(shù)據(jù)包順序打亂,數(shù)據(jù)緩存模塊是用于恢復數(shù)據(jù)包的正常順序,從緩存模塊出來的數(shù)據(jù)傳入同步調(diào)整模塊,最后將同步調(diào)整后的數(shù)據(jù)包傳入數(shù)據(jù)解壓模塊和播放模塊。
對于網(wǎng)絡(luò)監(jiān)控系統(tǒng)來說,如果音視頻不同步,那么監(jiān)控對象的真實情況就無法正確反映,將會給監(jiān)控人員帶來不便。本文提出了一種解決音視頻不同步的有效方法。在服務(wù)器利用RTP包中的時間戳來標記每幀音視頻數(shù)據(jù)的時間信息,然后再將打上時間戳的音視頻流通過網(wǎng)絡(luò)發(fā)送給客戶端。在客戶端用一個緩存來消除數(shù)據(jù)流中的延時時延和恢復數(shù)據(jù)包的順序。最后將數(shù)據(jù)流送入音視頻同步調(diào)整模塊進行同步播放。在同步調(diào)整模塊中,利用時間戳進行同步調(diào)整時需要在客戶端設(shè)計一個參考時鐘,依據(jù)接收到音視頻時間戳和參考時間之間的關(guān)系來判斷當前音視頻數(shù)據(jù)是立即播放還是延時播放甚至是之間丟棄。視頻信息中有關(guān)鍵幀的判斷,所以這里的參考時鐘主要以視頻為主。
同步調(diào)整算法如下:將接收到音視頻數(shù)據(jù)分別放到各自的緩存中,當緩存存到一定數(shù)量時,開始播放,同時進行同步調(diào)整[4]。當音頻時間戳大于視頻時間戳一定值時,說明音頻落后于視頻,需要等待。當音頻時間戳小于視頻時間戳一定值時,說明音頻超前于視頻,需要加快播放,這里采取的是丟棄音頻包,來達到加快播放的速度。
音視頻播放的線程設(shè)計如圖2所示,在接收視頻數(shù)據(jù)時,由于首幀進入解碼器的不是關(guān)鍵幀,會導致解碼器崩潰,所以把視頻數(shù)據(jù)寫入緩存前先要進行一個關(guān)鍵幀的判斷。當緩存區(qū)寫入一定數(shù)量數(shù)據(jù)時,才開始讀數(shù)據(jù)。再獲取各自的時間戳信息,在音視頻播放前進行同步調(diào)整,最后達到同步播放的效果。
圖2 音視頻播放的線程設(shè)計
在監(jiān)控系統(tǒng)中,視頻的編碼壓縮是十分關(guān)鍵的工作。H.264是目前最先進的視頻壓縮算法,它是由視頻編碼層VLC和網(wǎng)絡(luò)提取層NAL兩部分組成[4]。H.264標準對編碼效率和圖像質(zhì)量進行了諸多改進,且抗丟包性能和抗誤碼性能好,適應(yīng)各種網(wǎng)絡(luò)環(huán)境,非常適合于對壓縮率要求高,網(wǎng)絡(luò)環(huán)境復雜的移動視頻監(jiān)控。
客戶端接收的數(shù)據(jù)是經(jīng)過H.264編碼壓縮后的數(shù)據(jù),需要經(jīng)過H.264解碼還原視頻圖像后才能夠顯示,因此,H.264解碼器是客戶端的關(guān)鍵部分。這里移植了開源的音視頻解碼庫FFmpeg進行H.264解碼[5]。在Android應(yīng)用程序中使用FFmpeg的步驟如下:
(1)在Linux環(huán)境下安裝Android原生開發(fā)工具包NDK;
(2)創(chuàng)建jni文件夾,將FFmpeg工程復制到文件夾下;
(3)創(chuàng)建Android.mk文件,分別在LOCAL_SRC_FILES和LOCAL_C_INCLUDES項中添加編譯模塊所需源文件和頭文件目錄;
(4)執(zhí)行NDK開發(fā)包中的build腳本,生成對應(yīng)的.so共享庫,并復制到Android工程下的libs/armeabi目錄下;
(5)在Android程序中通過System.loadLibrary(“H.264Android”)加載所需要的庫,加載成功后,應(yīng)用程序就可以使用H264Decoder函數(shù)進行H.264的解碼。
通過實驗室的測試,服務(wù)器端發(fā)送H.264視頻數(shù)據(jù)和G.711音頻數(shù)據(jù),客戶端安裝在Android手機上,通過WIFI接入無線網(wǎng)絡(luò)與服務(wù)器建立連接??蓪崿F(xiàn)云臺控制,設(shè)防報警等操作。視頻畫面質(zhì)量主要是受碼率(數(shù)據(jù)傳輸時單位時間傳輸?shù)臄?shù)據(jù)位數(shù))和幀率(每秒顯示圖片數(shù))的影響,碼率越大畫面越清晰,幀率越大畫面越流暢。如圖3所示,左圖顯示的是幀率為10fps,碼率300kbps時視頻效果。右圖顯示的是幀率為15fps,碼率在300kbps時視頻效果。而在音視頻同步方面,感受不到音視頻不同步的感覺。
圖3 監(jiān)控客戶端畫面
隨著3G時代,數(shù)據(jù)傳輸速度有了大幅提升,為移動實時視頻業(yè)務(wù)的實現(xiàn)創(chuàng)造有利的條件,本文設(shè)計的這款基于android手機的音視頻監(jiān)控軟件,在實際應(yīng)用中具有較大的意義。
[1] 田俊靜,張波,黃湘情.Android基礎(chǔ)教程[M].北京:人民郵電出版社,2010:25-31.
[2] 郭宏志.Android應(yīng)用開發(fā)詳解[M].北京:電子工業(yè)出版社,2010:21-27.
[3] 吳靜,侯玉華.移動視頻監(jiān)控業(yè)務(wù)技術(shù)方案分析[J].信息通信技術(shù),2009,10(5):36-42.
[4] 王慶娟.移動視頻監(jiān)控系統(tǒng)的研究與設(shè)計[D].廣州:華南理工大學,2009:57-62.
[5] Butler,Margaret.Android:Changing the mobile landscape[J].IEEE Pervasive Computing,2011,10(1):4-7.