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