摘 要:設(shè)計(jì)了一種基于ARM11+Linux 系統(tǒng)組成的無線視頻監(jiān)控系統(tǒng)。為提高運(yùn)算速度,系統(tǒng)采用ARM11 微處理器S3C6410 作為主處理器,采用OV9650 攝像頭作為圖像采集設(shè)備,用硬編碼方式對(duì)圖像數(shù)據(jù)進(jìn)行H264編碼。接著通過WI-FI 無線網(wǎng)絡(luò)和RTP 流媒體傳輸協(xié)議把已編碼的數(shù)據(jù)傳送到遠(yuǎn)端的服務(wù)器上顯示。實(shí)現(xiàn)了運(yùn)行穩(wěn)定、速度快、成本低、體積小的無線視頻監(jiān)控平臺(tái),具有很大的實(shí)用價(jià)值。 1 引言 隨著無線網(wǎng)絡(luò)的普及,ARM 處理器運(yùn)算的能力不斷地增強(qiáng)以及計(jì)算機(jī)處理圖像的技術(shù)不斷地提高,基于ARM 的視頻監(jiān)控正越來越廣泛的應(yīng)用于學(xué)校,社區(qū),酒店,網(wǎng)吧,醫(yī)療等各種各樣地領(lǐng)域。傳統(tǒng)的視頻監(jiān)控系統(tǒng)布線復(fù)雜,設(shè)備龐大,智能化低,以及軟硬件資源得不到充分的發(fā)揮。而ARM 嵌入式系統(tǒng)的小型化、占用空間小、成本低廉、結(jié)構(gòu)緊湊、支持無線網(wǎng)絡(luò)等特點(diǎn),使得利用S3C6410 的ARM11+linux系統(tǒng)構(gòu)成各種各樣的無線網(wǎng)絡(luò)數(shù)字監(jiān)控系統(tǒng)具有廣泛的應(yīng)用價(jià)值。 2 系統(tǒng)整體設(shè)計(jì) 2.1 硬件總體設(shè)計(jì) 本系統(tǒng)采用韓國三星公司ARM11 內(nèi)核的S3C6410 作為微處理器,該款處理器體積小,尺寸僅相當(dāng)于一個(gè)48mm*67mm 方塊的大小,同時(shí)集成了豐富的接口,32 位數(shù)據(jù)總線和32 位外部地址總線,SROM 控制器、 SRAM 控制器、NAND 閃存控制器、64 個(gè)中斷源的中斷控制器、五個(gè)三十二位定時(shí)器、四個(gè)UART、四個(gè)DMA 控制器、STN 與TFT LCD 控制器、看門狗、IIS 音頻接口、IIC-Bus 接口、兩個(gè)USB host口、一個(gè)USB device 口、兩個(gè)串行外圍接口電路、三個(gè)SD 卡接口、camera_if 接口、TV_out 接口、MFC接口、2 路SPI、Touch Screen 接口,其主頻可達(dá)800MHz,擴(kuò)展總線最大頻率133MHz.在此基本上,還進(jìn)行了相關(guān)的擴(kuò)展,引出了一個(gè)四線RS-232 串口,該串口用于開發(fā)主機(jī)與S3C6410 開發(fā)平臺(tái)進(jìn)行通信;配置了1GB 的NANDflash,用于存放嵌入式linux操作系統(tǒng),應(yīng)用程序和數(shù)據(jù),128MB 的DDR 內(nèi)存,用于存放運(yùn)行程序,攝像頭捕獲的數(shù)據(jù);擴(kuò)展了一個(gè)WIFI 模塊,用于開發(fā)平臺(tái)與服務(wù)器傳輸視頻數(shù)據(jù),通過無線網(wǎng)絡(luò)實(shí)現(xiàn)視頻遠(yuǎn)程監(jiān)控。 2.2 軟件總體設(shè)計(jì) 軟件總體結(jié)構(gòu)包括引導(dǎo)加載程序Bootloader、操作系統(tǒng)內(nèi)核,設(shè)備驅(qū)動(dòng)程序和應(yīng)用層程序,其軟件結(jié)構(gòu)如圖1 所示。 圖1 軟件總體結(jié)構(gòu)框圖 該系統(tǒng)上電后,先運(yùn)行引導(dǎo)加載程序Bootloader,該程序的作用是初始化硬件設(shè)備、建立內(nèi)存空間的映射表,引導(dǎo)和加載操作系統(tǒng)內(nèi)核,然后啟動(dòng)嵌入式操作系統(tǒng)linux,接著加載Nand flash 驅(qū)動(dòng)程序、LCD 驅(qū)動(dòng)程序、WIFI 驅(qū)動(dòng)程序等一些必要的驅(qū)動(dòng)程序。 3 視頻數(shù)據(jù)采集和編碼設(shè)計(jì) 3.1 基于V4L2 視頻數(shù)據(jù)采集設(shè)計(jì) 在Linux 系統(tǒng)下,對(duì)視頻設(shè)備的各種操作是通過Video4Linux2 實(shí)現(xiàn)的,簡稱V4L2.應(yīng)用程序通過V4L2 提供的接口函數(shù)實(shí)現(xiàn)視頻設(shè)備的操作。整個(gè)視頻數(shù)據(jù)采集的過程如圖2 所示。 ( 1) 打開視頻設(shè)備, int open( const char *pathname, int flags)。調(diào)用該函數(shù),若返回值為-1,表示打開失敗,否則,表示所打開設(shè)備的文件描述符。 (2)取得設(shè)備信息。通過ioctl(cam_fp, VIDIOC_QUERYCAP, &cap)函數(shù)來取得設(shè)備文件的屬性參數(shù)并存儲(chǔ)于cap 結(jié)構(gòu)中,其中cam_fp 指的是打開的視頻設(shè)備的文件描述符。 ( 3)選擇視頻輸入方式。通過ioctl(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ù)來實(shí)現(xiàn)視頻設(shè)備的關(guān)閉。 圖2 視頻數(shù)據(jù)采集流程框圖。 3.2 視頻數(shù)據(jù)的H264 編碼 為了提高視頻數(shù)據(jù)編碼速度,本系統(tǒng)采用的是H264 硬編碼方式,硬編碼具有不占用CPU 資源,運(yùn)算速度快等優(yōu)點(diǎn),從而滿足視頻數(shù)據(jù)實(shí)時(shí)性的要求。 具體編碼的過程如圖3 所示。 (1)創(chuàng)建H264 編碼結(jié)構(gòu)。調(diào)用SsbSipH264EncodeInit (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)初始化H264 編碼結(jié)構(gòu),調(diào)用SsbSipH264Encode Exe (handle)函數(shù)。 (3)獲取視頻輸入地址,SsbSipH264EncodeGetInBuf (handle, 0)函數(shù)來實(shí)現(xiàn),該函數(shù)返回視頻輸入的首地址,存放在p_inbuf 中。 (4)輸入視頻數(shù)據(jù),調(diào)用memcpy(p_inbuf, yuv_buf, 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)行H264編碼,調(diào)用SsbSipH264EncodeExe(handle)函數(shù)實(shí)現(xiàn)。 (6)輸出已編碼的數(shù)據(jù),SsbSipH264EncodeGetOutBuf (handle, size),該函數(shù)返回已編碼圖像的首地址,size 表示已編碼圖像的大小。 (7)關(guān)閉硬編碼設(shè)備,調(diào)用SsbSipH264EncodeDeInit (handle)函數(shù)實(shí)現(xiàn)的。 圖3 H264 編碼流程框圖。 4 視頻數(shù)據(jù)的傳輸和顯示 4.1 視頻數(shù)據(jù)傳輸模塊設(shè)計(jì) 現(xiàn)代無線通信網(wǎng)絡(luò)標(biāo)準(zhǔn)主要有3G(第三代移動(dòng)通信),WI-FI,Bluetooth,Zigbee(紫蜂)等,具體詳見表1. 表1 常用無線通信網(wǎng)絡(luò)標(biāo)準(zhǔn)的基本比較 由于WI-FI 具有傳輸率高,支持的協(xié)議多,安裝及設(shè)置簡單,成本低等優(yōu)點(diǎn),所以本系統(tǒng)采用的無線網(wǎng)絡(luò)標(biāo)準(zhǔn)是WI-FI. 4.1.1 WI-FI 無線網(wǎng)絡(luò)搭建過程 (1)加載WI-FI 模塊。通過insmod 命令加載,這里需要加載2 個(gè)文件helper_sd.bin、sd8686.bin,這2 個(gè)文件可以從Marvel 官方網(wǎng)站下載。 (2)搜索WI-FI 網(wǎng)絡(luò)。先用ifconfig eth1 up 命令把WI-FI 網(wǎng)絡(luò)接口卡打開,然后用iwlist eth1 scanning命令搜索WIFI 網(wǎng)絡(luò)。 (3)設(shè)置eth1 的ip 地址和子網(wǎng)掩碼。 (4)設(shè)置ESSID.通過iwconfig eth1 essid 402命令實(shí)現(xiàn)的,ESSID 用來區(qū)分不同的網(wǎng)絡(luò)。 (5)設(shè)置密碼。通過iwconfig eth1 key s:your_key命令實(shí)現(xiàn)的,其中your_key 就是登陸密碼。 4.1.2 基于RTP 協(xié)議的視頻數(shù)據(jù)傳輸 RTP 是實(shí)時(shí)傳送協(xié)議( Real-time TransportProtocol)的縮寫,代表一個(gè)網(wǎng)絡(luò)傳輸?shù)膮f(xié)議,為音頻、視頻上傳中的常用協(xié)議[5].RTCP 和RTP 一起提供流量控制和擁塞控制服務(wù),它們能以有效反饋和最小開銷使傳輸效率最佳化,因而特別適合傳送實(shí)時(shí)的數(shù)據(jù),所以采用該協(xié)議傳輸視頻數(shù)據(jù)。 本系統(tǒng)采用開源代碼Jrtplib 提供的RTP 協(xié)議棧,由于Jrtplib 對(duì)RFC3550 的實(shí)現(xiàn)進(jìn)行了封裝,使得傳輸視頻數(shù)據(jù)更加簡單。由于本系統(tǒng)的網(wǎng)絡(luò)最大有效載荷為1500 字節(jié),因此設(shè)置RTP 包大小的上限為1400 字節(jié),如果發(fā)送的數(shù)據(jù)大于1400 字節(jié),則采用拆包的方法再發(fā)送,具體傳輸過程如圖4 和圖5 所示。 圖4 發(fā)送端流程框圖。 圖5 接收端流程框圖。 發(fā)送端主要過程如下: (1)創(chuàng)建RTP 會(huì)話并設(shè)置目標(biāo)地址。調(diào)用Create方法得到RTP 會(huì)話實(shí)例,然后調(diào)用AddDestination 方法設(shè)置目標(biāo)IP 以及目標(biāo)端口號(hào)。 (2)獲得數(shù)據(jù),調(diào)用Get_Data()函數(shù)得到。 (3)發(fā)送數(shù)據(jù),通過SendPacket()方法實(shí)現(xiàn)。 接收端主要過程如下: (1)創(chuàng)建RTP 會(huì)話。調(diào)用Create 方法來創(chuàng)建一個(gè)會(huì)話實(shí)例,并且在創(chuàng)建會(huì)話的同時(shí)設(shè)置端口號(hào),要與發(fā)送端的端口號(hào)保持一致。 (2)接受RTP 數(shù)據(jù)。調(diào)用RTPSession 類的PollData()方法接收數(shù)據(jù)。 (3)保存RTP 數(shù)據(jù)報(bào)。通過創(chuàng)建了一個(gè)指針數(shù)組,里面存放的是RTP 數(shù)據(jù)報(bào)的指針,只要將剛接收到RTP 數(shù)據(jù)報(bào)的指針賦給這個(gè)指針數(shù)組即可,這樣可以節(jié)省數(shù)據(jù)拷貝的時(shí)間。 (4)判斷是否接收完成,如果沒有,則跳轉(zhuǎn)到第b 步,否則接收端程序退出。 |