楊明極,畢 晶
(哈爾濱理工大學測控技術與通信工程學院,黑龍江 哈爾濱 150080)
隨著21世紀的到來,全球快速的進入信息時代,移動通信系統由于綜合利用了有線和無線的傳輸方式,解決了人們在活動中與固定終端或其他移動載體上的對象進行通信聯系的要求,移動通信給社會帶來了深刻的信息化變革,已成為最受青睞的通信手段。如今,以嵌入式技術為依托,以網絡、通信技術為平臺的網絡視頻監控,已經越來越成熟,應用范圍越來越廣闊。網絡視頻監控突破了地域的限制,實現了遠程監控,可是,隨著“Any Time,Any Where,Any Device”(任何時間、任何地點、任何設備)等概念的提出,普通的網絡視頻監控已經不能滿足用戶日益增長的多元化需求。“手機視頻監控”使這個問題有了答案,這項應用將在安防行業中得到迅速推廣和普及,同時,它也會逐漸走入人們的家庭生活中,比如在工作中的白領人員可以在工作中用手機實時監看家里無人照看的老人或幼兒園里孩子的情況,企業人員可以用手機隨時隨地監看自己的店鋪、超市、公司的運營情況等。
本文主要是對基于Android平臺視頻客戶端進行設計,最后實現其播放的核心功能以及實時監視等多項基本功能。
2007年11月5日,Google與其他33家手機制造商(包括摩托羅拉、宏達電、三星、LG)、手機芯片供應商、軟硬件供應商、電信業者所聯合組成的開放手機聯盟(Open Handset Alliance,OHA),發布了名為Android的開放手機軟硬件平臺。
Android是基于Linux內核的軟件平臺和操作系統。框架結構由5個部分組成,其核心為Linux內核,逐次向上是Android開發的Libraries(函數庫)和Android Runtime(運行環境),以及搭配Application Framework(應用程序框架)來開發各種不同的應用程序[1]。
對于硬件開發商來說,Android是開放的平臺,只要廠商有實力和能力就可以在此平臺上自由添加特有的設備或功能,不受到手機操作系統的限制;對于手機開發者而言,Android是先進的平臺,平臺上的應用程序可兼容于各種型號的Android手機,免除為各種不同手機機型開發的困擾。Android平臺支持各種先進的網絡、繪圖、3D處理能力,可以用來提供更好的用戶體驗。通過Android Market將自己的應用程序銷售給世界各地用戶;對于用戶來說,Android是一個用于手機的操作系統。只要用戶申請了Google帳戶,當想換手機時,可以在不同的廠牌同樣使用Android操作系統平臺的手機之間選擇,并且很容易將比如通訊薄等個人資料轉換到新手機上。
目前,遠程實時視頻監視技術主要趨向以下幾個方向:首先,支持多樣化格式。Xmms,Xmovie,QuickTime是主要針對固定的媒體格式類型或傳輸協議,具有一定的專用性,因此難以滿足廣大消費者的的需求,如今的音頻、視頻格式越來越多,如常見的音頻WMA、MP3以及視頻的RM、AVI等。如何能播放所有格式,是現今研究的方向。其次,可擴展性也是一個必要的趨勢,如今的播放器功能越來越強大,如何在現有的基礎上使功能更全面,也是人們接受的一個因素。這就是本設計選用開放式Android平臺的一個原因,代碼完全公開,為其功能擴展提供方便的條件。
遠程視頻監視系統無論播放本地文件還是網絡流媒體文件,都需要經歷3個處理階段,分別是獲取媒體數據、對音視頻媒體流解碼以及將解碼后的媒體數據給用戶顯示[2],本設計依據這3個處理階段將遠程視頻實時監視在整體結構上進行分層設計。
由于本地文件和網絡流媒體文件的數據獲取方式是相異的,若保證上層解碼的一致性,就要對本地文件和網絡流媒體文件進行預處理,使它們的數據格式相同以供上層解碼。因此,本設計結合以上特點以及文件的解碼流程對遠程視頻實時監視的整體結構采用分層設計方案,每一層獨立完成工作,不但能夠降低系統的耦合度,而且各層的獨立擴展不干擾上下層的應用。整體結構層從上到下分別設計為用戶界面、音視頻解碼層、數據預處理層、數據提取層。整體結構如圖1所示。

圖1 遠程實時視頻監視的整體結構圖
遠程視頻實時監視的用戶界面主要由Android的GUI系統實現,負責提供播放器和用戶之間的交互接口,例如播放時的快進、后退、暫停等功能。GUI系統由Java語言框架和C語言框架組成,對于下層,GUI系統通過調用顯示輸入、輸出設備的驅動將Android的軟件系統和底層的硬件聯系起來;對于上層,GUI系統提供了Java層次的繪圖接口,Android的Java框架層調用這些繪圖接口來構建各種UI元素。此外,Java應用程序層也可以調用這些繪圖接口。
音視頻解碼層包括解碼選擇組件、多樣主流音視頻格式的解碼器以及多路媒體流之間的同步的功能。解碼選擇組件先從本地文件或者流媒體文件中獲取媒體解碼格式的相關信息,通過獲取的信息來匹配出對應的解碼器對媒體流解碼,此部分通過解碼算法的移植、修剪及優化后完成。
數據預處理層對于媒體流文件來說,先要將RTP的包頭信息去除,再對RTP中的音視頻信息進行組幀,同時將全部的數據幀傳遞到上層待解碼緩沖區;而對于本地文件,則需要按照相對應的媒體格式進行解封裝,再將獲取文件的音視頻等信息按幀放入對應的上層待解碼緩沖區。
數據獲取層的功能主要是對本地或流媒體文件的獲取。對本地文件信息獲取需要讀取本地文件即可,而對于流媒體信息文件的獲取,則需要從流媒體服務器上獲取數據信息,獲取信息期間包括前期會話協商、數據緩沖、數據發送等部分。此外,媒體協商部分中協商媒體流的常規信息,例如音視頻媒體類型、傳輸協議以及媒體傳輸端口等信息,這些都需用到RTSP協議[3]。
用戶界面是基于Android的GUI系統實現的[4],由類Video Monitor來具體實現,其類圖如圖2所示。

圖2 Video Monitor類圖
登錄界面效果如圖3所示。

圖3 登錄界面效果
本設計的核心只需要利用解碼算法對視頻文件解封裝以及對音視頻解碼,因為若將整個遠程視頻實時監視的系統全部移植到Android平臺上,可能會造成大批量代碼冗余。同時,整個項目的開發是基于Linux操作系統,忽視了手機平臺能源不足、處理能力不夠大等限制因素的問題,所以面對客戶端手機的功能需求來說,將解碼算法進行移植、修剪和優化是很重要的。
3.2.1 解碼算法的移植
NDK的makefile文件是由Google發布,實質是Android.mk文件,其語法和一般的makefile文件有很多相異點。因為原有的makefile文件在跨平臺編譯時不能被使用,所以將解碼算法里的makefile文件全部替換成NDK中的Android.mk文件是解碼算法移植的必要條件。通過對解碼層結構的分析可以看出,最基礎模塊是avutil,基于已經編譯好的avutil模塊之上的是avcodec模塊,基于avutil和avcodec兩者模塊之上的是avformat模塊。依據這種結構,本設計將編譯移植的順序由下到上設計為avutil,avcoedec,avformat,編譯的步驟如下說明:
1)說明config.h和config.mak文件
config.h和config.mak文件非常重要,因為很多不同的文件都會用到include config.h,編譯器也會依據它而優先選擇對代碼編譯。此外,解碼器自帶的makefile框架通過configure命令之后將產生1個config.h文件和1個config.mak文件,2個文件加起來共有600~700個宏定義,這些宏定義主要用于描述編譯后代碼各部分的參數設置,包括體系架構、編譯器、版本、頭文件、編解碼器等設置。與此同時,有關平臺差異方面的定義在此部分需要重新修改,例如把體系架構改成Android平臺下的ARMv5TE,只有這樣編譯時的指令集才不會選擇X86的指令集而是ARM的指令集。
2)編譯libavutil.a
首先,在libavutil里創建一個Android.mk文件,然后在libavutil里的makefile文件調用subdir.mak就實現了真正的編譯,需要注意的是在Android.mk下書寫make文件可以在此省略,只要直接把對應的源文件引入即可;標準的makefile是指定.o目標文件,但是在Android.mk中需要直接指定.c源文件,Android.mk文件如下所示:
其中,在編譯時出現的錯誤大部分來自于頭文件沒有引入,例如不識別某些文件的size_t關鍵字在該文件include stdio.h后就不報錯等類似問題,修改時只需要把對應的頭文件引入即可。其他層也可以按照以上相同的方法書寫Android.mk文件,并移植到Android平臺。
3.2.2 解碼算法的修剪及優化
在Linux下編譯運行解碼代碼時,要經過三步才能將解碼算法正確的編譯到Linux系統中,即configure,make,make install。第一步configure過程中將生成1個configure.h和1個make文件,作用是查找此次編譯了何種文件。經過操作和嘗試發現可以在configure源代碼中添加多種配置參數,這些參數包括基本選項參數、高級選項參數以及專門提供的優化參數,而優化參數就是用于配置編譯過程中用到的編譯內容。因此本設計也利用這些優化參數,擇優選擇出合適的方法查詢出遠程視頻實時監視需要的文件,而解碼算法的修剪即將其中不需要的文件進行刪除。編譯時設置的參數如下所示:

其中,參數配置在編譯源文件過程中,整個項目只有一部分編譯到鏈接庫,分別是H.264、amr_nb的編碼方法、3gp的文件封裝格式、解封裝文件的源代碼以及全部的解碼格式。而鏈接庫里已被編譯的源代碼的集合就是本設計所需要的源代碼的有效集,可以通過configure.h和make文件中的后綴名為.o文件來進行查找,編譯.c代碼時生成的目標文件其后綴名為.o的文件,因為任何一個被編譯的.c文件都能生成.o文件,所以可以利用查找后綴名為.o文件的方法來判斷配置參數下有哪些文件被編譯,哪些沒有被編譯,最后便可以得出本設計所需要的已編譯的源文件的最小集合。
開源代碼目前能夠跨平臺編譯運行,但是由于手機的CPU處理能力、能源、內存等各方面的限制資源都與PC機存在很大的不同,因此,本設計針對客戶端手機的特性來對代碼進行優化,具體有以下幾點:
1)去除冗余代碼以及調試過程中的打印語句,減少if-else的判斷及不必要的代碼冗余,對局部和全局變量進行調整,對程序結構進行規范,使用寄存器變量代替局部變量。
2)由于邏輯移位指令的執行時間遠遠小于乘除運算指令,因此乘除操作可以用邏輯移位運算來代替,特別是除法指令,被代替后能夠縮短指令運行的時間。
3)在編寫代碼過程中,盡量避免多重循環函數的調用以及盡量降低上下次循環的相關性,這樣做可大大減少沒必要的計算量。
4)設置合理的緩存,設置適合解碼算法移植的目標平臺Android平臺的緩存大小。
本層針對本地文件的預處理可以依賴于解碼算法解封裝功能,但是對流媒體文件的預處理需要將一個或多個RTP數據包整合在一起,其中傳輸階段主要任務是為解碼模塊提供RTP數據包[5]。
RTP實現流程如圖4所示。

圖4 RTP實現流程
1)函數RTP_Create(context*the_context)用于完成RTP會話的初始化和為其上下分配內存,函數先調用ITP Context_Create(the_context),然后再調用RTP_Session_Save_Cxinfo(*the_context,conx_cc),從而完成 RTP 會話初始化后上下文信息的創建和保存。
2)創建RTP結構,此部分由函數Create_Socket()完成,先調用 sockfd=socket(AF_INET,SOCK_DGRAM,0)來創建套接字,若創建成功,則可調用bind(sockfd,(struct sockaddr*)&local,sizeof(local)綁定套接字。
3)獲取且保存本地IP地址,隨機產生同步源標志、創建新的同步源和設置規范名。關鍵代碼如下:

4)判斷會話是否結束。若是,結束網絡數據接收線程;若不是,進入步驟5)。
5)接收RTP包,該部分由函數RTP_Receive(context cid,int fd,char*payload,int*len,struct sockaddr*sin)完成。
6)更新新包號的順序,設置序列號和信息時間標簽。
7)將步驟5)中接收到的RTP數據包加入視頻幀緩沖區中,為解碼使用做準備。
8)回到步驟4)繼續執行。
該層完成主要功能是與流媒體服務器端協商媒體信息細節,并根據協商結果從服務器端獲取流媒體數據,將流媒體數據存入緩沖區,按照本設計緩沖方案將數據包發送給數據預處理層,其結構圖如圖5所示。

圖5 數據獲取模塊結構圖
該層一共啟動5個線程,其中1個線程中啟動TCP連接,用于RTSP會話協商并且在RTP數據傳輸期間,該TCP連接必須一直保留。2個線程分別為接收音頻和視頻RTP數據的線程,另外2個線程分別為接收以及發送音頻和視頻的RTCP數據包[6]。
首先在PC機進行模擬測試,即在Android編譯環境eclipse中將程序運行,通過模擬器測試成功。然后將程序移植到具備Android操作系統的手機里,利用WiFi無線網絡連接服務器并且通過了權限訪問,測試結果驗證了此視頻客戶端軟件在功能上滿足設計的基本需求。其效果如圖6所示。
本文實現了客戶端基于Android平臺的遠程視頻實時監視功能,能夠播放本地及流媒體視頻文件。遠程視頻實時監視系統整體采用分層的設計理念,本文分析了各層的結構特點和關鍵技術,并對解碼層的源代碼進行了修剪和優化。通過對各層的設計,還實現了訪問權限的設置、播放、暫停等功能。本文移植的程序代碼目前能夠穩定的在手機上運行。該設計具有一定的通用性和開放性,可以被應用到其他的客戶終端,對Android開發人員有一定的借鑒意義。
[1]Code Home.Android-An Open Handset Alliance Project[EB/OL].[2011-04-15].http://code.Google.com/android/what is android.Html.
[2]趙亮,張維.基于Android技術的界面設計與研究[J].電腦知識與技術,2009,29(5):8183-8185.
[3]陳瑕,陳平華,李文亮.Android內核分析[J].現代計算機,2009(11):112-115.
[4]余志龍.Google Android SDK開發范例大全[M].北京:人民郵電出版社,2009.
[5]魏聰穎.基于實時流媒體傳輸系統的H.264組包算法研究[J].計算機科學,2007(34):41-44.
[6]西剎子.安防天下——智能網絡視頻監控技術詳解與實踐[M].北京:清華大學出版社,2010:3-10.