0 引言
隨著汽車客運事業(yè)發(fā)展,,營運人員在營運過程中的安全以及管理也越來越被重視,。由于存在乘客與營運人員經(jīng)常因逃票、服務(wù)態(tài)度等問題而產(chǎn)生糾紛,、客運過程中交通事故雙方的責(zé)任鑒定比較模糊,、車內(nèi)盜竊事件缺乏有力的證據(jù)以及車輛失竊和司機酒駕等問題,,本文提出基于ARM Linux的3G無線車載視頻監(jiān)控系統(tǒng),可有效減少上述事件的發(fā)生,,給予車乘人員以及車輛安全保障,。此系統(tǒng)在Linux操作系統(tǒng)下,利用嵌入式開發(fā)板S3C2440搭建硬件環(huán)境,,通過USB攝像頭以及GPS模塊采集車內(nèi)實時的視頻和位置信息,,視頻數(shù)據(jù)通過H.264的高效壓縮編碼,既可以得到高壓縮比又擁有高質(zhì)量流暢的圖像,,可以大大減少需要傳輸?shù)臄?shù)據(jù)量,,并且將3G無線網(wǎng)絡(luò)作為傳輸媒介,既可以解決傳統(tǒng)有線網(wǎng)絡(luò)對運動中的監(jiān)控不能實現(xiàn)的問題,,提供更加靈活的組網(wǎng)方式,,滿足不能架設(shè)線路的監(jiān)控點的監(jiān)控需求,還可以提供比GPRS和CDMA更寬的數(shù)據(jù)傳輸帶寬,,滿足移動視頻監(jiān)控的要求,。最終監(jiān)控終端通過Web瀏覽器可以實時監(jiān)控車輛內(nèi)部的視頻畫面以及車輛所在的位置速度等信息。
1 系統(tǒng)的總體設(shè)計
3G無線視頻監(jiān)控系統(tǒng)主要由車載移動監(jiān)控終端,、網(wǎng)絡(luò)傳輸,、遠程客戶端3部分組成。系統(tǒng)的總體結(jié)構(gòu)如圖1所示,。整個視頻監(jiān)控系統(tǒng)采用B/S結(jié)構(gòu),。車載移動監(jiān)控終端主要包括S3C2440平臺上運行的GPS數(shù)據(jù)采集以及視頻采集、視頻的編碼,、嵌入式Web服務(wù)器,、流媒體服務(wù)器。網(wǎng)絡(luò)傳輸以TCP/IP協(xié)議為基礎(chǔ)構(gòu)建,,實現(xiàn)RTP,、RTCP、HTTP,、TCP,、UDP等傳輸協(xié)議。遠程客戶端實現(xiàn)車輛位置以及視頻數(shù)據(jù)的接收,、視頻流的解碼播放,、網(wǎng)絡(luò)狀況反饋等功能。系統(tǒng)工作原理為:通過USB攝像頭獲取實時車輛內(nèi)情況和司機駕駛狀況,,通過GPS定位模塊獲取GPS數(shù)據(jù)(經(jīng)緯度,、高度、時間、速度),,并傳送給ARM處理器,,處理器對接收數(shù)據(jù)進行H.264編碼并將編好碼的NAL單元傳送給流媒體服務(wù)器,流媒體服務(wù)器對壓縮好的數(shù)據(jù)進行RTP封裝并通過內(nèi)部總線送到內(nèi)置的boa服務(wù)器,,并根據(jù)RTCP反饋回來的控制信息對H.264編碼器和視頻采集速率進行控制,。Boa小型嵌入式服務(wù)器結(jié)合CGI技術(shù)來實現(xiàn)監(jiān)控端和客戶端的交互。遠程客戶端通過無線網(wǎng)絡(luò)與boa服務(wù)器連接,,采用ActiveX技術(shù)實現(xiàn)視頻數(shù)據(jù)的接收,、RTP報文的解封裝、發(fā)送RTCP反饋信息,、H.264視頻解碼,、Web瀏覽器的顯示。
2 系統(tǒng)的硬件組成及選型設(shè)計
2.1 車載移動終端
車載移動終端的組成如圖2所示,,主要由4部分組成:ARM處理器,、GPS模塊、3G無線數(shù)據(jù)發(fā)送模塊,、圖像采集模塊。主控處理器芯片選用三星公司推出的16/32位RISC微處理器S3C2440A,,S3C2440A采用ARM920t內(nèi)核,,0.13μm的CMOS標準宏單元和存儲器單元,最高運行頻率達到400MHz,,它的低功耗,、簡單、考究和全靜態(tài)是專門為需要考慮花費和功耗的應(yīng)用設(shè)計的,,特別適用本系統(tǒng),。S3C2440A提供了豐富的片內(nèi)資源,支持Linux,。集成在芯片上的功能有:16 KB的指令和數(shù)據(jù)Cache,、LCD控制器、AC97音頻接口,、攝像頭接口,、DMA控制器、PWM定時器,、MMC接口等,。它能完成整個系統(tǒng)的調(diào)度工作,在系統(tǒng)上電時配置所有需工作芯片的功能寄存器,,完成視頻流的編碼,,并通過3G無線網(wǎng)絡(luò)向監(jiān)控終端發(fā)送視頻碼流。
GPS模塊使用u_blox公司的LEA-5H。LEA-5H具有50個通道的u-blox引擎,,一百多萬個有效相關(guān)器,,熱啟動和輔助啟動首次定位時間小于1 s,-160 dBm的SuperSense捕獲和跟蹤靈敏度,,運行限制速度515 ms,。系統(tǒng)通過該模塊實時接收定位信息,保證中心控制模塊可以實時處理定位數(shù)據(jù),。
圖像采集模塊的硬件資源選用了帶USB接口的中星微攝像頭,。該款攝像頭造價低廉,成像效果好,,體現(xiàn)出了較好的性價比,。與此同時。主板還預(yù)留了多個外圍接口,,以便擴展功能,。
無線通信模塊采用SIMCOM公司的SIM5218模塊。無線SIM5218是一款WCDMA/HSDPA/GSM/GPRS/EDGE模塊解決方案,,支持下行速率達7.2 Mb/s和上行速率為5.76 Mb/s的數(shù)據(jù)傳輸服務(wù),,這對視頻和圖像等數(shù)據(jù)量相對較大的信號傳輸而言是非常理想的選擇。同時,,它還具有豐富的接口包括UART,,USB 2.0,GPIO,,I2C,,GPIO,GPS,,攝像頭傳感器和內(nèi)嵌SIM卡等,。在費用方面,3G因為是借助分包交換的技術(shù),,所以,,網(wǎng)絡(luò)使用的費用是以消費者的數(shù)據(jù)傳輸量來定。
2.2 監(jiān)控中心
車輛監(jiān)控中心由顯示屏幕,、監(jiān)控服務(wù)器,、主控工作臺、路由器和存儲器等硬件組成,。按功能區(qū)分,,其基本功能模塊有數(shù)據(jù)接收模塊、解碼模塊,、顯示模塊和存儲模塊等,。由于監(jiān)控中心硬件可采用通用器件,,故不需要進行專門的選型設(shè)計。
3 系統(tǒng)軟件實現(xiàn)
系統(tǒng)選擇Linux操作系統(tǒng),。Linux具有源代碼開放,、成本低廉、內(nèi)核可裁減性強等特點,,且集成有TCP/IP協(xié)議,,對網(wǎng)絡(luò)的支持是相對于其他操作系統(tǒng)的優(yōu)勢?;贏RM Linux的視頻監(jiān)控終端的軟件設(shè)計主要完成三方面的工作:第一在硬件上搭建一個軟件平臺,,搭建嵌入式Linux軟件開發(fā)平臺需要完成UBOOT移植、嵌入式Linux操作系統(tǒng)內(nèi)核移植以及嵌入式Linux操作系統(tǒng)的設(shè)備驅(qū)動程序的開發(fā)等工作,;第二在軟件平臺的基礎(chǔ)上,,借助交叉編譯工具,開發(fā)視頻監(jiān)控終端上運行的采集,、壓縮,、流媒體服務(wù)器程序;第三監(jiān)控中心運行的接收,、解壓縮,、顯示程序。
3.1 S3C2440A的Linux平臺的搭建
構(gòu)建嵌入式Linux開發(fā)平臺需要先構(gòu)建交叉編譯環(huán)境,。一套完整的交叉編譯環(huán)境包括主機和目標機,。在開發(fā)中主機是一臺裝有Centos 5.5操作系統(tǒng)的PC機,目標機是基于S3C2440A的視頻監(jiān)控終端,。選用的嵌入式Linux內(nèi)核源代碼包版本號為2.6.28,交叉編譯器是GCC 4.3.2,。編譯內(nèi)核之前首先要配置內(nèi)核,,裁減掉冗余的功能模塊。具體步驟如下:
(1)通過命令make menuconfig,,對內(nèi)核進行配置,,選擇YAFFS文件系統(tǒng),支持NFS啟動,,啟用USB設(shè)備支持模塊,,包括USB設(shè)備文件支持模塊、USB主控制器驅(qū)動模塊等,。此外,,USB攝像頭屬于視頻設(shè)備,還需要啟用Video4Linux模塊,;
(2)用make dep命令生成內(nèi)核程序間依賴關(guān)系,;
(3)make zlmage命令生成內(nèi)核映像文件;
(4)make modules和make modules_install命令生成系統(tǒng)可加載模塊。這樣就生成了zlmage內(nèi)核映像文件,,把它下載到目標平臺的FLASH中,。
本設(shè)計采用USB外置攝像頭,在內(nèi)核配置時要求以模塊形式動態(tài)加載,。首先要完成驅(qū)動程序驅(qū)動中需要提供基本的I/O操作接口函數(shù)open,、read、write,、close的實現(xiàn),,對中斷的處理實現(xiàn),內(nèi)存映射功能以及對I/O通道的控制接口函數(shù)ioctl等,,并把他們定義在struct file_operations中,。接著把USB驅(qū)動程序編譯成可以動態(tài)加載的模塊。
3.2 車載移動終端軟件設(shè)計
3.2.1 GPS模塊程序設(shè)計
GPS接收機GPS15L輸出數(shù)據(jù)格式符合NMEA-0183標準,。NMEA-0183協(xié)議是由美國國家海洋電子協(xié)會制定的一種串行通信的數(shù)據(jù)協(xié)議,,所有輸入輸出信息均為一行ASCII字符。它的一條消息稱為語句(Sentence),,每條語句都以“$”開始,,以回車換行符(
由圖3可以看出,,GPS模塊啟動后首先對串口的初始化也就是對GPS模塊的初始化,包括設(shè)置波特率,、數(shù)據(jù)位,、校驗位等;然后后開始接收GPS數(shù)據(jù),,即從串口讀數(shù)據(jù),,并將讀到的數(shù)據(jù)保存到BUF中,接著進入數(shù)據(jù)的解析和提取階段,,判斷BUF[5]是否等于“c”以判斷是否為MYMGPR MC,,若是,則開始提取經(jīng)緯度,、時間等信息并存入結(jié)構(gòu)體GPS_DATA中,。
3.2.2 視頻采集模塊設(shè)計與實現(xiàn)
視頻采集模塊是通過嵌入式Linux操作系統(tǒng)調(diào)度V4L(Video4Linux)及影像設(shè)備驅(qū)動程序來完成視頻采集。V4L是Linux影像系統(tǒng)與嵌入式影像的基礎(chǔ),,是Linux kernel里支持影像設(shè)備的一組API,。在Linux操作系統(tǒng)中,外部設(shè)備被作為設(shè)備文件來管理,,從而使得對外部設(shè)備的操作就轉(zhuǎn)變成對設(shè)備文件的操作,。其采集流程如圖4所示。
主要過程如下:
(1)打開視頻設(shè)備,。調(diào)用函數(shù)int open(constchar * pathname,,int flags),若返回值為-1,,表示打開失敗,,否則,,表示所打開設(shè)備的文件描述符,。
(2)讀取設(shè)備信息。Ioctl(cam_fp,,VIDIOC_QUERYCAP,,&cap)函數(shù)來取得設(shè)備文件的屬性參數(shù)并存儲存于cap結(jié)構(gòu)中,其中cam_fp指的是打開的視頻設(shè)備文件描述符,。
(3)選擇視頻的輸入方式,。通過ioetl(cam_fp,,VIDIOC_S_INPUT,&chan)函數(shù)設(shè)置視頻設(shè)備的輸入方式,,其中chan的數(shù)據(jù)結(jié)構(gòu)類型是V4L2 _input,,用來指定視頻的輸入方式。
(4)設(shè)置視頻幀的格式,。通過ioctl(cam_fp,,VIDIOC_S_FMT,&fmt)函數(shù)設(shè)置視頻的幀格式,,其中fmt的數(shù)據(jù)結(jié)構(gòu)類型是V4L2_format,,用來指定視頻的寬度、高度,、像素大小等,。
(5)讀取視頻數(shù)據(jù)。通過read(cam_fp,,g_yuv,,YUV_SIZE)函數(shù),把攝像頭一幀的數(shù)據(jù)存放到g_yuv中,,其中YUV_SIZE指的是每幀數(shù)據(jù)的大小,。
(6)關(guān)閉視頻設(shè)備。通過close(cam_fp)函數(shù)來實現(xiàn)視頻設(shè)備的關(guān)閉,。根據(jù)流程圖可對其進行相應(yīng)操作,。當攝像頭通過USB接口連接后,程序中調(diào)用V4L API對設(shè)備文件的讀操作read(),,即可完成視頻數(shù)據(jù)采集到內(nèi)存中,,視頻數(shù)據(jù)可用圖4形式保存,也可壓縮后封裝進數(shù)據(jù)包,。本文是先將采集數(shù)據(jù)進行H.264壓縮后再封裝進數(shù)據(jù)包,,并傳輸?shù)奖O(jiān)控PC進行處理。
3.2.3 視頻壓縮模塊設(shè)計
因視頻采集模塊采集的視頻數(shù)據(jù)信息量非常大,,為了提高數(shù)據(jù)傳輸速度,、降低網(wǎng)絡(luò)數(shù)據(jù)流量、保證監(jiān)控的實時性,,有必要對車載攝像頭采集的數(shù)據(jù)壓縮編碼,。文中采用H.264硬編碼方式(硬編碼具有不占用CPU資源,運算速度快等優(yōu)點,,從而滿足視頻數(shù)據(jù)實時性的要求)將攝像頭采集的圖像系列壓縮編碼成流媒體,。具體編碼的過程如圖5所示。
(1)創(chuàng)建H.264編碼結(jié)構(gòu),。調(diào)用SsbSipH264Encodehlit(width,,height,,frame_rate,bitrate,,gop_num)函數(shù)實現(xiàn),,其中width表示圖像的寬度,height表示圖像的高度,,frame_rate表示幀頻,,bitrate表示比特率或碼率,gop_num表示兩個相離關(guān)鍵幀之間最多包含多少個幀(B或P幀),。
(2)初始化H.264編碼結(jié)構(gòu),,調(diào)用SsbSipH264Encode Exe(handle)函數(shù)。
(3) 獲取視頻輸入地址,,調(diào)用SsbSipH264EncodeGetInBuf(handle,,0)函數(shù)來實現(xiàn),該函數(shù)返回視頻輸入的首地址,,存放在p_inbuf中,。
(4)輸入視頻數(shù)據(jù),調(diào)用memcpy(p_inbuf,,yuv_bur,,frame_size)函數(shù)實現(xiàn),p_inbuf存放需要編碼的數(shù)據(jù),,yuv_buf存放原始視頻數(shù)據(jù),,frame_size表示數(shù)據(jù)的大小。
(5)編碼視頻數(shù)據(jù),,對p_inbuf內(nèi)容進行H.264編碼,,調(diào)用SsbSipH264EncodeExe(handle)函數(shù)實現(xiàn)。
(6) 輸出已編碼的數(shù)據(jù),,調(diào)用 SsbSipH264EncodeGetOutBuf(handle,,size),該函數(shù)返回已編碼圖像的首地址,,size表示已編碼圖像的大小,。
(7)關(guān)閉硬編碼設(shè)備,調(diào)用SsbsipH264Encode DeInit(handle)函數(shù)實現(xiàn)的,。
3.2.4 嵌入式服務(wù)器boa移植
Linux支持boa,、HTTPD、THTTPD等幾種Web服務(wù)器,,其中boa Web服務(wù)器更適合于嵌入式系統(tǒng),,因為它是一個單任務(wù),、支持CGI(Common Gateway Interface,,通用網(wǎng)關(guān)接口)功能的Web服務(wù)器,,只能依次完成用戶的請求,而不會fork出新的進程來處理并發(fā)出連接請求,,可執(zhí)行代碼只有約60K,。
首先進入boa源碼目錄的src子目錄,執(zhí)行命令./con-figure生成Maketile文件,,然后修改Makefile文件找到CC=gcc,,將其改成CC=arm-linux-gcc,再將CPP=gcc-E改成CPP=arm-linux-gcc-E,,并保存退出,。然后運行make進行編譯,得到的可執(zhí)行程序為boa,,之后執(zhí)行命令arm-linux-strip boa,,將調(diào)試信息去掉,得到的最終程序,。第二步完成boa的配置,,使其能夠支持CGI程序的執(zhí)行。Boa需要在/etc目錄下建立一個boa目錄,,里面放入boa的主要配置文件boa.conf,,主要文件的含義有:AccessLog/var/log/boa/access_log訪問日志文件。如果沒有以/開始,,則表示從服務(wù)器的根路徑開始,;VerboseCGILogs是否記錄CGI運行信息,如果沒有注釋掉,,則記錄,,注釋掉則不記錄;Document Root/var/wwwHTML文檔的主目錄,,如果沒有以/開始,,則表示從服務(wù)器的根路徑開始;DirectoryMaker/usr/lib/boa/boa_indexer當HTML目錄沒有索引文件時,,用戶只指明訪問目錄時,,boa會調(diào)用該程序生索引文件給用戶,因為該過程比較慢最好不執(zhí)行,,可以注釋掉,;Scri ptAlia/cgi-bin//var/www/cgi-bin/指明CGI腳本的虛擬路徑對應(yīng)的實際路徑。一般所有的CGI腳本都要放在實際路徑里,,用戶訪問執(zhí)行時輸入站點+虛擬路徑+CGI腳本名,。對boa.conf進行修改的必須要保證是使其他的輔助文件和設(shè)置必須和boa.conf里的配置相符,不然boa就不能正常工作,。另外還需要創(chuàng)建日志文件所在目錄/var/log/boa,,創(chuàng)建HTML文檔的主目錄/var/www,,將mime.types文件拷貝到/etc目錄,創(chuàng)建CGI肢本所在目錄/var/www/cgi-bin/,。
3.2.5 CGI程序的設(shè)計
CGI提供了一個Web服務(wù)器的外部程序通道,,運行在服務(wù)器上,由瀏覽器輸入觸發(fā),,是Web服務(wù)器和系統(tǒng)中其他程序的連接通道,。CGI程序就是符合這種接口的程序。服務(wù)器接收到用戶的請求,,并將數(shù)據(jù)送給CGI程序,。CGI程序接收到數(shù)據(jù)后,啟動編寫好的應(yīng)用程序,,并按照用戶提供的數(shù)據(jù)執(zhí)行,。應(yīng)用程序執(zhí)行完成后,返回執(zhí)行結(jié)果,,并通過Web服務(wù)器傳送給用戶瀏覽器顯不,。
CGI模塊程序的設(shè)計主要包括如下幾部分:Web服務(wù)器的配置、HTML頁面的編寫,、CGI腳本實現(xiàn),。
(1)Web服務(wù)器的配置
嵌入式Web服務(wù)器采用boa,其配置是以文本的形式提供,,放在文件系統(tǒng)中的/etc/httpd/conf/目錄下面,,其主要配置在以上的boa服務(wù)器移植中講述過了。
(2)HTML頁面的編寫
因為系統(tǒng)的設(shè)計的主要方向是能夠通過USB攝像頭進行實時監(jiān)控,。所以為了實現(xiàn)簡單化,,拋開一些不必要復(fù)雜的選擇項。主要的HTML頁面有登錄界面,、注冊界面和監(jiān)控界面,。這些HTML放在嵌入式文件系統(tǒng)的/var/www目錄下。
(3)CGI腳本實現(xiàn)
實現(xiàn)動態(tài)Web頁面的第二步是用C編寫CGI程序,,CGI程序分為以下幾部分:根據(jù)POST方法或GET方法從提交的表單中接收數(shù)據(jù),;URL編碼的解碼;用printf()函數(shù)來產(chǎn)生HTML源代碼,,并將經(jīng)過解碼后的數(shù)據(jù)正確地返回給瀏覽器,。
3.2.6 遠程視頻數(shù)據(jù)接收模塊設(shè)計
目前流行的瀏覽器有IE、FireFox,、Chrome等,,對于普通的文本及HTML文件支持的GIF、JPEG等格式的圖片都可以輕松的顯示,但對于實時視頻數(shù)據(jù),,這些普通瀏覽器無法正常的顯示,。所以實時視頻數(shù)據(jù)接收模塊主要完成的工作是視頻數(shù)據(jù)的接收、RTP報文的解封裝,、發(fā)送RTcP反饋信息、H.264視頻解碼和Web瀏覽器的顯示,。
本系統(tǒng)采用ActiveX控件技術(shù),,嵌入在Web頁面中,來完成視頻數(shù)據(jù)的接收,、RTP協(xié)議,、解碼和最后的顯示工作。最重要的一點,,系統(tǒng)采用雙緩沖技術(shù),,來滿足視頻的解碼速度的問題,實現(xiàn)實時播放,。具體流程圖如圖6所示,。
4 系統(tǒng)的測試與結(jié)論
本文設(shè)計了一種基于ARM S3C2440的嵌入式視頻監(jiān)控系統(tǒng),首先通過USB采集中星微攝像頭作為服務(wù)器,,實現(xiàn)利用V4L2技術(shù)對USB攝像頭進行數(shù)據(jù)采集,,并將數(shù)據(jù)送入H.264編碼模塊進行數(shù)據(jù)的壓縮,壓縮后的數(shù)據(jù)經(jīng)過視頻服務(wù)器RTP封裝打包,,最后通過嵌入式Web服務(wù)器與遠程視頻監(jiān)控客戶端進行交互,。本系統(tǒng)在實際的運營網(wǎng)絡(luò)中進行了測試,目標定位信息接收速率為1次/s,,動態(tài)定位精度小于等于10 m,;能實現(xiàn)動態(tài)視頻傳輸,且視頻傳輸流暢,,圖像最大分辨率可達VGA(640×480像素),,視頻傳輸?shù)馁|(zhì)量優(yōu)于基于2.5G網(wǎng)絡(luò)的車輛監(jiān)控系統(tǒng)(圖像最大的分辨率為320×240像素,且基本上只能傳輸靜態(tài)圖像),。