V4L2操作與常見結構

 

一般操作流程(視頻設備):

1. 打開設備文件。 int fd=open("/dev/video0",O_RDWR);
2. 取得設備的capability,看看設備具有什麼功能,比如是否具有視頻輸入,或者音頻輸入輸出等。VIDIOC_QUERYCAP,struct v4l2_capability
3. 選擇視頻輸入,一個視頻設備可以有多個視頻輸入。VIDIOC_S_INPUT,struct v4l2_input
4. 設置視頻的制式和幀格式,制式包括PAL,NTSC,幀的格式個包括寬度和高度等。
VIDIOC_S_STD,VIDIOC_S_FMT,struct v4l2_std_id,struct v4l2_format
5. 向驅動申請幀緩衝,一般不超過5個。struct v4l2_requestbuffers
6. 將申請到的幀緩衝映射到用戶空間,這樣就可以直接操作採集到的幀了,而不必去複製。mmap
7. 將申請到的幀緩衝全部入隊列,以便存放採集到的數據.VIDIOC_QBUF,struct v4l2_buffer
8. 開始視頻的採集。VIDIOC_STREAMON
9. 出隊列以取得已採集數據的幀緩衝,取得原始採集數據。VIDIOC_DQBUF
10. 將緩衝重新入隊列尾,這樣可以循環採集。VIDIOC_QBUF
11. 停止視頻的採集。VIDIOC_STREAMOFF
12. 關閉視頻設備。close(fd);

常用的結構體(參見/usr/include/linux/videodev2.h):

struct v4l2_requestbuffers reqbufs;//向驅動申請幀緩衝的請求,裏面包含申請的個數
struct v4l2_capability cap;//這個設備的功能,比如是否是視頻輸入設備
struct v4l2_input input; //視頻輸入
struct v4l2_standard std;//視頻的制式,比如PAL,NTSC
struct v4l2_format fmt;//幀的格式,比如寬度,高度等

struct v4l2_buffer buf;//代表驅動中的一幀
v4l2_std_id stdid;//視頻制式,例如:V4L2_STD_PAL_B
struct v4l2_queryctrl query;//某一類型的控制
struct v4l2_control control;//具體控制的值

 

1。User controlls其實就是一些用戶可以用來進行設置的一些屬性,如視頻中的brightness等,

video4linux就提取出了最常見的一些設置,給他們分配了ID,這樣大家對於這些常見的設置,

就是用這些ID就可以了,可以察看當前設備對該設置的值,也可以給該設置新值,此外,

由於某些設置包含很多子設置項,因此就又有了menu的含義,即對於一個具體的control,

我們在列舉他的屬性時,發現其類型是包含了menu的,那麼我們就可以以這個control的id爲參數,

察看其menu及各自的值。當然用戶可以由自定義的control以及extended control。

好像是Camera Control ID中就有可以設置focus聚焦的control id,這個可以看一看。

 2。Data format 應用是可以和device針對通信的數據進行談判的,即可以設置device所使用的數據的格式,

可以獲得設備所使用的數據的格式,也可以嘗試一下某種格式的數據設備是否支持。

使用 VIDIOC_G_FMT and VIDIOC_S_FMT ioctls,而VIDIOC_TRY_FMT 就是用來試一下某設置是否被設備支持,

而且只是測試,並不會起作用。我們還是可以用VIDIOC_ENUM_FMT來列舉設備所支持的所有的image的格式的。

關於數據格式,在video中就會涉及到image的格式,大小(寬度,高度),等信息。

3. crapping和scaling
  就是把得到的數據作一定的剪裁,和伸縮,剪裁可以只取樣我們可以得到的圖像大小的一部分,
剪裁的主要參數是位置和長度以及寬度,而scale的設置是通過VIDIOC_G_FMT and VIDIOC_S_FMT 來獲得和
設置當前的image的長度,寬度來實現的。看下圖
我們可以假設bounds是最大的能捕捉到的圖像範圍,defrect是我們的設備能夠得到的最大的範圍,
這個可以通過VIDIOC_CROPCAP的ioctl來獲得設備的crap相關的屬性 v4l2_cropcap
其中的bounds就是這個bounds,其實就是上限。每個設備都有個默認的取樣範圍,就是defrect,
就是default rect的意思,它比bounds要小一些。這個範圍也是通過VIDIOC_CROPCAP的ioctl來
獲得的 v4l2_cropcap 結構中的defrect來表示的,我們可以通過 VIDIOC_G_CROP and VIDIOC_S_CROP
來獲取和設置設備當前的crop設置。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章