http://www.eccn.com/design_2012081614530361.htm
1 引言
隨著無線網路的普及,ARM處理器運算的能力不斷地增強以及電腦處理映像的技術不斷地提高,基於ARM 的視頻監控正越來越廣泛的應用於學校,社區,酒店,網吧,醫學等各種各樣地領域。傳統的視頻監控系統布線複雜,裝置龐大,智能化低,以及軟硬體資源得不到充分的發揮。而ARM 嵌入式系統的小型化、佔用空間小、成本低廉、結構緊湊、支援無線網路等特點,使得利用S3C6410 的ARM11+linux系統構成各種各樣的無線網路數字監控系統具有廣泛的應用價值。
2 系統整體設計
2.1 硬體總體設計
本系統採用韓國三星公司ARM11 核心的S3C6410 作為微處理器,該款處理器體積小,尺寸僅相當於一個48mm*67mm 方塊的大小,同時整合了豐富的介面,32 位元據匯流排和32 位外部地址匯流排,SROM 控制器、 SRAM 控制器、NAND 快閃記憶體控制器、64 個中斷源的中斷控制器、五個三十二位定時器、四個UART、四個DMA 控制器、STN 與TFT LCD 控制器、看門狗、IIS 音頻介面、IIC-Bus 介面、兩個USB host口、一個USB device 口、兩個串列外圍介面電路、三個SD 記憶卡介面、camera_if
介面、TV_out 介面、MFC介面、2 路SPI、Touch Screen 介面,其主頻可達800MHz,擴充匯流排最大頻率133MHz.在此基本上,還進行了相關的擴充,引出了一個四線RS-232 串口,該串口用於開發主機與S3C6410 開發平台進行通訊;配置了1GB 的NANDflash,用於存放嵌入式linux作業系統,應用程式和資料,128MB 的DDR 記憶體,用於存放運行程式,網路攝影機捕獲的資料;擴充了一個WIFI 模組,用於開發平台與伺服器傳輸視頻資料,通過無線網路實現視頻遠程監控。
2.2 軟體總體設計
軟體總體結構包括引導載入程式Bootloader、作業系統核心,裝置驅動程式和應用程式層程式,其軟體結構1 所示。
圖1 軟體總體結構框圖
該系統上電後,先運行引導載入程式Bootloader,該程式的作用是初始化硬體裝置、建立記憶體空間的映射表,引導和載入作業系統核心,然後啟動嵌入式作業系統linux,接著載入Nand flash 驅動程式、LCD 驅動程式、WIFI 驅動程式等一些必要的驅動程式。
3 視頻資料擷取和編碼設計
3.1 基於V4L2 視頻資料擷取設計
在Linux 系統下,對視頻裝置的各種操作是通過Video4Linux2 實現的,簡稱V4L2.應用程式通過V4L2 提供的介面函數實現視頻裝置的操作。整個視頻資料擷取的過程2 所示。
(1) 開啟視頻裝置, int open( const char *pathname, int flags)。調用該函數,若傳回值為-1,表示開啟失敗,否則,表示所開啟裝置的檔案描述符。
(2)取得裝置資訊。通過ioctl(cam_fp, VIDIOC_QUERYCAP, &cap)函數來取得裝置檔案的屬性參數並儲存於cap 結構中,其中cam_fp 指的是開啟的視頻裝置的檔案描述符。
(3)選擇視頻輸入方式。通過ioctl(cam_fp,VIDIOC_ S_INPUT, &chan)函數設定視頻裝置的輸入方式,其中chan 的資料結構類型是v4l2_input,用來指定視頻的輸入方式。
(4 ) 設定視訊框架格式。通過ioctl(cam_fp ,VIDIOC_S _FMT, &fmt)函數設定視頻的框架格式,其中fmt 的資料結構類型是v4l2_format,用來指定視頻的寬度、高度、像素大小等。
(5)讀取視頻資料。通過read(cam_fp, g_yuv,YUV_ SIZE)函數,把網路攝影機一幀的資料存放到g_yuv中,其中YUV_ SIZE 指的是每幀資料的大小。
(6)關閉視頻裝置。通過close(cam_fp)函數來實現視頻裝置的關閉。
圖2 視頻資料擷取流程框圖。
3.2 視頻資料的H264編碼
為了提高視頻資料編碼速度,本系統採用的是H264 寫入程式碼方式,寫入程式碼具有不佔用CPU 資源,運算速度快等優點,從而滿足視頻資料即時性的要求。
具體編碼的過程3 所示。
(1)建立H264 編碼結構。調用SsbSipH264EncodeInit (width, height, frame_rate, bitrate, gop_num)函數實現的,其中width 表示映像的寬度,height 表示映像的高度,frame_rate 表示幀頻,bitrate 表示位元速率或碼率,gop_num 表示兩個相離主要畫面格之間最多包含多少個幀(B 或P 幀)。
(2)初始化H264 編碼結構,調用SsbSipH264Encode Exe (handle)函數。
(3)擷取視頻輸入地址,SsbSipH264EncodeGetInBuf (handle, 0)函數來實現,該函數返回視頻輸入的首地址,存放在p_inbuf 中。
(4)輸入視頻資料,調用memcpy(p_inbuf, yuv_buf, frame_size)函數實現,p_inbuf 存放需要編碼的資料,yuv_buf 存放原始視頻資料,frame_size 表示資料的大小。
(5)編碼視頻資料,對p_inbuf 內容進行H264編碼,調用SsbSipH264EncodeExe(handle)函數實現。
(6)輸出已編碼的資料,SsbSipH264EncodeGetOutBuf (handle, size),該函數返回已編碼映像的首地址,size 表示已編碼映像的大小。
(7)關閉寫入程式碼裝置,調用SsbSipH264EncodeDeInit (handle)函數實現的。
圖3 H264 編碼流程框圖。
4 視頻資料的傳輸和顯示
4.1 視頻資料轉送模組設計
現代無線通訊網路標準主要有3G(第三代移動通訊),WI-FI,Bluetooth,Zigbee(紫蜂)等,具體詳見表1.
表1 常用無線通訊網路標準的基本比較
由於WI-FI 具有傳輸率高,支援的協議多,安裝及設定簡單,成本低等優點,所以本系統採用的無線網路標準是WI-FI.
4.1.1 WI-FI 無線網路搭建過程
(1)載入WI-FI 模組。通過insmod 命令載入,這裡需要載入2 個檔案helper_sd.bin、sd8686.bin,這2 個檔案可以從Marvel 官方網站下載。
(2)搜尋WI-FI 網路。先用ifconfig eth1 up 命令把WI-FI 網路介面卡開啟,然後用iwlist eth1 scanning命令搜尋WIFI 網路。
(3)設定eth1 的ip 地址和子網路遮罩。
(4)設定ESSID.通過iwconfig eth1 essid 402命令實現的,ESSID 用來區分不同的網路。
(5)設定密碼。通過iwconfig eth1 key s:your_key命令實現的,其中your_key 就是登陸密碼。
4.1.2 基於RTP 協議的視頻資料轉送
RTP 是即時傳送協議( Real-time TransportProtocol)的縮寫,代表一個網路傳輸的協議,為音頻、視頻上傳中的常用協議[5].RTCP 和RTP 一起提供流量控制和擁塞控制服務,它們能以有效反饋和最小開銷使傳輸效率最佳化,因而特別適合傳送即時的資料,所以採用該協議傳輸視頻資料。
本系統採用開原始碼Jrtplib 提供的RTP 協議棧,由於Jrtplib 對RFC3550 的實現進行了封裝,使得傳輸視頻資料更加簡單。由於本系統的網路最大有效載荷為1500 位元組,因此設定RTP 包大小的上限為1400 位元組,如果發送的資料大於1400 位元組,則採用拆包的方法再發送,具體傳輸過程4 和圖5 所示。
圖4 發送端流程框圖。
圖5 接收端流程框圖。
發送端主要過程如下:
(1)建立RTP 會話並設定目標地址。調用Create方法得到RTP 會話執行個體,然後調用AddDestination 方法設定目標IP 以及目標連接埠號碼。
(2)獲得資料,調用Get_Data()函數得到。
(3)發送資料,通過SendPacket()方法實現。
接收端主要過程如下:
(1)建立RTP 會話。調用Create 方法來建立一個會話執行個體,並且在建立會話的同時設定連接埠號碼,要與發送端的連接埠號碼保持一致。
(2)接受RTP 資料。調用RTPSession 類的PollData()方法接收資料。
(3)儲存RTP 資料報。通過建立了一個指標數組,裡面存放的是RTP 資料報的指標,只要將剛接收到RTP 資料報的指標賦給這個指標數組即可,這樣可以節省資料拷貝的時間。
(4)判斷是否接收完成,如果沒有,則跳轉到第b 步,否則接收端程式退出。
4.2 視頻資料的解碼和顯示
由於接收到的資料是經H264 編碼的資料,因此,先要對該資料進行解碼,然後才能顯示。而在伺服器端,對視頻資料解碼用到FFmpeg.FFmpeg 是一個開源免費跨平台的視頻和音頻流方案,屬於自由軟體。
解碼時主要涉及FFmpeg 下的libavcodec 庫、libswscale庫和libavformat 庫,其中第一個庫是一個包含了所有FFmpeg 音視頻轉碼器的庫,第二個庫是格式轉化庫,因為解碼後的資料是YUV420 格式,而要在電腦上顯示該資料,則需要的是RGB 格式的,該庫功能就是把YUV420 格式轉化成RGB 格式,第三個庫是一個包含了所有的普通音視格式的解析器和產生器的庫。
4.2.1 初始化解碼線程
(1) 註冊全部的檔案格式和轉碼器,調用av_register_all()函數完成註冊。
(2) 設定AVFormatContext 結構體。該結構體是FFmpeg 格式轉換過程中實現輸入和輸出功能,儲存相關資料的主要結構,通過av_open_input_file 函數設定該結構體。
(3)檢查視頻流的資訊,通過調用av_find_stream_info(pFormatCtx)函數,pFormatCtx-》streams 就填充了正確的視頻流資訊,pFormatCtx 類型是AVFormatContext.
(4) 得到轉碼器上下文,pCodecCtx= pFormatCtx -》 streams[videoStream]-》codec,pCodecCtx 指標指向了流中所使用的關於轉碼器的所有資訊。
(5) 開啟解碼器,先通過avcodec_find_decoder 函數找到相應解碼器,然後調用avcodec_open 函數開啟解碼器。
(6) 申請記憶體用來存放解碼資料, 通過調用avcodec_alloc_frame 函數實現,由於解碼的資料是YUV420 格式的,因此還需要將該資料轉換成RGB 格式,因此,再次調用avcodec_alloc_frame 申請記憶體用來存放RGB 格式資料。
(7) 申請記憶體用來存放未經處理資料,因為H264 解碼時,對於P 幀需要參考前面一個主要畫面格或P 幀,而B幀需要參考前後幀,因此需要存放未經處理資料,首先,用avpicture_get_size 來獲得需要的大小,然後調用av_malloc 函數申請記憶體空間。
(8) 通過調用avpicture_fill 函數將幀和新申請的記憶體結合起來。
(9) 建立格式轉換上下文,通過img_convert_ctx=sws _getContext(src_w, src_h,src_pix_fmt, dst_w, dst_h,PIX_FMT_RGB24, SWS_BICUBIC, NULL, NULL,NULL)方法實現。其中,src_w 表示源映像的寬度,src_h 表示源映像的高度,src_pix_fmt 表示源映像的格式,dst_w 表示靶心圖表像的寬度,dst_h 表示靶心圖表像的高度,PIX_FMT_RGB24 表示靶心圖表像的格式。
4.2.2 對資料進行H264 解碼
(1)獲得需要解碼的一幀資料,由於前面接收端線程已經把接收到的資料存放在一個指標數組中,因此,解碼線程只需要從指標資料中擷取資料即可。
(2) 解碼資料。調用解碼函數avcodec_ decode_video(pCodecCtx , pFrame , &finished , encodedData,size)來解碼視頻檔案。其中,參數pCodecCtx是前面得到視頻流編碼內容相關的指標;參數pFrame儲存解碼後的圖片的位置,參數finished 用來記錄已完成的幀數;參數encodedData 是輸入緩衝區指標,指向要解碼的未經處理資料;參數size 是輸入緩衝區的大小。
(3) 將已解碼的視頻資料YUV420 格式轉換成RGB 格式,通過調用sws_scale()函數實現格式轉換。
4.2.3 視頻資料的顯示
本系統使用QT 下的QImage 顯示視頻資料,由於QImage 能夠存取單個像素,這樣在顯示前一幀映像的時候,將該映像儲存下來,當顯示後一幀映像的時候,如果該像素值與前一幀相同,則不必修改該值,從而節省了大量的時間,即哪裡變修改哪裡,顯示過程的具體步驟如下:
(1) 取得已解碼的視頻資料,且該資料是RGB 格式的。
(2) 迴圈取得視頻資料的R 分量、G 分量、B 分量。
(3) 判斷該點的像素值是否與前一幀對應位置的像素值相同,若相同,跳轉到第2 步,否則,儲存該像素值。
(4) 對取得的RGB 各自分量,構造該像素點的顏色值,通過調用qRGB(R,G,B)構造方法實現。
(5) 設定相應點的像素值,首先產生QImage 類的對象,然後調用該類的setPixel(x,y,rgb)。其中,x 是映像的x 座標值,y 是映像的y 座標值,rgb 是該點的顏色值。
(6)顯示映像,通過調用update()方法,該方法會觸發繪畫事件,因此,在繪畫事件裡,寫入顯示映像代碼,即可顯示剛產生的QImage 對象,通過調用drawImage()方法繪製映像。
5 結論
本系統在視頻映像採集時,為了降低資料量,採用YUV420 的採樣格式。視頻資料編碼採用H264 寫入程式碼方式,極大地提高了編碼速度。而在無線網路傳輸時,考慮到丟包問題,將編碼資料進行拆包然後發送,降低了丟包率。經測試,本系統採集一幅OV9650網路攝影機拍攝的且解析度為320X240 的映像,經H264寫入程式碼,編碼後的映像資料大致為5KB 左右,降低了資料轉送量,並且寫入程式碼每秒可編碼25 幀映像資料,達到即時視頻資料編碼的要求。對於WI-FI 無線網路的傳輸率一般在11-54Mbps 左右,因此,該無線網路可以滿足即時傳輸視頻的需求。本系統構建了高即時性,低成本,低功耗的數字化無線視頻監控平台,在該平台基礎上,可以搭建各種各樣的應用,比如,路況即時監控,Face Service,倉庫警示等應用,該系統具有一定的實用價值。