對於linux下的一個v4l2設備編程一般包括以下步驟:
1) 打開設備
2)改變設備屬性,選擇一個視頻和聲音輸入(有時候一個物理設備可能包括多個視頻和聲音輸入)、視頻標準、圖像亮度等。
3)和驅動協商一個數據格式
4)和驅動協商輸入輸出方法(read,write,mmap,User Pointers,DMA buffer importing,等)
5)數據的輸入輸出循環(獲取數據)
6)關閉設備
注:實際編程的步驟是依賴具體的屬於那種設備,例如,Video Capture,Video Overlay ,Video Output,Video Output Overlay,Codec,Effect Devices,Raw VBI Data,
Sliced VBI Data,Teletext ,Radio,RDS,Event,Sub-device
本文主要翻譯有關caputure device 部分。
視頻捕捉設備對視頻模擬信號採樣,將採樣得到的數字信號存儲在內存中。現在幾乎所有的視頻捕捉設備能夠在每秒捕捉25到30幀。
按照慣例,v4l2視頻捕捉設備能夠通過名爲/dev/video0--/dev/video63(其主設備號爲81,此設備號從0到63)的特殊字符設備文件來訪問。通常,、/dev/video一般符號鏈接到優先選用的視頻設備。注意,相同的設備文件被視頻輸出設備使用。(不懂?)
1)打開和關閉設備分別用open(),和close()函數
2)因爲v4l2覆蓋很多中設備,不是所有的API可以應用到所有設備上的,此外,相同種類的設備可能有不同的能力。querying capabilities可以讓我們忽略一些複雜難懂而且不是太重要的API。所有的v4l2驅動都支持VIDIOC_QUERYCAP命令,應用程序也應該在打開設備後,用ioctl()函數調用此命令。檢查是否支持想用的設備功能如caputure功能,I/O方法(read/write,mmap等)。
3)爲了知道可用的視頻輸入輸出的數量和屬性,應用程序能列舉每個輸入輸出,分別用VIDIOC_ENUMINPUT
and
VIDIOC_ENUMOUTPUT
ioctl。
VIDIOC_G_INPUT
and
VIDIOC_G_OUTPUT
ioctl返回當前視頻的輸入輸出。應用程序可以使用VIDIOC_S_INPUT
and
VIDIOC_S_OUTPUT
ioctl選擇視頻的輸入輸出通道。
4)其他補充的功能。
視頻捕捉設備可能會支持audio input, tuner, controls, cropping and scalingand streaming parameterioctl
5)圖像格式協商
視頻捕捉的結果由cropping(裁剪)和圖像格式參數決定。cropping選擇設備捕捉視頻圖像的區域,圖像格式,決定圖像以什麼格式存儲的在內存中,例如以RGB還是YUV顏色空間、圖像的寬和高(以像素爲單位),兩者一起決定了圖像怎樣被裁剪。
照例,以上這些參數不在open()函數時重新設定,對一個設備編程就好像對一個普通的文件進行讀,適當的書面v4l2應用程序確保設備得到他們想要的,包括cropping和scaling。(Well written V4L2 applications ensure they really get what they want, including cropping and scaling.)
裁剪初始化最小的要求是重新設定裁剪參數到默認值,爲了去查詢現在圖像的格式,應用程序需要用call the
VIDIOC_G_FMT
ioctl,爲了要求不同的圖像格式參數,應用程序call the
VIDIOC_S_FMT
ioctl.
6)讀取圖像數
據視頻捕捉設備可能支持read(),也可能之處l流I/O(即mmap和user pointer io)