由於早期的 v4l 有很多缺陷,bill dirks 等人對其進行了重新設計,並取名為video for linux 2(v4l2使用),最早出現於linux2.5.x 版本。v4l2 相比於v4l 有更好的擴充套件性和靈活性,並且支援的硬體裝置更多。
因此在應用程式v4l程式設計實際是指v4l2,我們這個系列的以v4l2為主,但由於歷史的原因,v4l2一般相容v4l.所以很多程式可以用v4l介面.
v4l2(video for linux) 可以支援多種裝置,它可以有以下幾種介面:
5. 收音機介面(radio inte***ce):可用來處理從am或fm高頻頭裝置接收來的音訊流.
跟一般裝置處理一樣,大體上v4l處理有四個流程.
2.1 開啟v4l裝置結點
一般v4l裝置結點名是 /dev/videon.如第乙個v4l裝置是/dev/video0.
int fd = open("/dev/video0",o_rdwr |o_nonblock);
2.2配置裝置/查詢裝置屬性
主要通過ioctl來操作,象v4l2常見的的命令有
格式
int ioctl (int __fd, unsigned long int __request, .../*args*/) ;
__request是v4l2一些ioctl命令,常見如下.
vidioc_reqbufs:分配記憶體
vidioc_querybuf:把vidioc_reqbufs中分配的資料快取轉換成實體地址
vidioc_querycap:查詢驅動功能
vidioc_s_fmt:設定當前驅動的頻捕獲格式
vidioc_g_fmt:讀取當前驅動的頻捕獲格式
vidioc_try_fmt:驗證當前驅動的顯示格式
vidioc_cropcap:查詢驅動的修剪能力
vidioc_qbuf:把資料從快取中讀取出來
vidioc_dqbuf:把資料放回快取佇列
完整的ioctl命令參見
在
有的裝置是從應用發往硬體處理,如電視介面.
在v4l介面,設定了三種應用程式與驅動的互動方式,分別是
直接讀取裝置檔案方式(read/write)、使用者指標方式(userptr)以及mmap 對映方式。
1)mmap方式,驅動將內部資料空間對映到應用程式空間上,雙方直接在這個空間進行資料交換,是效果最高的方法,這也是最常用的方式之一
2)
直接讀取裝置檔案方式 直接呼叫 read()、write()函式進行資料的讀入和輸出,該方法一般配合select()使用。
3)使用者指標方式 首先由應用程式申請一段緩衝區,然後將緩衝區傳給驅動,驅動將其作為緩衝區,從而實現了記憶體共享。這一方法用的較少.
2.4 關閉裝置
呼叫close();如果是記憶體對映方式,在關閉前還需要呼叫munmap解除對映.
3.
v4l兩個版本區別
1.標頭檔案不一樣 v4l使用#include
v4l2使用 #include
2.ioctl命令編號 ,v4l使用 vidioc***x的形式,而v4l2使用vidioc_***x 或 vidioc_g_***x形式.
如v4l中取裝置屬性命令是vidiocgcap,而v4l2對應的是vidioc_querycap.
3.兩者資料結構不一樣,v4l以video_為字首,而v4l以v4l2_為字首.如裝置屬性
v4l1--> struct video_capability video_cap
v4l2-->struct v4l2_capability
4.檢測v4l裝置版本
在v4l2中,規定必須實現 vidioc_querycap命令,而v4l1,規定必須實現vidiocgcap,用這個方法可以判斷裝置的版本.參見如下**.
/*
* author: andrew huang * detectd v4l2 device version
* */
#include #include #include #include #include #include #include #include #include /*
0 -- 不是v4l裝置
1 -- v4l 裝置
2 -- v4l2 裝置
*/int test_v4l_version(int fd)
else if (-1 != ioctl(fd,vidiocgcap,dummy))
return ret;
}int main(int argc,char * argv)
printf("open device %s\n",dev_name);
cam_fd = open(dev_name,o_rdwr|o_nonblock);
if(cam_fd == -1)
switch(test_v4l_version(cam_fd))
close(cam_fd);
return 0;
}
andrew huang[email protected]
**:ps:
錯誤:expected expression before 『struct』
解決:#include
uvc和v4l2簡介uvc和v4l2簡介
對這塊不是特別理解,看了幾篇部落格,還是一知半解,先記錄下,以後有機會深入後,再來更新 首先介紹兩個概念 uvc 最新的uvc版本為uvc 1.5,由usb if usb implementers forum 定義包括基本協議及負載格式 1 2 這是wikipedia的解釋。v4l2 從兩個的介紹也...
V4L2程式設計
include include include include include include include include include include typedef struct buftype buftype user buf int n buffer 0 開啟攝像頭裝置 int ope...
V4L2 程式設計
v4l2程式設計 1.定義 2.工作流程 開啟裝置 檢查和設定裝置屬性 設定幀格式 設定一種輸入輸出方法 緩衝區管理 迴圈獲取資料 關閉裝置。3.裝置的開啟和關閉 include int open const char device name,int flags include int close ...