V4L2程式設計筆記 1

2021-05-22 06:30:58 字數 4329 閱讀 1726

這兩天接到乙個同學的專案,v4l2+qt顯示的,我v4l2先用c語言調出來了,下面是幾篇文章我的筆記

首先是在網上找到的v4l2程式設計框架,

v4l2應用程式框架

v4l2

較v4l

有較大的改動,並已成為

2.6的標準介面,函蓋

video/dvb/fm...

,多數驅動都在向

v4l2

遷移。更好地了解

v4l2

先從應用入手,然後再深入到核心中結合物理裝置/介面的規範實現相應的驅動。本文先就

v4l2

camera

方面的應用框架。

v4l2

ioctl

函式來實現。

在v4l2

open

函式開啟這個裝置:

// 

用非阻塞模式開啟攝像頭裝置

int

camerafd

;camerafd

= open

("/dev/video0"

, o_rdwr

| o_nonblock

, 0);

// 如果用阻塞模式開啟攝像頭裝置,上述**變為:

//camerafd = open("/dev/video0", o_rdwr, 0);

dqbuff

)裡的東西返回給應用程式。

linux

程式設計中,一般使用

ioctl

函式來對裝置的

i/o通道進行管理:

int 

ioctl

(int

__fd

, unsigned long int

__request

, .../*args*/) ;

在進行

v4l2

開發中,常用的命令標誌符如下

(some are optional)

:在亞洲,一般使用

pal(

720x576

)制式的攝像頭,而歐洲一般使用

ntsc

(720x480

),使用

vidioc_querystd

來檢測:

v4l2_std_id std

;do

while

(ret

== -1 &&

errno

== eagain

);switch

(std

)

struct

v4l2_format fmt

;

memset 

( &fmt

, 0,

sizeof

(fmt

) );

fmt.

type

= v4l2_buf_type_video_capture

;fmt

.fmt

.pix

.width

= 720

;fmt

.fmt

.pix

.height

= 576

;fmt

.fmt

.pix

.pixelformat

= v4l2_pix_fmt_yuyv

;fmt

.fmt

.pix

.field

= v4l2_field_interlaced

;if

(ioctl(fd

, vidioc_s_fmt

, &fmt

) == -1)

v4l2_format

結構如下:

struct

v4l2_format

fmt;};

struct

v4l2_pix_format

;

2.3 

分配記憶體

struct 

v4l2_requestbuffersreq

;if

(ioctl(fd

, vidioc_reqbufs

, &req

) == -1)

v4l2_requestbuffers

結構如下:

struct

v4l2_requestbuffers

;

使用

vidioc_reqbufs

,我們獲取了

req.count

個快取,下一步通過呼叫

vidioc_querybuf

命令來獲取這些快取的位址,然後使用

mmap

函式轉換成應用程式中的絕對位址,最後把這段快取放入快取佇列:

typedef struct 

videobuffer

videobuffer

;videobuffer

*buffers

= calloc

( req

.count

, sizeof

(*buffers

) );

struct

v4l2_bufferbuf

;for

(numbufs

= 0;

numbufs

<

req.

count

; numbufs

++)

buffers

[numbufs

].length

= buf

.length

;//

轉換成相對位址

buffers

[numbufs

].start

= mmap

(null

, buf

.length

, prot_read

| prot_write

,map_shared,fd

, buf.m

.offset

);if

(buffers

[numbufs

].start

== map_failed

) //

放入快取佇列

if (

ioctl(fd

, vidioc_qbuf

, &buf

) == -1)

}

作業系統一般把系統使用的記憶體劃分成使用者空間和核心空間,分別由應用程式管理和作業系統管理。應用程式可以直接訪問記憶體的位址,而核心空間存放的是供核心訪問的**和資料,使用者不能直接訪問。

v4l2

捕獲的資料,最初是存放在核心空間的,這意味著使用者不能直接訪問該段記憶體,必須通過某些手段來轉換位址。

一共有:使用

read

、write

方式;記憶體對映方式和使用者指標模式。

read

、write

方式,在使用者空間和核心空間不斷拷貝資料,占用了大量使用者記憶體空間,效率不高。

記憶體對映方式:把裝置裡的記憶體對映到應用程式中的記憶體控制項,直接處理裝置記憶體,這是一種有效的方式。上面的

mmap

函式就是使用這種方式。

使用者指標模式:記憶體片段由應用程式自己分配。這點需要在

v4l2_requestbuffers

裡將memory

字段設定成

v4l2_memory_userptr。

v4l2

有乙個資料快取,存放

req.count

數量的快取資料。資料快取採用

fifo

ioctl

命令,vidioc_dqbuf

和vidioc_qbuf

struct 

v4l2_buffer buf

;memset(&buf,0,

sizeof

(buf

));buf.type=v4l2_buf_type_video_capture

;buf.memory=v4l2_memory_mmap

;buf.index

=0;//

));buf.type=v4l2_buf_type_video_capture

;buf.memory=v4l2_memory_mmap

;buf.index

=0;//

最後就是關閉了 close(fd)就行

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 ...

V4L2程式設計 轉

前言 目前正在忙於arm 平台的linux 應用程式的開發 其實是剛剛起步學習啦 底層的東西不用考慮了,開發板子提供了 nand bootloader 和linux 2.6 的原始碼,而且都編譯好了。自己編譯的 bootloader 可以用,但是 linux 編譯後,檔案很大,暫且就用人家編譯的系統...