歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

《基於嵌入式的家庭遠程監控系統》項目總結

一、打開設備文件,和普通文件那樣打開即可

二、捕捉視頻的前期准備

1、獲取參數和設置要求

v4l2_capability結構體

通過VIDIO_QUERYCAP操作命令獲取設備驅動的參數,保存於v4l2_capability結構體中,包括driver(驅動名),card(設備名),bus_info(總線信息)等

v4l2_cropcap結構體

先設置v4l2_cropcap的type域,再通過VIDIO_CROPCAP操作命令獲取設備捕捉能力的參數,保存於v4l2_cropcap結構體中,包括bounds(最大捕捉方框的左上角坐標和寬高),defrect(默認捕捉方框的左上角坐標和寬高)等

v4l2_format結構體

先填好v4l2_format的各個域,如type(傳輸流類型),fmt.pix.width(寬),fmt.pix.heigth(高),fmt.pix.field(采樣區域,如隔行采樣),fmt.pix.pixelformat(采樣類型,如YUV4:2:2),然後通過VIDIO_S_FMT操作命令設置視頻捕捉格式

2、初始化內存映射

v4l2_requestbuffers結構體

先填好v4l2_requestbuffers的一些域,如count(幀緩沖個數)等,通過操作命令VIDIO_REQBUFS根據v4l2_requestbuffers的要求向內核申請幀緩沖

向內存申請相對應的映射空間,然後再使用mmap()系統調用實現內核中的幀緩沖和內存中映射空間相互映射

v4l2_buffer結構體

由於在內核中申請幀緩存和在內存中申請映射空間不同,後者申請後返回首地址,以後可以通過該首地址向映射空間操作,而前者沒有,所以得要v4l2_buffer結構體做中介。先填好v4l2_buffer結構體的一些域,如index(幀號),type(傳輸流類型),然後通過操作命令VIDIO_QUERYBUF獲取相對應於幀號的緩沖幀的信息,並保存於v4l2_buffer結構體中

三、捕捉視頻

1、啟動攝像頭捕捉視頻

v4l2_buf_type枚舉類型

將其設置為V4L2_BUF_TYPE_VIDIO_CAPTURE類型,然後使用VIDIOC_STREAMON操作命令根據v4l2_buf_type的值開始捕捉視頻

2、不斷的讀取數據

用select()系統調用輪詢文件描述符集合中的設備是否准備好,如果准備好,即只要從映射空間中讀取數據即可

注意:在這兩個過程中,需要不斷地將已經讀取完數據的緩沖幀出隊列,並插進到隊列尾,以存儲攝像頭捕捉到的新數據

3、停止攝像頭捕捉視頻

和啟動攝像頭捕捉視頻類似,只是改用VIDIO_STREAMOFF操作命令罷了

四、關閉設備文件,和普通文件那樣關閉即可

Copyright © Linux教程網 All Rights Reserved