摘 要:以ARM9處理器S3C2440為核心芯片搭建硬件平臺,采用嵌入式Linux操作系統為軟件開發平臺,設計了一種基于B/S模式的嵌入式視頻監控系統的設計方案。通過構建流媒體服務器,完成視頻數據的采集、壓縮、傳輸和保存。采用TCP/IP網絡協議,移植了Web服務器,開發了Java Applet程序,用戶通過瀏覽器即可對遠程視頻進行實時監控。系統具有實時性強、體積小、成本低廉、性能穩定、交互性好等特點,具有廣泛的應用價值。
關鍵詞:嵌入式;視頻采集;視頻監控;TCP/IP;B/S
??? 視頻監控系統將被監控現場的實時圖像和數據等信息準確、清晰、快速地傳送到監控中心服務器,監控中心將實時、直接地掌握各個被監控現場的當前情況(包括圖像、聲音及其他敏感數據),從而對敏感事件進行快速反應[1]。視頻監控正朝著數字化、網絡化、集成化的嵌入式視頻監控方向蓬勃發展。相比傳統的視頻采集監控系統,嵌入式視頻監控系統具有可靠性高、組網方便、可遠程監控等優點,因而更適用于工業控制、銀行、政府部門的安防系統中[2]。
??? 本文設計了一種具有用戶零維護、價格低廉、性能穩定等特點的嵌入式視頻監控系統。該系統以ARM處理器S3C2440和嵌入式Linux操作系統為核心平臺,通過USB攝像頭采集視頻數據,基于TCP/IP協議進行網絡傳輸,用戶通過瀏覽器即可監控遠程視頻,視頻可以保存,以便回放。
1 視頻監控系統方案設計
1.1 監控系統硬件平臺設計
??? 監控系統硬件平臺是整個監控系統的基礎,在系統設計中占有至關重要的地位,硬件選擇的成功與否直接決定著系統功能的優劣。本設計中主要硬件有NAND Flash、嵌入式處理器S3C2440、SDRAM、網卡、USB接口攝像頭等。
?? ?視頻監控系統的硬件結構方案如圖1所示。系統以S3C2440處理器為核心,外擴其他外圍設備。S3C2440處理器是Samsung公司基于ARM公司的ARM920T處理器核,它是一款高度集成的芯片,主頻為400 MHz,提供了一套較完整的通用外圍設備接口,支持性價比非常高的NAND Flash啟動,可支持Linux等多種操作系統的移植[3]。
1.2 監控系統軟件方案設計
?? ?本系統選擇Linux操作系統作為軟件開發平臺,編譯環境采用交叉編譯調試的方式,嵌入式Linux的內核選用2.6.13,根文件系統采用yaffs。
?? ?一套完整的視頻監控系統應該至少包含視頻數據的采集、處理、傳輸、存儲與控制等功能,為了很好地實現以上功能,本系統劃分為三大功能模塊:嵌入式流媒體服務器、嵌入式Web服務器和用戶視頻監控端。嵌入式流媒體服務器模塊主要實現視頻數據的采集、存儲和傳輸等功能;嵌入式Web服務器模塊負責處理監控端發來的請求并通過與瀏覽器的交互為用戶提供監控平臺;用戶視頻監控端模塊實現對遠程視頻的實時監控,并且可以控制視頻的亮度和對比度等。
2 嵌入式流媒體服務器的實現
?? ?流媒體服務器模塊的主要功能有視頻采集、視頻壓縮、視頻存儲和視頻傳輸。本系統采用中星微公司生產的ZC0301芯片的USB攝像頭,ZC0301主要由五大功能模塊組成,即系統控制、圖像信號處理、次取樣和水平掃描模塊、JPEG編碼器和USB設備控制[4]。采用該芯片的攝像頭應用最廣泛,方便購買和維護,經過此芯片處理后得到的是JPEG編碼的位流,實現了視頻的壓縮。
2.1 基于Video4Linux的視頻采集
?? ?Video4Linux(簡稱“V4L”)是Linux中關于視頻設備的內核驅動,它是針對視頻設備的應用程序編程提供的一系統接口函數。視頻采集的基本流程如圖2所示。利用V4L對USB攝像頭的編程需要用到Linux下2個系統調用,分別是ioctl()調用和mmap()調用。
??? 在V4L標準中提供了多個數據結構和控制命令, 程序通過調用函數對設備進行控制, 完成視頻采集的任務。ioctl()函數中主要的設備控制命令有:
?? ?(1)VIDIOCGCAP:獲取采集設備基本信息,比如支持最大最小分辨率等;
?? ?(2)VIDIOCSPICT、VIDIOCGPICT:分別為設置和獲取采集圖像的各種屬性;
?? ?(3)VIDIOCGMBUF:獲取緩沖區信息,比如每幀大小、最多支持的幀數等;
?? ?(4)VIDIOCMCAPTURE:捕捉圖像,獲取圖像信息;
?? ?(5)VIDIOCSYNC:等待采集一幀圖像完畢。
?? ?應用程序獲取攝像頭采集的圖像數據有兩種方法,分別是read()(直接讀取的方法)和mmap()(內存映射的方法)。mmap()系統調用使得進程之間通過映射同一個文件而實現內存共享,優點是效率高,因為進程可以直接讀寫內存,而不需要任何數據的拷貝,加速了I/O訪問,本系統就采用此方法。
2.2 基于TCP/IP協議的視頻傳輸
?? ?TCP/IP協議指的是Internet上使用的兩種網絡協議,即傳輸控制協議和網際協議。TCP協議是一個可靠的點到點之間的協議,IP協議是一個傳輸層的協議。TCP/IP協議族可以將各種操作系統和網絡部件連接起來,它提供了一種在各種系統間移動數據的標準方法[5]。
?? ?本系統中,首先服務器通過socket函數創建套接字,并使用bind函數將套接字與某端口進行綁定;然后調用listen函數,服務器將處于監聽狀態,等待用戶監控端請求連接指定端口;當接收到用戶監控端的連接請求后,服務器調用accept函數來建立與用戶監控端間的通信;在成功建立通信后,就可以通過read函數或write函數進行通信。
?? ?本系統可以人機交互,用戶通過網頁可以向視頻服務器傳遞控制信息,比如調節幀速、亮度等。當建立連接后,首先用戶監控端發送一個包含控制信息的client_t結構體數據給視頻服務器;然后視頻服務器根據控制信息采集一幀視頻數據,并生成一個包含這一幀視頻信息的frame_t結構體數據,把它們發送給用戶監控端。這就完成了一次人機交互,這樣不斷地循環,就實現了數據傳輸。
3 嵌入式Web服務器的實現
3.1 嵌入式Web服務器的選擇
?? ?Linux下嵌入式Web服務器主要有3個,分別是httpd、thttpd和Boa。httpd是最簡單的一個Web服務器,它的功能最弱,不支持認證,不支持CGI。thttpd和Boa都支持認證和CGI等,功能都比較全。本系統采用Boa Web服務器,它通過建立HTTP請求列表來處理多路HTTP連接請求,節省了系統資源,這對嵌入式系統來說至關重要。同時它還具有自動生成目錄、自動解壓文件等功能。Boa具有很高的HTTP請求處理速度和效率,在嵌入式系統中具有很高的應用價值。
3.2 Boa在ARM上的移植與配置
?? ?(1)移植過程
?? ?從http://www.boa.org/下載Boa源碼,選擇boa-0.94.13.tar.gz,輸入解壓命令“tar xzvf boa-0.94.13.tar.gz”;進入解壓生成的源碼目錄下的src子目錄,輸入命令“./configure”,生成Makefile文件;修改Makefile文件,將CC和CPP的值改成交叉編譯器安裝的路徑;輸入命令“make”即可交叉編譯生成可執行文件Boa,通過串口下載到根文件系統下的/ bin下就實現了移植。
?? ?(2)配置
?? ?在/etc目錄下新建一個Boa目錄,里面存放Boa的主要配置文件boa.conf,在Boa源碼目錄下已有一個示例boa.conf,可以在其基礎上進行修改;修改Group nogroup為Group root,修改User nobody為User root,這里的root是開發板存在的組和用戶;修改#ServerName www.your.org.here為ServerName cs2440;修改DocumentRoot /var/www為DocumentRoot /www,設置HTML文檔的主目錄/www,其他采用默認設置即可。此外,還需要將mime.types文件復制到/etc目錄下,通常可以從Linux主機的/etc目錄下直接復制即可。
4 基于B/S模式的用戶視頻監控端實現
?? ?系統采用B/S模式,相比C/S模式,用戶不需要做任何維護,這對用戶人力、物力、時間、費用的節省是顯而易見的,并且可以跨平臺操作,真正方便了用戶。
?? ?系統通過開發Java Applet應用程序,并嵌入網頁中,網頁名稱設為Boa Web服務器默認主頁名,把它們保存在/www中,用戶在瀏覽器地址欄中輸入視頻服務器的IP地址,就能在網頁里顯示攝像頭的監控圖像。通過Java Applet與視頻服務器進行交互,實現對視頻數據的控制、傳輸和播放。Java Applet程序中主要功能步驟和主要函數可描述為:
?? ?(1)創建套接字、輸入流和輸出流。
?? ?connection=new Socket(m_strServer,port);
?? ?in=connection.getInputStream();
?? ?out=connection.getOutputStream();
?? ?IP地址及端口都是由嵌入在HTML中部分的參數傳入的,并創建此Socket對象的輸入流和輸出流。
?? ?(2)分配接收緩沖區:byte[]buffer=new byte[512*1024];
?? ?(3)發送一個用戶控制信息。它由用戶用鼠標點擊圖標而生成。當用戶點擊瀏覽器中的視頻窗口時,在上方會顯示亮度等圖標,通過點擊圖標兩側的“+”和“-”而寫入控制信息;當點擊圖標以外的地方,圖標就會消失,實現全窗口的視頻,便于監控,操作簡單。
?? ?Public void mouse(MouseEvent evt) {…};
?? ?out.write(b);//b是包含控制信息的字符數組名
?? ?(4)讀取一幀圖像頭信息,確認圖像數據的正確性和獲取圖像數據的大小。
?? ?n=in.read(buffer,0,HDRLEN);//HDRLEN為圖像信息頭長度,設置為50 B
?? ?對頭信息中包含的約定字符進行判斷,若正確就可以繼續接收圖像數據,不正確則返回(3)。
?? ?(5)讀取圖像數據,把頭信息后的圖像數據寫入緩沖區,以供播放顯示。
?? ?r=in.read(buffer,HDRLEN,buffer.length-HDRLEN);
?? ?(6)實現圖像顯示。由于緩沖區中包含圖像頭信息,為單獨使用圖像數據,需把圖像數據拷貝到另一緩沖區buffer2中。
?? ?BufferedImage image=?? ?ImageIO.read(new ByteArrayInputStream(buffer2));
?? ?ImageIcon ii=new ImageIcon(image);
?? ?m_label.setIcon(ii);//顯示圖像
?? ?通過以上(3)到(6)的不斷循環運行,用戶從監控網頁上可以看到連續動態的圖像,效果很好,畫面流暢,不存在明顯的延時,實現了視頻監控。
????本文提出的這種基于B/S的嵌入式視頻監控系統相比傳統C/S模式,真正實現了用戶零維護,可以跨平臺監控,方便用戶。采用嵌入式處理器和Linux操作系統相結合,很好地體現了本監控系統具有集成化、網絡化、功耗低等優點,可廣泛擴展應用在工業控制、可視電話、交通管理等諸多領域。
參考文獻
[1] 劉富強.數字視頻監控系統的開發及應用[M」.北京:機械工業出版社,2003:2-16.
[2] 于明,范書瑞,曾祥燁.ARM9 嵌入式系統設計與開發教程[M].北京:電子工業出版社,2006:15-75.
[3] Samsung Electronics.S3C2440A 32-Bit CMOS Microcontroller User’s Manual[S],2004.
[4] Vimicro Corporation.ZC0301 Preliminary Data Sheet[M/CD].2002.
[5] 張曦煌,柴志雷.Linux中TCP/IP協議實現及嵌入式應用[M].北京:北京航空航天大學出版社,2008:5-12.
評論
查看更多