<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 基于ARM11的無(wú)線視頻監(jiān)控系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)

          基于ARM11的無(wú)線視頻監(jiān)控系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)

          作者: 時(shí)間:2014-06-18 來(lái)源:網(wǎng)絡(luò) 收藏


          本文引用地址:http://www.ex-cimer.com/article/248473.htm


            圖3 H264 編碼流程框圖。

            4 視頻數(shù)據(jù)的傳輸和顯示

            4.1 視頻數(shù)據(jù)傳輸模塊設(shè)計(jì)

            現(xiàn)代無(wú)線通信網(wǎng)絡(luò)標(biāo)準(zhǔn)主要有3G(第三代移動(dòng)通信),WI-FI,Bluetooth,Zigbee(紫蜂)等,具體詳見(jiàn)表1.

            表1 常用無(wú)線通信網(wǎng)絡(luò)標(biāo)準(zhǔn)的基本比較



            由于WI-FI 具有傳輸率高,支持的協(xié)議多,安裝及設(shè)置簡(jiǎn)單,成本低等優(yōu)點(diǎn),所以本系統(tǒng)采用的無(wú)線網(wǎng)絡(luò)標(biāo)準(zhǔn)是WI-FI.

            4.1.1 WI-FI 無(wú)線網(wǎng)絡(luò)搭建過(guò)程

            (1)加載WI-FI 模塊。通過(guò)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ò)接口卡打開(kāi),然后用iwlist eth1 scanning命令搜索WIFI 網(wǎng)絡(luò)。

            (3)設(shè)置eth1 的ip 地址和子網(wǎng)掩碼。

            (4)設(shè)置ESSID.通過(guò)iwconfig eth1 essid 402命令實(shí)現(xiàn)的,ESSID 用來(lái)區(qū)分不同的網(wǎng)絡(luò)。

            (5)設(shè)置密碼。通過(guò)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ù),它們能以有效反饋和最小開(kāi)銷使傳輸效率最佳化,因而特別適合傳送實(shí)時(shí)的數(shù)據(jù),所以采用該協(xié)議傳輸視頻數(shù)據(jù)。

            本系統(tǒng)采用開(kāi)源代碼Jrtplib 提供的RTP 協(xié)議棧,由于Jrtplib 對(duì)RFC3550 的實(shí)現(xiàn)進(jìn)行了封裝,使得傳輸視頻數(shù)據(jù)更加簡(jiǎn)單。由于本系統(tǒng)的網(wǎng)絡(luò)最大有效載荷為1500 字節(jié),因此設(shè)置RTP 包大小的上限為1400 字節(jié),如果發(fā)送的數(shù)據(jù)大于1400 字節(jié),則采用拆包的方法再發(fā)送,具體傳輸過(guò)程如圖4 和圖5 所示。



            圖4 發(fā)送端流程框圖。



            圖5 接收端流程框圖。

            發(fā)送端主要過(guò)程如下:

            (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ù),通過(guò)SendPacket()方法實(shí)現(xiàn)。

            接收端主要過(guò)程如下:

            (1)創(chuàng)建RTP 會(huì)話。調(diào)用Create 方法來(lái)創(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)。通過(guò)創(chuàng)建了一個(gè)指針數(shù)組,里面存放的是RTP 數(shù)據(jù)報(bào)的指針,只要將剛接收到RTP 數(shù)據(jù)報(bào)的指針賦給這個(gè)指針數(shù)組即可,這樣可以節(jié)省數(shù)據(jù)拷貝的時(shí)間。

            (4)判斷是否接收完成,如果沒(méi)有,則跳轉(zhuǎn)到第b 步,否則接收端程序退出。

            4.2 視頻數(shù)據(jù)的解碼和顯示

            由于接收到的數(shù)據(jù)是經(jīng)H264 編碼的數(shù)據(jù),因此,先要對(duì)該數(shù)據(jù)進(jìn)行解碼,然后才能顯示。而在服務(wù)器端,對(duì)視頻數(shù)據(jù)解碼用到FFmpeg.FFmpeg 是一個(gè)開(kāi)源免費(fèi)跨平臺(tái)的視頻和音頻流方案,屬于自由軟件。

            解碼時(shí)主要涉及FFmpeg 下的libavcodec 庫(kù)、libswscale庫(kù)和libavformat 庫(kù),其中第一個(gè)庫(kù)是一個(gè)包含了所有FFmpeg 音視頻編解碼器的庫(kù),第二個(gè)庫(kù)是格式轉(zhuǎn)化庫(kù),因?yàn)榻獯a后的數(shù)據(jù)是YUV420 格式,而要在計(jì)算機(jī)上顯示該數(shù)據(jù),則需要的是RGB 格式的,該庫(kù)功能就是把YUV420 格式轉(zhuǎn)化成RGB 格式,第三個(gè)庫(kù)是一個(gè)包含了所有的普通音視格式的解析器和產(chǎn)生器的庫(kù)。

            4.2.1 初始化解碼線程

            (1) 注冊(cè)全部的文件格式和編解碼器,調(diào)用av_register_all()函數(shù)完成注冊(cè)。

            (2) 設(shè)置AVFormatContext 結(jié)構(gòu)體。該結(jié)構(gòu)體是FFmpeg 格式轉(zhuǎn)換過(guò)程中實(shí)現(xiàn)輸入和輸出功能,保存相關(guān)數(shù)據(jù)的主要結(jié)構(gòu),通過(guò)av_open_input_file 函數(shù)設(shè)置該結(jié)構(gòu)體。

            (3)檢查視頻流的信息,通過(guò)調(diào)用av_find_stream_info(pFormatCtx)函數(shù),pFormatCtx-》streams 就填充了正確的視頻流信息,pFormatCtx 類型是AVFormatContext.

            (4) 得到編解碼器上下文,pCodecCtx= pFormatCtx -》 streams[videoStream]-》codec,pCodecCtx 指針指向了流中所使用的關(guān)于編解碼器的所有信息。

            (5) 打開(kāi)解碼器,先通過(guò)avcodec_find_decoder 函數(shù)找到相應(yīng)解碼器,然后調(diào)用avcodec_open 函數(shù)打開(kāi)解碼器。

            (6) 申請(qǐng)內(nèi)存用來(lái)存放解碼數(shù)據(jù), 通過(guò)調(diào)用avcodec_alloc_frame 函數(shù)實(shí)現(xiàn),由于解碼的數(shù)據(jù)是YUV420 格式的,因此還需要將該數(shù)據(jù)轉(zhuǎn)換成RGB 格式,因此,再次調(diào)用avcodec_alloc_frame 申請(qǐng)內(nèi)存用來(lái)存放RGB 格式數(shù)據(jù)。

            (7) 申請(qǐng)內(nèi)存用來(lái)存放原始數(shù)據(jù),因?yàn)镠264 解碼時(shí),對(duì)于P 幀需要參考前面一個(gè)關(guān)鍵幀或P 幀,而B(niǎo)幀需要參考前后幀,因此需要存放原始數(shù)據(jù),首先,用avpicture_get_size 來(lái)獲得需要的大小,然后調(diào)用av_malloc 函數(shù)申請(qǐng)內(nèi)存空間。

            (8) 通過(guò)調(diào)用avpicture_fill 函數(shù)將幀和新申請(qǐng)的內(nèi)存結(jié)合起來(lái)。

            (9) 創(chuàng)建格式轉(zhuǎn)換上下文,通過(guò)img_convert_ctx=sws _getContext(src_w, src_h,src_pix_fmt, dst_w, dst_h,PIX_FMT_RGB24, SWS_BICUBIC, NULL, NULL,NULL)方法實(shí)現(xiàn)。其中,src_w 表示源圖像的寬度,src_h 表示源圖像的高度,src_pix_fmt 表示源圖像的格式,dst_w 表示目標(biāo)圖像的寬度,dst_h 表示目標(biāo)圖像的高度,PIX_FMT_RGB24 表示目標(biāo)圖像的格式。

            4.2.2 對(duì)數(shù)據(jù)進(jìn)行H264 解碼

            (1)獲得需要解碼的一幀數(shù)據(jù),由于前面接收端線程已經(jīng)把接收到的數(shù)據(jù)存放在一個(gè)指針數(shù)組中,因此,解碼線程只需要從指針數(shù)據(jù)中獲取數(shù)據(jù)即可。

            (2) 解碼數(shù)據(jù)。調(diào)用解碼函數(shù)avcodec_ decode_video(pCodecCtx , pFrame , &finished , encodedData,size)來(lái)解碼視頻文件。其中,參數(shù)pCodecCtx是前面得到視頻流編碼上下文的指針;參數(shù)pFrame存儲(chǔ)解碼后的圖片的位置,參數(shù)finished 用來(lái)記錄已完成的幀數(shù);參數(shù)encodedData 是輸入緩沖區(qū)指針,指向要解碼的原始數(shù)據(jù);參數(shù)size 是輸入緩沖區(qū)的大小。

            (3) 將已解碼的視頻數(shù)據(jù)YUV420 格式轉(zhuǎn)換成RGB 格式,通過(guò)調(diào)用sws_scale()函數(shù)實(shí)現(xiàn)格式轉(zhuǎn)換。

            4.2.3 視頻數(shù)據(jù)的顯示

            本系統(tǒng)使用QT 下的QImage 顯示視頻數(shù)據(jù),由于QImage 能夠存取單個(gè)像素,這樣在顯示前一幀圖像的時(shí)候,將該圖像保存下來(lái),當(dāng)顯示后一幀圖像的時(shí)候,如果該像素值與前一幀相同,則不必修改該值,從而節(jié)省了大量的時(shí)間,即哪里變修改哪里,顯示過(guò)程的具體步驟如下:

            (1) 取得已解碼的視頻數(shù)據(jù),且該數(shù)據(jù)是RGB 格式的。

            (2) 循環(huán)取得視頻數(shù)據(jù)的R 分量、G 分量、B 分量。

            (3) 判斷該點(diǎn)的像素值是否與前一幀對(duì)應(yīng)位置的像素值相同,若相同,跳轉(zhuǎn)到第2 步,否則,保存該像素值。

            (4) 對(duì)取得的RGB 各自分量,構(gòu)造該像素點(diǎn)的顏色值,通過(guò)調(diào)用qRGB(R,G,B)構(gòu)造方法實(shí)現(xiàn)。

            (5) 設(shè)置相應(yīng)點(diǎn)的像素值,首先生成QImage 類的對(duì)象,然后調(diào)用該類的setPixel(x,y,rgb)。其中,x 是圖像的x 坐標(biāo)值,y 是圖像的y 坐標(biāo)值,rgb 是該點(diǎn)的顏色值。

            (6)顯示圖像,通過(guò)調(diào)用update()方法,該方法會(huì)觸發(fā)繪畫(huà)事件,因此,在繪畫(huà)事件里,寫入顯示圖像代碼,即可顯示剛生成的QImage 對(duì)象,通過(guò)調(diào)用drawImage()方法繪制圖像。

            5 結(jié)論

            本系統(tǒng)在視頻圖像采集時(shí),為了降低數(shù)據(jù)量,采用YUV420 的采樣格式。視頻數(shù)據(jù)編碼采用H264 硬編碼方式,極大地提高了編碼速度。而在無(wú)線網(wǎng)絡(luò)傳輸時(shí),考慮到丟包問(wèn)題,將編碼數(shù)據(jù)進(jìn)行拆包然后發(fā)送,降低了丟包率。經(jīng)測(cè)試,本系統(tǒng)采集一幅OV9650攝像頭拍攝的且分辨率為320X240 的圖像,經(jīng)H264硬編碼,編碼后的圖像數(shù)據(jù)大致為5KB 左右,降低了數(shù)據(jù)傳輸量,并且硬編碼每秒可編碼25 幀圖像數(shù)據(jù),達(dá)到實(shí)時(shí)視頻數(shù)據(jù)編碼的要求。對(duì)于WI-FI 無(wú)線網(wǎng)絡(luò)的傳輸率一般在11-54Mbps 左右,因此,該無(wú)線網(wǎng)絡(luò)可以滿足實(shí)時(shí)傳輸視頻的需求。本系統(tǒng)構(gòu)建了高實(shí)時(shí)性,低成本,低功耗的數(shù)字化無(wú)線視頻監(jiān)控平臺(tái),在該平臺(tái)基礎(chǔ)上,可以搭建各種各樣的應(yīng)用,比如,路況實(shí)時(shí)監(jiān)控,人臉識(shí)別,倉(cāng)庫(kù)報(bào)警等應(yīng)用,該系統(tǒng)具有一定的實(shí)用價(jià)值。

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

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

          linux相關(guān)文章:linux教程



          上一頁(yè) 1 2 下一頁(yè)

          關(guān)鍵詞: ARM11 Linux

          評(píng)論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();