基于A(yíng)RM Linux的3G無(wú)線(xiàn)車(chē)載視頻監控系統
主要過(guò)程如下:
(1)打開(kāi)視頻設備。調用函數int open(constchar * pathname,int flags),若返回值為-1,表示打開(kāi)失敗,否則,表示所打開(kāi)設備的文件描述符。
(2)讀取設備信息。Ioctl(cam_fp,VIDIOC_QUERYCAP,cap)函數來(lái)取得設備文件的屬性參數并存儲存于cap結構中,其中cam_fp指的是打開(kāi)的視頻設備文件描述符。
(3)選擇視頻的輸入方式。通過(guò)ioetl(cam_fp,VIDIOC_S_INPUT,chan)函數設置視頻設備的輸入方式,其中chan的數據結構類(lèi)型是V4L2 _input,用來(lái)指定視頻的輸入方式。
(4)設置視頻幀的格式。通過(guò)ioctl(cam_fp,VIDIOC_S_FMT,fmt)函數設置視頻的幀格式,其中fmt的數據結構類(lèi)型是V4L2_format,用來(lái)指定視頻的寬度、高度、像素大小等。
(5)讀取視頻數據。通過(guò)read(cam_fp,g_yuv,YUV_SIZE)函數,把攝像頭一幀的數據存放到g_yuv中,其中YUV_SIZE指的是每幀數據的大小。
(6)關(guān)閉視頻設備。通過(guò)close(cam_fp)函數來(lái)實(shí)現視頻設備的關(guān)閉。根據流程圖可對其進(jìn)行相應操作。當攝像頭通過(guò)USB接口連接后,程序中調用V4L API對設備文件的讀操作read(),即可完成視頻數據采集到內存中,視頻數據可用圖4形式保存,也可壓縮后封裝進(jìn)數據包。本文是先將采集數據進(jìn)行H.264壓縮后再封裝進(jìn)數據包,并傳輸到監控PC進(jìn)行處理。
3.2.3 視頻壓縮模塊設計
因視頻采集模塊采集的視頻數據信息量非常大,為了提高數據傳輸速度、降低網(wǎng)絡(luò )數據流量、保證監控的實(shí)時(shí)性,有必要對車(chē)載攝像頭采集的數據壓縮編碼。文中采用H.264硬編碼方式(硬編碼具有不占用CPU資源,運算速度快等優(yōu)點(diǎn),從而滿(mǎn)足視頻數據實(shí)時(shí)性的要求)將攝像頭采集的圖像系列壓縮編碼成流媒體。具體編碼的過(guò)程如圖5所示。本文引用地址:http://dyxdggzs.com/article/148087.htm
(1)創(chuàng )建H.264編碼結構。調用SsbSipH264Encodehlit(width,height,frame_rate,bitrate,gop_num)函數實(shí)現,其中width表示圖像的寬度,height表示圖像的高度,frame_rate表示幀頻,bitrate表示比特率或碼率,gop_num表示兩個(gè)相離關(guān)鍵幀之間最多包含多少個(gè)幀(B或P幀)。
(2)初始化H.264編碼結構,調用SsbSipH264Encode Exe(handle)函數。
(3) 獲取視頻輸入地址,調用SsbSipH264EncodeGetInBuf(handle,0)函數來(lái)實(shí)現,該函數返回視頻輸入的首地址,存放在p_inbuf中。
(4)輸入視頻數據,調用memcpy(p_inbuf,yuv_bur,frame_size)函數實(shí)現,p_inbuf存放需要編碼的數據,yuv_buf存放原始視頻數據,frame_size表示數據的大小。
(5)編碼視頻數據,對p_inbuf內容進(jìn)行H.264編碼,調用SsbSipH264EncodeExe(handle)函數實(shí)現。
(6) 輸出已編碼的數據,調用 SsbSipH264EncodeGetOutBuf(handle,size),該函數返回已編碼圖像的首地址,size表示已編碼圖像的大小。
(7)關(guān)閉硬編碼設備,調用SsbsipH264Encode DeInit(handle)函數實(shí)現的。
3.2.4 嵌入式服務(wù)器boa移植
Linux支持boa、HTTPD、THTTPD等幾種Web服務(wù)器,其中boa Web服務(wù)器更適合于嵌入式系統,因為它是一個(gè)單任務(wù)、支持CGI(Common Gateway Interface,通用網(wǎng)關(guān)接口)功能的Web服務(wù)器,只能依次完成用戶(hù)的請求,而不會(huì )fork出新的進(jìn)程來(lái)處理并發(fā)出連接請求,可執行代碼只有約60K。
首先進(jìn)入boa源碼目錄的src子目錄,執行命令./con-figure生成Maketile文件,然后修改Makefile文件找到CC=gcc,將其改成CC=arm-linux-gcc,再將CPP=gcc-E改成CPP=arm-linux-gcc-E,并保存退出。然后運行make進(jìn)行編譯,得到的可執行程序為boa,之后執行命令arm-linux-strip boa,將調試信息去掉,得到的最終程序。第二步完成boa的配置,使其能夠支持CGI程序的執行。Boa需要在/etc目錄下建立一個(gè)boa目錄,里面放入boa的主要配置文件boa.conf,主要文件的含義有:AccessLog/var/log/boa/access_log訪(fǎng)問(wèn)日志文件。如果沒(méi)有以/開(kāi)始,則表示從服務(wù)器的根路徑開(kāi)始;VerboseCGILogs是否記錄CGI運行信息,如果沒(méi)有注釋掉,則記錄,注釋掉則不記錄;Document Root/var/wwwHTML文檔的主目錄,如果沒(méi)有以/開(kāi)始,則表示從服務(wù)器的根路徑開(kāi)始;DirectoryMaker/usr/lib/boa/boa_indexer當HTML目錄沒(méi)有索引文件時(shí),用戶(hù)只指明訪(fǎng)問(wèn)目錄時(shí),boa會(huì )調用該程序生索引文件給用戶(hù),因為該過(guò)程比較慢最好不執行,可以注釋掉;Scri ptAlia/cgi-bin//var/www/cgi-bin/指明CGI腳本的虛擬路徑對應的實(shí)際路徑。一般所有的CGI腳本都要放在實(shí)際路徑里,用戶(hù)訪(fǎng)問(wèn)執行時(shí)輸入站點(diǎn)+虛擬路徑+CGI腳本名。對boa.conf進(jìn)行修改的必須要保證是使其他的輔助文件和設置必須和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提供了一個(gè)Web服務(wù)器的外部程序通道,運行在服務(wù)器上,由瀏覽器輸入觸發(fā),是Web服務(wù)器和系統中其他程序的連接通道。CGI程序就是符合這種接口的程序。服務(wù)器接收到用戶(hù)的請求,并將數據送給CGI程序。CGI程序接收到數據后,啟動(dòng)編寫(xiě)好的應用程序,并按照用戶(hù)提供的數據執行。應用程序執行完成后,返回執行結果,并通過(guò)Web服務(wù)器傳送給用戶(hù)瀏覽器顯不。
CGI模塊程序的設計主要包括如下幾部分:Web服務(wù)器的配置、HTML頁(yè)面的編寫(xiě)、CGI腳本實(shí)現。
(1)Web服務(wù)器的配置
嵌入式Web服務(wù)器采用boa,其配置是以文本的形式提供,放在文件系統中的/etc/httpd/conf/目錄下面,其主要配置在以上的boa服務(wù)器移植中講述過(guò)了。
(2)HTML頁(yè)面的編寫(xiě)
因為系統的設計的主要方向是能夠通過(guò)USB攝像頭進(jìn)行實(shí)時(shí)監控。所以為了實(shí)現簡(jiǎn)單化,拋開(kāi)一些不必要復雜的選擇項。主要的HTML頁(yè)面有登錄界面、注冊界面和監控界面。這些HTML放在嵌入式文件系統的/var/www目錄下。
(3)CGI腳本實(shí)現
實(shí)現動(dòng)態(tài)Web頁(yè)面的第二步是用C編寫(xiě)CGI程序,CGI程序分為以下幾部分:根據POST方法或GET方法從提交的表單中接收數據;URL編碼的解碼;用printf()函數來(lái)產(chǎn)生HTML源代碼,并將經(jīng)過(guò)解碼后的數據正確地返回給瀏覽器。
3.2.6 遠程視頻數據接收模塊設計
目前流行的瀏覽器有IE、FireFox、Chrome等,對于普通的文本及HTML文件支持的GIF、JPEG等格式的圖片都可以輕松的顯示,但對于實(shí)時(shí)視頻數據,這些普通瀏覽器無(wú)法正常的顯示。所以實(shí)時(shí)視頻數據接收模塊主要完成的工作是視頻數據的接收、RTP報文的解封裝、發(fā)送RTcP反饋信息、H.264視頻解碼和Web瀏覽器的顯示。
本系統采用ActiveX控件技術(shù),嵌入在Web頁(yè)面中,來(lái)完成視頻數據的接收、RTP協(xié)議、解碼和最后的顯示工作。最重要的一點(diǎn),系統采用雙緩沖技術(shù),來(lái)滿(mǎn)足視頻的解碼速度的問(wèn)題,實(shí)現實(shí)時(shí)播放。具體流程圖如圖6所示。
4 系統的測試與結論
本文設計了一種基于A(yíng)RM S3C2440的嵌入式視頻監控系統,首先通過(guò)USB采集中星微攝像頭作為服務(wù)器,實(shí)現利用V4L2技術(shù)對USB攝像頭進(jìn)行數據采集,并將數據送入H.264編碼模塊進(jìn)行數據的壓縮,壓縮后的數據經(jīng)過(guò)視頻服務(wù)器RTP封裝打包,最后通過(guò)嵌入式Web服務(wù)器與遠程視頻監控客戶(hù)端進(jìn)行交互。本系統在實(shí)際的運營(yíng)網(wǎng)絡(luò )中進(jìn)行了測試,目標定位信息接收速率為1次/s,動(dòng)態(tài)定位精度小于等于10 m;能實(shí)現動(dòng)態(tài)視頻傳輸,且視頻傳輸流暢,圖像最大分辨率可達VGA(640×480像素),視頻傳輸的質(zhì)量?jì)?yōu)于基于2.5G網(wǎng)絡(luò )的車(chē)輛監控系統(圖像最大的分辨率為320×240像素,且基本上只能傳輸靜態(tài)圖像)。
linux相關(guān)文章:linux教程
攝像頭相關(guān)文章:攝像頭原理
評論