盛平,韓偉
(江蘇大學(xué) 江蘇 鎮(zhèn)江 212013)
無(wú)線網(wǎng)絡(luò)攝像機(jī)是wireless ip network camera的縮寫(xiě),是基于TCP/IP協(xié)議的網(wǎng)絡(luò)攝像機(jī),主要組成結(jié)構(gòu)是攝像頭,視頻服務(wù)器和無(wú)線wifi模塊,使用linux操作系統(tǒng),支持H264,MPEG4編碼,支持RTSP視頻流傳輸協(xié)議,可以通過(guò)PC客戶(hù)端或者Android/IOS終端進(jìn)行實(shí)時(shí)視頻預(yù)覽和觀看錄像回放;網(wǎng)絡(luò)攝像機(jī)實(shí)際上是一臺(tái)視頻服務(wù)器和攝像鏡頭模塊的集成,擁有IP地址和DDNS動(dòng)態(tài)域名,并可通過(guò)WIFI網(wǎng)絡(luò)傳輸視頻信號(hào)。
Android是谷歌公司發(fā)布的一種基于Linux的自由及開(kāi)放源代碼的操作系統(tǒng),截止2014年第四季度,Android系統(tǒng)市場(chǎng)占有率為83.6%,遠(yuǎn)遠(yuǎn)高于蘋(píng)果的iOS系統(tǒng)、微軟WP系統(tǒng)和黑莓。中國(guó)移動(dòng)已經(jīng)建成全球最大的4G網(wǎng)絡(luò),擁有4G基站70萬(wàn)個(gè),用戶(hù)數(shù)量超過(guò)8 000萬(wàn),高速的移動(dòng)網(wǎng)絡(luò)促使著移動(dòng)應(yīng)用,尤其是對(duì)網(wǎng)絡(luò)帶寬依賴(lài)性非常強(qiáng)的流媒體應(yīng)用大量增長(zhǎng),基于以上原因本文提出了一種基于無(wú)線網(wǎng)絡(luò)攝像機(jī)的Android客戶(hù)端,視頻流暢、穩(wěn)定、可靠性高、實(shí)時(shí)性好,具有很好的市場(chǎng)應(yīng)用前景。
Android是一個(gè)分層的環(huán)境,構(gòu)建在 Linux內(nèi)核的基礎(chǔ)上,它具有豐富的功能。Android應(yīng)用程序是用 Java編程語(yǔ)言編寫(xiě)的,它們?cè)谝粋€(gè)虛擬機(jī)(Dalvik Virtual Machine)中運(yùn)行[1]。這是一種開(kāi)源技術(shù)。每個(gè) Android應(yīng)用程序都在 Dalvik VM的一個(gè)實(shí)例中運(yùn)行,這個(gè)實(shí)例駐留在一個(gè)由Linux內(nèi)核管理的進(jìn)程中。
本次開(kāi)發(fā)對(duì)應(yīng)的 Android 4.4.2(API level 19),相比與其他版本,Android4.4是一次重要的平臺(tái)發(fā)布版,為用戶(hù)和應(yīng)用程序開(kāi)發(fā)者增加了大量新特性,例如:Android4.4增加了幾個(gè)新的API,使應(yīng)用程序能夠與照片,影片和音樂(lè)等媒體交互。Media Effects是一個(gè)新的媒體效果框架,為了最佳效果,其直接應(yīng)用了OpenGL的紋理。
Android Studio是Google開(kāi)發(fā)的一款面向Android開(kāi)發(fā)者的IDE,基于Java語(yǔ)言集成開(kāi)發(fā)環(huán)境IntelliJ搭建而成[2]。相比與Eclipse+ADT,Android Studio提供了 IntelliJ IDEA的智能代碼編輯技術(shù),可實(shí)現(xiàn)自動(dòng)代碼完成、重構(gòu)、代碼分析等功能,Android studio還提供了一款英文名為Memory Monitor的性能分析工具,可顯示應(yīng)用內(nèi)存使用情況隨時(shí)間發(fā)生的變化,從而幫助開(kāi)發(fā)者找出改進(jìn)性能的辦法。而且,Android studio采用了一種基于自動(dòng)化構(gòu)建工具Gradle的系統(tǒng),支持在IDE之內(nèi)或之外進(jìn)行開(kāi)發(fā)編譯,有比較好的靈活性與擴(kuò)展性。
本客戶(hù)端的設(shè)計(jì)主要由Android UI(user interface)模塊,視頻流接收模塊,視頻播放模塊,APP檢測(cè)更新等模塊組成;
圖1 客戶(hù)端功能模塊結(jié)構(gòu)圖Fig.1 Structure chart of function module
Android SDK提供了Android平臺(tái)上使用Java進(jìn)行應(yīng)用開(kāi)發(fā)的 API(Application Programming Interface,應(yīng)用程序編程接口)和工具,VSTCCAM SDK是威視達(dá)康公司提供的供第三方開(kāi)發(fā)者獲得威視達(dá)康前端設(shè)備視頻流的軟件開(kāi)發(fā)工具包。本文主要使用這兩個(gè)SDK完成Android應(yīng)用的開(kāi)發(fā)。
Android UI模塊的功能有:用戶(hù)注冊(cè)和登錄;從服務(wù)器上獲取用戶(hù)賬號(hào)下面所有無(wú)線網(wǎng)絡(luò)攝像機(jī)的UID,名稱(chēng)等,并以listview的格式顯示給用戶(hù);添加和刪除無(wú)線網(wǎng)絡(luò)攝像機(jī);查看用戶(hù)之前截取的圖像和錄制的視頻等。
視頻流接收模塊接收無(wú)線網(wǎng)絡(luò)攝像機(jī)通過(guò)云服務(wù)器轉(zhuǎn)發(fā)過(guò)來(lái)的視頻流,然后交給H264解碼模塊進(jìn)行解碼,最后通過(guò)視頻播放模塊將實(shí)時(shí)監(jiān)控視頻呈現(xiàn)給用戶(hù)。
本客戶(hù)端的具體流程:如果用戶(hù)已有賬號(hào),則直接登錄,如果沒(méi)有賬號(hào),進(jìn)入注冊(cè)頁(yè)面進(jìn)行注冊(cè)。用戶(hù)登錄后,APP從服務(wù)器獲取用戶(hù)已經(jīng)添加的網(wǎng)絡(luò)攝像機(jī)列表,同時(shí)在另一個(gè)線程(Thread)中,APP向服務(wù)器發(fā)送檢測(cè)最新版本的請(qǐng)求,如果服務(wù)器上存在更新版本,則提示用戶(hù)是否升級(jí)。用戶(hù)通過(guò)添加/刪除攝像機(jī)模塊可以進(jìn)行攝像機(jī)的添加和刪除動(dòng)作,結(jié)果發(fā)送到服務(wù)器進(jìn)行存儲(chǔ),下次用戶(hù)從其他設(shè)備登錄可以獲得最新的攝像機(jī)列表。用戶(hù)選擇需要預(yù)覽的攝像機(jī)調(diào)用VSTCCAM SDK獲取監(jiān)控實(shí)時(shí)視頻流,然后通過(guò)Surface ViewHolder將監(jiān)控畫(huà)面呈現(xiàn)給用戶(hù)。如圖2所示。
圖2 客戶(hù)端設(shè)計(jì)流程圖Fig.2 Flow chart of client design
2.2.1 Android UI設(shè)計(jì)
系統(tǒng)界面設(shè)計(jì)包括登錄注冊(cè)界面和功能區(qū)界面,功能區(qū)界面按功能劃分有獲取并顯示攝像機(jī)列表,添加或是刪除攝像機(jī),實(shí)時(shí)視頻預(yù)覽,下載最新版本應(yīng)用4個(gè)部分,UI的設(shè)計(jì)遵循簡(jiǎn)潔原則,使交互界面易于用戶(hù)理解和使用。應(yīng)用界面的呈現(xiàn)使用Android SDK[3]中的Fragment控件,當(dāng)我們的應(yīng)用程序同時(shí)適用于平板電腦和手機(jī)時(shí),可以利用fragment實(shí)現(xiàn)靈活的布局,改善用戶(hù)體驗(yàn)。當(dāng)應(yīng)用運(yùn)行在手機(jī)上時(shí)設(shè)備列表和實(shí)時(shí)預(yù)覽顯示在不同的頁(yè)面,當(dāng)應(yīng)用運(yùn)行在平板上時(shí)設(shè)備列表和實(shí)時(shí)預(yù)覽這兩個(gè)fragment就可以嵌入在同一個(gè)activity中,從而更加充分的利用平板的屏幕空間。如圖:
圖3 平板電腦布局Fig.3 Layout in tablet
2.2.2 登陸功能、攝像機(jī)列表獲取等功能設(shè)計(jì)
Android客戶(hù)端通過(guò)Http請(qǐng)求方式[4],從服務(wù)器調(diào)用登陸接口,獲取攝像機(jī)列表接口,實(shí)現(xiàn)登陸并獲取設(shè)備列表,查詢(xún)報(bào)警信息,添加和刪除攝像機(jī)等功能。
Android客戶(hù)端登陸成功驗(yàn)證并獲取到攝像機(jī)列表后,使用Android SDK提供的ListView組件呈現(xiàn),它以列表的形勢(shì)展現(xiàn)具體內(nèi)容,比較適合多個(gè)攝像機(jī)的展示。
2.2.3 獲取攝像機(jī)實(shí)時(shí)視頻流模塊設(shè)計(jì)
獲取實(shí)時(shí)視頻流功能的實(shí)現(xiàn)主要依靠攝像機(jī)廠商提供的SDK。首先將libavi_utils.so,libvstc2_jni.so導(dǎo)入到 Android工程中l(wèi)ibs/armeabi/目錄下。根據(jù)接口的描述,為了使用該接口,需要新建包”vstc2.nativecaller”。 接著在類(lèi) NativeCaller中加載庫(kù)libavi_utils.so,libvstc2_jni.so并對(duì)本地方法進(jìn)行聲明。如下:
在 StartActivity類(lèi)中調(diào)用 NativeCaller.PPPPInitial()初始化服務(wù)器,之后使用onBind()啟動(dòng)類(lèi)名為bridgeservice的服務(wù),使用service之前需要在AndroidManifest.xml配置文件中添加Service,具體添加方法如下:
2.2.4 視頻實(shí)時(shí)預(yù)覽的程序設(shè)計(jì)
在整個(gè)移動(dòng)安防監(jiān)控系統(tǒng)中,Android端視頻實(shí)時(shí)預(yù)覽的最后也最重要的一步,由于4G或WIFI等無(wú)線網(wǎng)絡(luò)的不穩(wěn)定性與帶寬限制,實(shí)時(shí)預(yù)覽時(shí)Android客戶(hù)端必須對(duì)接收到的RTSP數(shù)據(jù)流進(jìn)行高效的解碼。
Android提供了一個(gè)專(zhuān)門(mén)的視圖控制器Android.widget.VideoView[5],封裝了MediaPlay的創(chuàng)建和初始化過(guò)程,Video View可以用在布局管理器中,提供包括縮放和著色在內(nèi)的很多顯示選項(xiàng)。為了顯示實(shí)時(shí)預(yù)覽視頻,創(chuàng)建VideoView部件并將他設(shè)置為用戶(hù)界面的內(nèi)容,然后設(shè)置傳入的bitmap并觸發(fā)start()方法。VideoView類(lèi)可以從不同的來(lái)源(例如資源文件或內(nèi)容提供器)讀取圖像,本系統(tǒng)通過(guò)從威視達(dá)康SDK獲取的視頻流讀取畫(huà)面數(shù)據(jù)。
SurfaceView繼承于視圖(View),可以直接從內(nèi)存或者DMA等硬件接口取得圖像數(shù)據(jù),是個(gè)非常重要的繪圖容器,這個(gè)視圖里內(nèi)嵌了一個(gè)專(zhuān)門(mén)用于繪制的Surface[6]。Surface View類(lèi)中主要方法如表1所示。
表1 SurfaceView主要方法Tab.1 Method of surfaceview
SurfaceHolder是一個(gè)接口,用于管理SurfaceView。里面有兩個(gè)常用的內(nèi)部接口SurfaceHolder.Callback和Surface Holder.Callback2,Callback2 用來(lái)實(shí)現(xiàn) Callback。
通過(guò)SurfaceHolder來(lái)操作畫(huà)面對(duì)象,當(dāng)SurfaceView初始 化 后 通 過(guò) 調(diào) 用 getHolder() 獲 取 SurfaceHolder,把SurfaceHandler傳給另一線程并且用lockCanvas()獲取canvas。 完成繪圖后,調(diào)用 unlockCanvasAndPost()釋放 canvas鎖,并顯示視圖。
2.2.5 檢測(cè)新版本功能程序設(shè)計(jì)
Android客戶(hù)端進(jìn)入到MainActivity主進(jìn)程中,會(huì)另開(kāi)一個(gè)線程,向服務(wù)發(fā)送一個(gè)post請(qǐng)求,Android客戶(hù)端解析出服務(wù)器返回的帶有最新的版本信息的數(shù)據(jù)后進(jìn)行對(duì)比,如果版本號(hào)相同則不進(jìn)行任何提示,如果本機(jī)版本號(hào)低于服務(wù)器提供的版本號(hào)則彈窗窗口提示用戶(hù)選擇是否升級(jí)。用戶(hù)確認(rèn)升級(jí)后,調(diào)用Android SDK提供的DownloadManager接口,進(jìn)行下載。
本測(cè)試環(huán)境下使用的移動(dòng)終端采用三星galaxy4,該機(jī)型采用的是Android4.4.2系統(tǒng),網(wǎng)絡(luò)環(huán)境為中國(guó)移動(dòng)4G網(wǎng)絡(luò)。
本次實(shí)驗(yàn)使用的無(wú)線網(wǎng)絡(luò)攝像機(jī)是型號(hào)為C7837WIP,生產(chǎn)廠商為深圳威視達(dá)康。攝像機(jī)具體參數(shù)如表2所示。
表2 無(wú)線網(wǎng)絡(luò)攝像機(jī)參數(shù)Tab.2 Parameters of wireless ip camera
軟件安裝完成后對(duì)核心功能進(jìn)行測(cè)試。輸入賬號(hào)密碼驗(yàn)證成功后進(jìn)入APP主界面,選擇相應(yīng)的攝像機(jī)進(jìn)行實(shí)時(shí)預(yù)覽。登陸界面和設(shè)備列表界面如圖4所示。點(diǎn)擊需要預(yù)覽的攝像機(jī)進(jìn)入實(shí)時(shí)預(yù)覽界面,在4G網(wǎng)絡(luò)下,視頻流暢,卡頓和掉幀率較低,穩(wěn)定性、實(shí)時(shí)性都比較好。實(shí)時(shí)監(jiān)控效果圖如圖5所示。
圖4 登陸界面和設(shè)備列表界面Fig.4 UI of log in and camera list
本文以Android為平臺(tái),開(kāi)發(fā)了一款針對(duì)無(wú)線網(wǎng)絡(luò)攝像機(jī)的客戶(hù)端。通過(guò)和服務(wù)器之間進(jìn)行交互,實(shí)現(xiàn)用戶(hù)登陸,注冊(cè),添加刪除攝像機(jī)等功能;利用攝像機(jī)廠商提供的網(wǎng)絡(luò)SDK獲得視頻流,再結(jié)合Android提供的SurfaceView接口實(shí)現(xiàn)了實(shí)時(shí)視頻預(yù)覽;程序設(shè)計(jì)時(shí)應(yīng)充分考慮到使用場(chǎng)景和用戶(hù)體驗(yàn),將大部分操作移動(dòng)到后臺(tái)執(zhí)行,同時(shí)自動(dòng)更新客戶(hù)端版本,同時(shí)用戶(hù)界面人性化,操作簡(jiǎn)單。整個(gè)方案可以應(yīng)用到許多多媒體應(yīng)用中,如視頻數(shù)據(jù)采集,庭院看護(hù),以及遠(yuǎn)程交流,實(shí)現(xiàn)穩(wěn)定可靠隨時(shí)隨地的實(shí)時(shí)視頻服務(wù)。
圖5 實(shí)時(shí)監(jiān)控效圖Fig.5 Picture of video surfaceillance
[1]Shane Conder,Lauren Darcey.Android wireless application development[M].Boston:Addison-Wesley,2010.
[2]Reto Meier.Professional Android 2 application development[M].Indianapolis:Wiley Pub,2009.
[3]James Steele,Nelson.To The Android developer's cookbook:building applications with the Android SDK[M].Boston:Addison-Wesley,2010.
[4]柯元旦,宋銳.Android程序設(shè)計(jì)[M].北京:北京航空航天大學(xué)出版社,2010.
[5]Jordan.Practical Android Projects[M].California-Berkeley,Apress,2011.
[6]丁偉.基于Android平臺(tái)的移動(dòng)流媒體客戶(hù)端[D].廣州:中山大學(xué),2010.