新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 基于ARM11的無線視頻監控系統設計與實現

        基于ARM11的無線視頻監控系統設計與實現

        作者: 時間:2014-06-18 來源:網絡 收藏


        本文引用地址:http://www.104case.com/article/248473.htm


          圖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 左右,因此,該無線網絡可以滿足實時傳輸視頻的需求。本系統構建了高實時性,低成本,低功耗的數字化無線視頻監控平臺,在該平臺基礎上,可以搭建各種各樣的應用,比如,路況實時監控,人臉識別,倉庫報警等應用,該系統具有一定的實用價值。

        linux操作系統文章專題:linux操作系統詳解(linux不再難懂)

        linux操作系統文章專題:linux操作系統詳解(linux不再難懂)

        linux相關文章:linux教程



        上一頁 1 2 下一頁

        關鍵詞: ARM11 Linux

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 博爱县| 英吉沙县| 营口市| 阿克苏市| 砀山县| 永吉县| 白城市| 虹口区| 长丰县| 安丘市| 乌拉特中旗| 卫辉市| 玉林市| 扬州市| 中宁县| 龙口市| 离岛区| 昌都县| 长乐市| 镇宁| 安阳市| 尉犁县| 文成县| 靖西县| 宽甸| 荔波县| 怀来县| 上杭县| 阳东县| 纳雍县| 通道| 应用必备| 尚志市| 宁都县| 上高县| 闵行区| 汾西县| 乡城县| 信阳市| 邳州市| 通海县|