一、打開設備文件,和普通文件那樣打開即可
二、捕捉視頻的前期准備
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操作命令罷了
四、關閉設備文件,和普通文件那樣關閉即可