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

          新聞中心

          EEPW首頁 > 模擬技術(shù) > 設(shè)計(jì)應(yīng)用 > 基于嵌入式Linux的視頻采集編碼系統(tǒng)實(shí)現(xiàn)三

          基于嵌入式Linux的視頻采集編碼系統(tǒng)實(shí)現(xiàn)三

          作者: 時(shí)間:2012-09-18 來源:網(wǎng)絡(luò) 收藏

          3. 設(shè)置窗口的高度和寬度

            編碼器輸入的是 CIF 格式的YUV420 碼流,故將采集窗口的高度設(shè)置為 288,寬度為352。

            4. 獲取視頻幀

            使用mmap()(內(nèi)存映射) 方式截取視頻,mmap()系統(tǒng)調(diào)用使得進(jìn)程之間通過映射同一個(gè)普通文件實(shí)現(xiàn)共享內(nèi)存。[5]

            主要部分介紹如下:

            a. 初始化及設(shè)置

            使用ioctl(camera_fd,VIDIOCGMBUF,camera_mbuf) 函數(shù)初始video_mbuf,獲得攝像頭存儲(chǔ)緩沖區(qū)的幀信息,之后修改 video_mmap和幀狀態(tài)的設(shè)置。

            b. 實(shí)現(xiàn)攝像頭設(shè)備文件到內(nèi)存區(qū)的映射

            調(diào)用buf=void *mmap(void *addr,size_t len,int prot,int flags,int fd,off_t offset) 函數(shù),將設(shè)備文件的內(nèi)容映射到內(nèi)存區(qū)。

            c. 數(shù)據(jù)采集

            調(diào)用ioctl(fd,VIDIOCMCAPTURE,camera_buf)截取圖像,失敗將返回-1 ,若函數(shù)成功調(diào)用,便開始一幀圖像數(shù)據(jù)的截取,并將當(dāng)前幀號(hào)按緩沖區(qū)總幀數(shù)的模加上1,為下一幀截取作準(zhǔn)備。然后調(diào)用 ioctl(fd,VIDIOCSYNC,frame) 函數(shù),成功返回則表示圖像截取已完成,可以開始作下一幀圖像的采集。圖像捕捉函數(shù) v41_frame_grab()是mmap內(nèi)存映射方式捕捉視頻數(shù)據(jù)的具體實(shí)現(xiàn),每次采集一幀YUV420P格式的原始圖像數(shù)據(jù)。在使用雙緩沖區(qū)輪換采集時(shí),對(duì)于每個(gè)緩沖區(qū)進(jìn)行連續(xù)幀采集,通過外加循環(huán)控制對(duì)攝像頭幀緩沖區(qū)采集的次數(shù)來實(shí)現(xiàn),以達(dá)到提高效率的目的[6]。

            在此基礎(chǔ)上也可實(shí)現(xiàn)連續(xù)幀的采集,Video4最多支持一次采集32幀,首先需要設(shè)置采集的幀數(shù) camera_buf.frame,并將data+camera_mbuf.offsets[frame] 定義每一幀數(shù)據(jù)在內(nèi)存中的起始位置,利用 ioctl(fd,VIDIOCGMBUF,camera_mbuf) 便可獲得camera_mbuf 的信息。除此之外還要設(shè)置數(shù)據(jù)緩沖區(qū)的大小,然后利用 ioctl VIDIOCMCAPTURE 操作進(jìn)行數(shù)據(jù)的連續(xù)采集,直到緩沖區(qū)中的剩余空間無法保存一個(gè)完整的數(shù)據(jù)幀。當(dāng)緩沖區(qū)中沒有可利用的空間時(shí),系統(tǒng)調(diào)用 ioctl VIDIOCSYNC 來檢查過程是否完成。若完成時(shí),應(yīng)用程序?yàn)閿?shù)據(jù)幀分配地址,使緩沖區(qū)的數(shù)據(jù)幀可被安全用于其他進(jìn)程。

            4. 關(guān)閉視頻設(shè)備

            在采集完成后,需要關(guān)閉設(shè)備,并收回系統(tǒng)資源。如果是采用內(nèi)存映射方法進(jìn)行,在系統(tǒng)任務(wù)完成后必須用munmap 函數(shù)關(guān)閉映射內(nèi)存,close函數(shù)可關(guān)閉視頻設(shè)備文件。

            5 系統(tǒng)的多線程設(shè)計(jì)

            在采集和處理模塊的設(shè)計(jì)中創(chuàng)建圖像采集和圖像處理兩個(gè)線程,并開辟兩個(gè)緩沖區(qū)輪換采集圖像幀,以便解決視頻采集模塊與編碼模塊的同步。在采集程序?qū)憹M緩沖區(qū)1 后,改變線程等待條件,釋放被阻塞的圖像處理線程對(duì)該緩沖區(qū)數(shù)據(jù)進(jìn)行編碼輸出。同時(shí)采集線程轉(zhuǎn)到緩沖區(qū)2,若此時(shí)圖像處理線程已完成對(duì)緩沖區(qū) 2 的處理,則將采集獲得的幀圖像覆蓋,保存至緩沖區(qū) 2,否則阻塞。兩個(gè)緩沖輪流使用,不丟棄任何幀,并且圖像采集與處理同步進(jìn)行,提高了效率。

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

          上一頁 1 2 下一頁

          關(guān)鍵詞: 嵌入式 Linux 視頻采集 編碼系統(tǒng)

          評(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); })();