EDA365电子论坛网

标题: Linux - 学习一下V4L2基础编程 [打印本页]

作者: mytomorrow    时间: 2019-10-9 11:23
标题: Linux - 学习一下V4L2基础编程
1. 定义, h" d9 ]) s% y  r, R& S
( f$ U; i6 I. p. {( G8 f$ C
V4L2(Video For Linux Two) 是内核提供给应用程序访问音、视频驱动的统一接口。
4 b9 z+ Q2 n$ b; g7 D9 {' Q2 a, D' w" E! g. n% \; z5 C* U* O
2. 工作流程:
$ Y2 `0 {* I/ e& F* v$ Q1 ]* G) H$ Z! y* f/ u
打开设备-> 检查和设置设备属性-> 设置帧格式-> 设置一种输入输出方法(缓冲 区管理)-> 循环获取数据-> 关闭设备。
" G. z$ R$ U4 \5 I# o$ C& u' l; @6 L- X
3. 设备的打开和关闭:/ B/ I; `) C. n7 q! E; p' g

8 p6 a, w" [- _6 T#include <fcntl.h>
/ U- k) I9 P& P( D' O) l: t, Y  P
8 o* C( L0 J( [; s5 `, _int open(const char *device_name, int flags);7 v* \3 H0 J7 ?. a

7 I2 G2 s7 u4 ^: i#include <unistd.h>
/ o1 _; j9 Z: S% i, a( z) ^6 F6 X5 ?4 {1 a% u
int clo se(int fd);
2 V. S8 y' N  a  g+ L$ V
例:6 Q/ R  V- r' p1 O& p
, h. r. J, o7 A& e8 c
int fd=open(“/dev/video0”,O_RDWR); // 打开设备  I3 O4 U4 ]: Z* z5 E
2 f! e4 M. f. \+ F* F
close(fd); // 关闭设备

6 \5 ?: J) h8 ~# J9 l2 M& I) Y& V5 _1 |
注意:V4L2 的相关定义包含在头文件<linux/videodev2.h> 中.' ~/ V; E' b: L! e+ c

7 Z( X$ L; L" n4. 查询设备属性: VIDIOC_QUERYCAP3 d4 s  X0 C& T# Z% ^; K
6 o( U5 x9 Y# M6 W; V; J  F. i
相关函数:
% }: b5 \% N9 }; s; d' E/ A) S& z/ V3 m6 f& f5 t0 x) B
int ioctl(int fd, int request, struct v4l2_capability *argp);
/ f0 o3 ~3 r7 ^: O8 j5 q
1 g! U" B" U% `6 {; B! Z" q
相关结构体:. M* T* Q  \5 {! G: R

: m; q  x1 p, }- n/ M0 dstruct v4l2_capability% t' ^( r' T" v9 r/ E( c$ U
" y, _, Z, a( \8 F
{
% i* R, x; T9 u! I6 v7 b" i% [& ]: ~/ o$ u) R4 H7 `
u8 driver[16]; // 驱动名字8 T% F- u. H4 j9 [5 _% O1 t  ]% v

- d- n; @' B; f  V7 cu8 card[32]; // 设备名字
6 x/ j1 r- T% ^7 S3 d; L/ u# f
7 v  P" `. l& c& yu8 bus_info[32]; // 设备在系统中的位置9 T( E) e. d0 `* |
8 N+ U3 I  Y5 G
u32 version; // 驱动版本号2 W1 y! x: m7 ]1 D8 x5 b. K- n, h# w; I; {
! B. X' w. t+ z
u32 capabilities; // 设备支持的操作
. E, Q3 H5 x1 n1 ?0 G0 u: C+ `. m. Q. o) c* k5 @" H2 h2 ]
u32 reserved[4]; // 保留字段
2 d. ^* b$ c4 `
( `) u/ T+ G0 d3 t+ ]) j};5 {8 i! k4 p# `6 i* B

2 O3 v3 j- z$ D% d% R, e& v
! E* R' R8 K. {9 K/ bcapabilities 常用值:
0 }9 _' W- t: F3 G& O0 n/ b8 r; A4 E! n9 ]1 y+ H) q( w
V4L2_CAP_VIDEO_CAPTURE // 是否支持图像获取
) K# m& [2 U; i' B, ?" ]6 W8 y! w- E- U1 {" P5 v% E) M# F
例:显示设备信息
" o6 Z4 C+ I* q; E" D6 d7 i+ L% ?& ^& D- m6 }
struct v4l2_capability cap;: s# g0 L. }' p7 K5 O

6 q4 I# t* ]$ Fioctl(fd,VIDIOC_QUERYCAP,&cap);7 T) W/ C3 _$ t: O3 [/ Y& z1 t7 k

1 J  c, o( r+ G8 Z% n5 Uprintf(“Driver Name:%s\nCard Name:%s\nBus info:%s\nDriver Version:%u.%u.%u\n”,cap.driver,cap.card,cap.bus_info,(cap.version>>16)&0XFF, (cap.version>>8)&0XFF,cap.version&0XFF);

# a8 m4 I+ ?/ e' M# _+ Y) Z: o9 x) q' J7 y% H6 n  k
5. 设置视频的制式和帧格式. w3 @: o9 K2 K7 y" g4 f9 n9 P3 Z7 e

- K( l6 h: L1 {# @1 G制式包括PAL,NTSC,帧的格式个包括宽度和高度等。
( ^/ |! J/ z0 S! t; ]4 d) S5 F/ i" O3 T# j, h: s& a& I$ r
相关函数:
5 T) e3 e1 T) E  d

  }4 y8 x7 m# f( C1 r0 b1 {: X- b
  [$ G2 j/ J1 p' G

7 E3 Z8 H6 Y/ c% l
- c& f$ Q( `5 }+ P
) M; |$ g* y. w7 A3 S2 T6 r
7 v% }2 V- g2 @0 |
! v2 c. J4 L5 p: t" Y1 W3 x
, N# H; H7 Z: T0 f, S  P  P' @0 k3 W

' P& h6 n) o; C/ Z( G# c
作者: helendcany    时间: 2019-10-9 18:51
谢谢楼主分享。
作者: ctf中国    时间: 2021-2-20 10:51
感谢楼主& L5 c. }# t! M
6 K$ V! X# g  m' p* k8 F





欢迎光临 EDA365电子论坛网 (https://bbs.eda365.com/) Powered by Discuz! X3.2