linux video属性_Linux下实现视频读取

V4L(video4linux是一些视频系统,视频软件、音频软件的基础,经常时候在需要采集图像的场合,如视频监控,webcam,可视电话,经常

使用在embedded linux中是linux嵌入式开发中经常使用的系统接口。它是linux内核提供给用户空间的编程接口,各种的视频和音频设备开

发相应的驱动程序后,就可以通过v4l提供的系统API来控制视频和音频设备,也就是说v4l分为两层,底层为音视频设备在内核中的驱动,上

层为系统提供的API,而对于我们来说需要的就是使用这些系统API。

V4L2是V4L的升级版本,为linux下视频设备程序提供了一套接口规范。包括一套数据结构和底层V4L2驱动接口。V4L2采用流水线的方式,

操作更简单直观,基本遵循打开视频设备、设置格式、处理数据、关闭设备,更多的具体操作通过ioctl函数来实现。

1、打开设备

int open(const char *device_name, int flags);

int fd = open("/dev/video0", O_RDONLY); //O_NONBLOCK --非阻塞(不推荐使用)

2、关闭设备 int close(int fd)

int ret = close(fd);

3、v4l2_capability 查看属性

int ioctl(int fd, int request, struct v4l2_capability *argp);

struct v4l2_capability

{

u8 driver[16]; // 驱动名字

u8 card[32]; // 设备名字

u8 bus_info[32]; // 设备在系统中的位置

u32 version; // 驱动版本号

u32 capabilities; // 设备支持的操作

u32 reserved[4]; // 保留字段

};

4、设置视频格式与制式

相关函数:

int ioctl(int fd, int request, struct v4l2_fmtdesc *argp);

int ioctl(int fd, int request, struct v4l2_format *argp);

相关结构体:

v4l2_cropcap 结构体用来设置摄像头的捕捉能力,在捕捉上视频时应先先设置

v4l2_cropcap 的 type 域,再通过 VIDIO_CROPCAP 操作命令获取设备捕捉能力的参数,保存于 v4l2_cropcap 结构体中,包括 bounds

(最大捕捉方框的左上角坐标和宽高),defrect(默认捕捉方框的左上角坐标和宽高)等。

v4l2_format 结构体用来设置摄像头的视频制式、帧格式等,在设置这个参数时应先填 好 v4l2_format 的各个域,如 type(传输流类型),

fmt.pix.width(宽),fmt.pix.heigth(高),fmt.pix.field(采样区域,如隔行采样),fmt.pix.pixelformat(采样类型,如 YUV4:2:2),

然后通过 VIDIO_S_FMT 操作命令设置视频捕捉格式。

struct v4l2_fmtdesc

{

u32 index; // 要查询的格式序号,应用程序设置

enum v4l2_buf_type type; // 帧类型,应用程序设置

u32 flags; // 是否为压缩格式

u8 description[32]; // 格式名称

u32 pixelformat; // 格式

u32 reserved[4]; // 保留

};

所有的视频格式可以能下面的方法查看

#define v4l2_fourcc(a, b, c, d) ((a) | ((b) << 8) | ((c) << 16) | ((d) << 24))

All format : VIDIOC_ENUM_FMT, v4l2_fmtdesc

struct v4l2_format

{

enum v4l2_buf_type type; // 帧类型,应用程序设置

union fmt

{

struct v4l2_pix_format pix; // 视频设备使用

struct v4l2_window win;

struct v4l2_vbi_format vbi;

struct v4l2_sliced_vbi_format sliced;

u8 raw_data[200];

};

};

struct v4l2_pix_format

{

u32 width; // 帧宽,单位像素

u32 height; // 帧高,单位像素

u32 pixelformat; // 帧格式

enum v4l2_field field;

u32 bytesperline;

u32 sizeimage;

enum v4l2_colorspace colorspace;

u32 priv;

};

5、查看视频的帧率

int ioctl(int fd, int request, struct v4l2_streamparm parm* argp);

struct v4l2_streamparm parm;

parm.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;

其中VIDIOC_G_PARM是用取帧率的,VIDIOC_S_PARM是用来设定帧率

6、定制ioctl函数

在内核目录下找到kernel/include/linux/videodev2.h头文件,你可查看所有的io控制的命令

/*

*Experimental, third param 0--video, 1--tracking

*/

#define VIDIOC_POCCESS_NOTIFY _IOW('V', 99, int) //add by Henry.Wen 20131126

实例:

#ifndef CAMERA_V4L2CAMERA_H

#define CAMERA_V4L2CAMERA_H

#include

#include

#include

#include

#include /* getopt_long() */

#include /* low-level i/o */

#include

#include

#include

#include

#include

#include

#include

#include

#include /* for videodev2.h */

#include

#define CONFIG_CAMERA_UVC_INVAL_FRAMECNT 5

namespace v4l2

{

/**

* return error code

*/

enum _RET_ERROR_CODE

{

RET_ERROR_FAIL = -1,

RET_ERROR_OK = 0,

RET_ERROR_CAPTURE_NULL = -9999,

RET_ERROR_CAPTURE_NAME,

RET_ERROR_CAPTURE_CAPABILITY,

RET_ERROR_CAPTURE_FORMAT,

RET_ERROR_CAPTURE_BUFFER,

RET_ERROR_CAPTURE_OUTMEMORY,

RET_ERROR_CAPTURE_MMAP,

RET_ERROR_CAPTURE_FORM,

RET_ERROR_CAPTURE_MUMAP,

RET_ERROR_CAPTURE_VIDIOC,

};

/**

* Name: video_format enum

* Function: Describe formats V4L2 will support

*/

typedef enum _pFormat

{

UNKNOWN,

YUYV,

MJPEG,

YV12,

YU12,

NV12,

NV21,

H264,

}pFormat;

/**

* frame width and height infomation

*/

typ

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值