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