原创博文,转载请标明出处--周学伟http://www.cnblogs.com/zxouxuewei/

资料链接:http://www.cnblogs.com/emouse/archive/2013/03/03/2943243.html

1.打开摄像头的设备节点文件。

  fd = open (dev_name, O_RDWR | O_NONBLOCK, 0);

2.获取设备驱动信息。

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

  ioctl (fd, VIDIOC_QUERYCAP, &cap);

  VIDIOC_QUERYCAP  ::查询设备属性。

struct v4l2_capability
{
  u8 driver[]; // 驱动名字
  u8 card[]; // 设备名字
  u8 bus_info[]; // 设备在系统中的位置
  u32 version; // 驱动版本号
  u32 capabilities; // 设备支持的操作
  u32 reserved[]; // 保留字段
};

3.设置图像格式。

  VIDIOC_G_FMT, VIDIOC_S_FMT

  检查是否支持某种格式:VIDIOC_TRY_FMT

我的代码:

fmt.type                = V4L2_BUF_TYPE_VIDEO_CAPTURE;
fmt.fmt.pix.width = ;
fmt.fmt.pix.height = ;
fmt.fmt.pix.field = V4L2_FIELD_INTERLACED;
fmt.fmt.pix.pixelformat = V4L2_PIX_FMT_MJPEG; ioctl (fd, VIDIOC_S_FMT, &fmt) ;

相关函数:

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

相关结构体:

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[];
  };
};
struct v4l2_pix_format
{
  u32 width; // 帧宽,单位像素
  u32 height; // 帧高,单位像素
  u32 pixelformat; // 帧格式
  enum v4l2_field field;
  u32 bytesperline;
  u32 sizeimage;
enum v4l2_colorspace colorspace; u32 priv; };

例:显示当前帧的相关信息

struct v4l2_format fmt; fmt.type=V4L2_BUF_TYPE_VIDEO_CAPTURE; ioctl(fd, VIDIOC_G_FMT, &fmt);
printf(“Current data format information:\n\twidth:%d\n\theight:%d\n”,
fmt.fmt.pix.width,fmt.fmt.pix.height);
struct v4l2_fmtdesc fmtdesc; fmtdesc.index=; fmtdesc.type=V4L2_BUF_TYPE_VIDEO_CAPTURE; while(ioctl(fd,VIDIOC_ENUM_FMT,&fmtdesc)!=-)
{
if(fmtdesc.pixelformat & fmt.fmt.pix.pixelformat)
{
printf(“\tformat:%s\n”,fmtdesc.description);
break;
}
fmtdesc.index++;
}

例:检查是否支持某种帧格式

struct v4l2_format fmt; 
  fmt.type=V4L2_BUF_TYPE_VIDEO_CAPTURE;
  fmt.fmt.pix.pixelformat=V4L2_PIX_FMT_RGB32;
if(ioctl(fd,VIDIOC_TRY_FMT,&fmt)==-)
if(errno==EINVAL)
printf(“not support format RGB32!\n”);

4.申请帧缓冲

ioctl (fd, VIDIOC_REQBUFS, &req);

我的代码:

     req.count               = ;
req.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
req.memory = V4L2_MEMORY_MMAP;
ioctl (fd, VIDIOC_REQBUFS, &req);

应用程序和设备有三种交换数据的方法,直接 read/write、内存映射(memory mapping)

和用户指针。这里只讨论内存映射(memory mapping)。

向设备申请缓冲区 VIDIOC_REQBUFS

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

相关结构体:

struct v4l2_requestbuffers
{
u32 count; // 缓冲区内缓冲帧的数目
enum v4l2_buf_type type; // 缓冲帧数据格式
enum v4l2_memory memory; // 区别是内存映射还是用户指针方式
u32 reserved[];
};

  

V4L2规范编程--21的更多相关文章

  1. 阶段2-新手上路\项目-移动物体监控系统\Sprint2-摄像头子系统开发\第2节-V4L2图像编程接口深度学习

    参考资料: http://www.cnblogs.com/emouse/archive/2013/03/04/2943243.htmlhttp://blog.csdn.net/eastmoon5021 ...

  2. [国嵌攻略][171][V4L2图像编程接口深度学习]

    V4L2摄像编程模型 1.打开摄像头设备文件 2.获取驱动信息-VIDIOC_QUERYCAP 3.设置图像格式-VIDIOC_S_FMT 4.申请帧缓冲-VIDIOC_REQBUFS 5.获取帧缓冲 ...

  3. Linux之V4L2基础编程

    Linux之V4L2基础编程 本文内容来源于网络,本博客进行整理. 1. 定义 V4L2(Video For Linux Two) 是内核提供给应用程序访问音.视频驱动的统一接口. 2. 工作流程: ...

  4. pytho核心编程2-1中代码运行问题

    书籍是<python核心编程>第三版,学习环境py3.6 2-1 时间戳服务器 附源代码: from socket import * from time import ctime HOST ...

  5. C#代码规范-编程秘笈

    原文地址:https://www.cnblogs.com/zzp0320/p/6949973.html 1.引言 本文是一套面向C# programmer和C# developer进行开发所应遵循的开 ...

  6. Linux C 程序 Linux网络编程(21)

    Linux网络编程网络编程必备的理论基础网络模型,地址,端口,TCP/IP协议 TCP/IP协议是目前世界上使用最广泛的网络通信协议日常中的大部分应用使用该系列协议(浏览网页,收发电子邮件,QQ聊天等 ...

  7. Linux编程 21 shell编程(环境变量,用户变量,命令替换)

    一.概述 这篇介绍shell的变量使用,跟其实语言一样,都有声明变量,使用变量,在shell中变量允许你临时地将信息存储中shell脚本中,以便和脚本的其他命令一起使用. 1.1 环境变量 在前面章节 ...

  8. Linux之V4L2基础编程【转】

    转自:https://www.cnblogs.com/emouse/archive/2013/03/04/2943243.html 本文内容来源于网络,本博客进行整理. 1. 定义 V4L2(Vide ...

  9. msp430项目编程21

    msp430中项目---直流电机控制系统 1.定时器工作原理 2.电路原理说明 3.代码(显示部分) 4.代码(功能实现) 5.项目总结 msp430项目编程 msp430入门学习

随机推荐

  1. Eclipse最新版注释模板设置详解

    /** * HassCMS (http://www.hassium.org/) * * @link http://github.com/hasscms for the canonical source ...

  2. 一些有用的Sql语句

    1.插入数据后,返回插入的Id ')

  3. Markdown: Basics (快速入门)[转]

    Markdown: Basics (快速入门) / (点击查看完整语法说明) Getting the Gist of Markdown's Formatting Syntax [转自:http://w ...

  4. struts2文件下载的编写步骤(文件导出)和输入流转换的方法

    strut2文件下载三部曲:一个流.两个头信息 说明: ①一个流,在Action中需要一个getInputStream()的方法来获取下载的内容,其中inputStream是默认的,他会指示Strea ...

  5. 【linux】Shell脚本启动程序

    Linux 下后台脚本启动Jar程序 Nohup后台输出运行日志 cd /home/zeze/jar/WeiboPost java -jar WeiboAutoPost.jar ../configur ...

  6. java 多线程6: 中断机制 优雅的终止java线程

    前文 java 多线程5: java 终止线程及中断机制 (stop().interrupt() .interrupted().isInterrupted()) 使用 interrupt() 和 in ...

  7. JAVA-JSP动作元素之param

    相关资料:<21天学通Java Web开发> 结果总结:1.用来传递参数,一般与<jsp:include>.<jsp:forward>联合使用.2.<jsp: ...

  8. postgres入门介绍

    mysql被oricle公司收购以后,PG就成了比较流行的开源数据库的首选,而且heroku上面不支持mysql,但是却大力支持PG,所以说,不得不学学PG,并非迫不得已的样子,至少以后PG会比较流行 ...

  9. rabbitmq系列(一)-基本概念理解

    1.简介 RabbitMQ是一个由erlang开发的AMQP(Advanced Message Queue protocol)的开源实现.AMQP高级消息队列,说白了就是一个开源的消息中间件.它能解决 ...

  10. list集合绑定在datagridview上时如何实现排序

    List<Person> lst = new List<Person>(); lst.Add(new Person("A", "1")) ...