V4L 簡介及其與V4L2區別

2021-06-08 13:16:57 字數 3931 閱讀 3595

由於早期的 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 ...