新聞中心

        EEPW首頁 > 模擬技術 > 設計應用 > 基于嵌入式Linux的視頻采集編碼系統實現三

        基于嵌入式Linux的視頻采集編碼系統實現三

        作者: 時間:2012-09-18 來源:網絡 收藏

        3. 設置窗口的高度和寬度

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

          4. 獲取視頻幀

          使用mmap()(內存映射) 方式截取視頻,mmap()系統調用使得進程之間通過映射同一個普通文件實現共享內存。[5]

          主要部分介紹如下:

          a. 初始化及設置

          使用ioctl(camera_fd,VIDIOCGMBUF,camera_mbuf) 函數初始video_mbuf,獲得攝像頭存儲緩沖區的幀信息,之后修改 video_mmap和幀狀態的設置。

          b. 實現攝像頭設備文件到內存區的映射

          調用buf=void *mmap(void *addr,size_t len,int prot,int flags,int fd,off_t offset) 函數,將設備文件的內容映射到內存區。

          c. 數據采集

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

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

          4. 關閉視頻設備

          在采集完成后,需要關閉設備,并收回系統資源。如果是采用內存映射方法進行,在系統任務完成后必須用munmap 函數關閉映射內存,close函數可關閉視頻設備文件。

          5 系統的多線程設計

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

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

        上一頁 1 2 下一頁

        關鍵詞: 嵌入式 Linux 視頻采集 編碼系統

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 错那县| 乌拉特前旗| 库车县| 华蓥市| 罗江县| 宁德市| 抚松县| 思南县| 徐水县| 盱眙县| 桂林市| 乌兰察布市| 浙江省| 临澧县| 荥经县| 沂南县| 卢氏县| 五常市| 北宁市| 朔州市| 彰化市| 油尖旺区| 平塘县| 鹰潭市| 东乌珠穆沁旗| 郑州市| 昌平区| 达日县| 二连浩特市| 图木舒克市| 广汉市| 上杭县| 楚雄市| 康保县| 桐庐县| 内黄县| 榕江县| 台北市| 博乐市| 高清| 鄂托克旗|