摘 要: 針對傳統視頻監控終端龐大,地點固定,有專人值守等特點,提出一種基于VLC開源播放器和Android操作系統的多路視頻監控系統。重點闡述如何通過編譯VLC源代碼以在Android操作系統下實現多路TS流解碼;通過結合視頻服務器、編碼器,進行4路視頻監控;通過與服務器的交互,對云臺進行控制。與傳統的視頻監控系統相比,該系統具有畫面清晰度高、便攜、易接入的特點,具有廣泛的應用前景。
關鍵字: 視頻監控; Android; VLC; 編譯; 云臺控制
中圖分類號: TN964?34 文獻標識碼: A 文章編號: 1004?373X(2013)24?0063?04
Multi?channel video monitoring system based on Android and VLC
LI Zong?chen, ZHU Xiu?chang
(Nanjing University of Posts and Telecommunications, Nanjing 210003, China)
Abstract: Since the traditional video monitoring system usually has a large terminal located at certain place and needs to be watched over by a specially?assigned person, a new multi?channel video monitoring system based on Android operating system and VLC is proposed. The method of compiling VLC source code and migrating it to Android to achieve multi?channel TS stream decoding on Android Platform is elaborated emphatically. The four channel video monitoring can be achieved by combining video server with video encoder. By interacting with video server, the console of the video camera can be control. In comparison with traditional vedio monitoring system, the system has high resolution, and is portable and easy to access. Therefore, it has a broad application prospect.
Keywords: video monitoring; Android; VLC; compile; console control
0 引 言
如今,視頻監控[1]已經被廣泛應用到人們的生活當中,為大家提供了很多便利。傳統的視頻監控通常設有監控室,由專人值守,監控室中設有大的屏幕可以同時看到多路的畫面,使得監控人員可以隨時掌握各個區域的情況。伴隨著智能手機和無線網絡的發展,過去應用廣泛的許多龐大終端如PC機等所實現的功能,尤其是系統的控制功能,現在都已經可以在智能手機終端上實現了。基于這樣的考慮,為了實現視頻監控系統的控制移動化和智能化,開發了一套基于Android操作系統[1]的多路視頻監控系統,可以將現在的多路視頻監控系統應用到手機上,讓管理員可以在任意有WiFi覆蓋的地點實現對監控系統的訪問,使得多路視頻監控變得更加便利。
本文介紹了一種基于Android智能終端的移動視頻監控系統,利用VLC實現多路視頻的解碼播放,終端通過WiFi無線網絡與視頻服務器,視頻編碼器連接,可以實現在局域網中任意地點多路視頻監控與云臺調整等功能。
1 Android系統與VLC播放器
1.1 Android操作系統的軟件開發
Android是一款基于Linux的開源操作系統,具有多媒體性能突出,開發便利的特點。大多搭載在使用了ARM架構的硬件設備上,近兩年來也同樣出現了支持X86架構的Android操作系統。隨著硬件性能的提升,近兩年來,搭載Android操作系統的手機平板等設備在播放視頻方面的性能已經逐漸可以與傳統PC相媲美,實現全高清的視頻播放。
由于Android的開源特性,進行應用程序的開發非常便捷和方便,可以通過在Android SDK中使用Java作為編程語言來開發應用程序,同時也可以通過在Android NDK中使用C或者C++來作為編程語言開發應用程序。
Android提供了MediaPlayer類實現多媒體文件和網絡流的播放。為了實現4路視頻監控,首先考慮使用MediaPlayer實現多路TS流的解碼。經過測試,原生的MediaPlayer由于經過高度集成,只能在上層進行調用,通過提供URL實現播放。播放有4路視頻的TS流時,只顯示其中的一路,并且延遲比較嚴重(達到4~5 s)。因此考慮采用支持多路播放的開源播放器VLC,將其應用到Android上。而由于VLC的代碼完全由C和C++編寫,因此,需要通過將VLC的源代碼編譯成庫文件通過Android提供的JNI接口調用,在底層進行解碼操作后,通過上層應用進行播放。
JNI(Java本地接口)是一個軟件框架,可以讓Dalvik虛擬機中的Java語言通過此接口,調用本地的程序,或者用C++/C/匯編語言編寫的庫文件。使用JNI接口的應用可以讓開發者實現一些用Java語言不便實現的功能,這些情況主要有:
(1)標準的Java類庫沒有提供應用程序所需要的功能,通常這些功能是平臺相關的;
(2)希望使用一些已經有的類庫或者應用程序,而他們并非用Java語言編寫的;
(3)程序的某些部分對速度要求比較苛刻,選擇用匯編或者C語言來實現并在Java語言中調用他們。
1.2 VLC開源播放器
VLC屬于Video LAN開源項目組織中的一款全開源的流媒體服務器[2]和多媒體播放器。作為多媒體播放器,VLC可以播放多種格式的媒體文件,如WMV,MPG,H.264等。
VLC采用全模塊化結構,在系統內部,通過動態的載入所需的模塊,放入一個Module_bank的結構體中統一管理,連VLC的Main模塊也是通過插件的方式動態載入的(通過Module_InitBank函數在初始化建立Module_bank時)。對于不支持動態載入插件的系統環境中,VLC也可以采用Builtin的方式,在VLC啟動的時候靜態載入所需要的插件,并放入Module_bank統一管理。VLC的模塊分成很多,類別主要有Access,Access_filter,Demux等十多種。VLC無論是作為流媒體服務器還是多媒體播放器,它的實際作用就是一個“播放器”,用于處理ES,PES,PS,TS等流間的轉換、傳輸與顯示。對于多媒體播放器如果采用UDP方式傳輸,它的解碼過程為:TS→DEMUX→ES。
該系統用VLC作為多路TS流的播放器,系統收到由視頻服務器打包的4路TS流之后,經過DEMUX模塊實現分離,再送至解碼模塊實現播放。
2 VLC的編譯與使用
2.1 環境搭建與VLC的編譯
要進行VLC的編譯,首先需要搭建Linux環境,安裝Ubuntu 12.04系統。系統搭建完成之后,安裝必要的工具JDK,SDK,NDK,ANT,完成上述必備條件之后按如下步驟進行:
(1)打開Ubuntu的終端進行環境變量的設置(path為所在文件路徑):
export ANDROID_SDK=/path/to/android?sdk
export ANDROID_NDK=/path/to/android?ndk
export PATH=$PATH:$ANDROID_SDK/platform?tools:$ANDROID_SDK/tools
(2)設置與處理器相關的環境變量,本實驗采用型號為GT?P5110的平板電腦,安裝有Android 4.1操作系統,處理器為支持NEON的ARMv7芯片,因此按照如下設置:
export ANDROID_ABI=armeabi?v7a
(3)用git獲取VLC源碼:
git clone git://git.videolan.org/vlc?ports/android.git
(4)執行編譯:
sh compile.sh
編譯完成后,會生成一個VLC目錄,通過開發工具Eclipse導入VLC項目。如圖1所示,上層的主要源代碼存放于Java包org.videolan.vlc中,其中LibVLC類需要主要使用的類,提供了VLC對象初始化,獲取對象等方法。編譯后同時生成了4個.so庫文件放于armeabi?v7a文件夾下(如圖2 所示),其中以libiomx命名的3個庫文件為針對不同Android版本的IOMX庫文件,可以實現不同平臺上的硬件解碼;libvlcjni.so為解碼播放所要用到的庫文件。
圖1 編譯之后所需要用到的Java語言包
2.2 利用VLC實現四路視頻解碼播放
要實現一個Android應用程序,首先需要創建一個類,繼承Activity類,在應用程序的Activity中創建4個SurfaceView,分別用于顯示所要呈現的四路畫面。
首先在上層通過以下的代碼載入之前編譯過的libvlcjni.so庫
{
System.loadLibrary(\"vlcjni\");
}
LibVLC類通過聲明庫中的本地函數,就可以在上層供應用程序調用。
應用程序獲取到視頻URL之后,要通過VLC進行播放,首先需要獲取到LibVLC的對象:LibVLC m_LibVLC = LibVLC.getInstance(),通過對象m_LibVLC調用類中成員函數readMedia(String url, boolean novideo),在readMedia中,再進行調用本地函數private native void readMedia(long instance, String url, boolean novideo)。函數的3個參數依次為:LibVlc的對象,視頻URL,是否為視頻的標志位。在此函數當中視頻URL通過JNI接口由上層傳遞下去,從而調用libvlcjni.so進行視頻的解碼操作。
以上為在程序中通過設置URL來調用解碼庫進行視頻解碼,為正確顯示4路視頻,還需要將解碼后的數據在屏幕上進行顯示。此時需要在Activity中創建4個SurfaceView對象。SurfaceView對象用于將Surface的內容顯示給用戶。Surface為系統中一個緩沖區的句柄,用于進行繪圖操作。
VLC解碼后的圖像數據通過本地函數attachSurface(Surface surface, Activity player, int width, int height,int nChannelNum)與要顯示的Surface相關聯。參數nChannelNum為視頻的通道數,就本文而言,由于有4路,需要調用4次attachSurface函數。
現在為每個Surface創建容器類SurfaceHolder并設置回調接口SurfaceHolder.Callback。接口中定義了3個函數,surfaceCreated,surfaceChanged,surfaceDestroyed,當Surface被Activity創建時會自動調用surfaceCreated函數,在surfaceCreated函數中進行attachSurface操作,將每一路視頻與Surface進行綁定,這樣視頻內容在解碼后就可以顯示在SurfaceView上。
3 實現多路視頻監控系統
3.1 系統設計
本文所用的視頻監控系統主要由4部分組成:視頻采集模塊(攝像頭)、視頻編碼模塊(編碼器)、視頻處理服務器與接受視頻數據的平板電腦。各模塊之間的結構與數據傳遞方式如圖3所示。
為取得4路畫面,用4臺編碼器連接2臺標清攝像頭與2個視頻源,經編碼器編碼得到4路H.264碼流。碼流經由視頻處理服務器進行打包,形成一路TS流。為了實現多路視頻監控系統,實現所需要的控制功能,所設計的應用程序主要功能有:服務器節目信息解析、多路視頻播放、攝像頭云臺控制。進入應用程序之后,首先向服務器發出請求,獲取服務器上的節目信息;服務器收到請求后,在HTTP中返回XML格式的字符串;收到返回信息之后,通過SAX方式解析出所要播放的URL,將其設置給VLC的對象進行播放。
圖3 監控系統的主要結構與數據傳遞方式
應用程序初始化后,進行直播的實際效果如圖4所示。左邊3路中2路為攝像頭數據,另一路和右邊畫面為采集到的數據。通過設置編碼器參數,輸出視頻碼率為200 kHz的時候,可以看到,4路分辨率為CIF的畫面較清晰,且速度流暢。
圖4 系統進行4路TS流直播的效果截屏
3.2 云臺控制功能
在視頻監控當中,全景攝像頭的使用非常廣泛。管理員時常需要對攝像頭的云臺進行控制,進行角度/焦距/光圈等的調整。如果可以在平板上實現調整云臺的功能,管理員就可以在任何有Wifi覆蓋的地點實現對云臺的控制,使得整個監控系統的功能更加完善。如圖4所示,4個Surfaceview下方設置了云臺控制欄,提供包括攝像頭位置調整、光圈、距離、焦距、速度在內的云臺控制功能。
平板上實現云臺控制,主要需要以下步驟:
(1)向服務器端請求當前播放的多路視頻信息,取到每一路視頻的PID以及對應編碼器IP。
(2)由于一次只能對一路畫面進行云臺調整,因此需要知道所要調整畫面的編碼器地址。通過VLC在解碼時候取出某一路視頻碼流中的PID,通過PID,IP匹配,可以獲知此路畫面的編碼器IP。
(3)由平板向編碼器發送云臺調整命令。編碼器收到之后,進而向攝像頭發送命令,從而實現云臺調整。
為讓4路都可以進行云臺調整,在原先應用程序中添加手勢偵測功能。令Activity繼承android.view.GestureDetector.OnGestureListener。如圖5所示,4路畫面的位置固定如圖,用戶進行云臺調整的畫面始終為畫面1,因此當需要對諸如畫面4的畫面進行云臺調整時,就需要通過手勢將畫面4位置的畫面移至畫面1。用戶通過在觸摸屏上滑動,經監聽器偵測,當起點位置在畫面4的區域中,而終點在畫面1當中時,系統就會調用OnGestureListener接口中的OnFling函數,函數中,將這2路畫面所在的SurfaceHolder進行互換,就完成了畫面拖動。此時,按照圖4當中的云臺控制欄進行操作,程序獲取到畫面4的編碼器IP后,通過向編碼器發送命令,即可實現云臺控制。
圖5 云臺調整圖示
4 結 語
手機的智能化促使人們將日常生活的應用越來越多的移植到手機上。本文通過編譯VLC源代碼,將開源播放器VLC的多路視頻播放功能應用到Android操作系統上,從而實現了多路直播流的解碼。進而通過與服務器的整合,加入云臺控制功能,可以實現4路監控與攝像頭控制功能,讓用戶可以更方便地進行移動監控。經過測試,在播放四路CIF分辨率的視頻時,畫面清晰流暢,可以滿足日常監控的需要,同時,云臺控制功能為管理員的操作提供了方便,因此本系統有著較好的應用前景。
參考文獻
[1] 孔曉東,曾貴華.智能視頻監控技術研究[D].上海:上海交通大學,2008.
[2] 焦磊.基于 Android 的多媒體彩像系統終端軟件的研究與實現[D].北京:北京交通大學,2010.
[3] 曹曉芳,王超,李杰.一種基于 Android 智能手機的遠程視頻監控的設計[J].電子器件,2011,34(6):709?712.
[4] 韓超,梁泉.Android 系統原理及開發要點詳解[M].北京:電子工業出版社,2010.
[5] 郭宏志.Android 應用開發詳解[M].北京:電子工業出版社, 2010.
[6] 佚名.H.264/AVC新一代視頻壓縮編碼標準[S].北京:人民郵電出版社,2005.
[7] 付少華,付紅橋,王政.基于 3G 網絡的手機移動視頻監控系統的設計[J].計算機應用,2011,31(1):70?72.
[8] 常志沛.基于 Android 的智能手機視頻監控系統的設計與實現[D].大連:大連海事大學,2011.
[9] 尚青青,朱秀昌.高清視頻監控中心的設計與實現[J].電視技術,2013,37(11):183?187.
[10] 石頭,張笑微,周建雄.智能網絡視頻監控系統[J].兵工自動化,2009,28(12):71?74.
[11] 王娟,郭家奇,劉微.WiFi 技術的深入探討與研究[J].價值工程,2011(6):80?83.