原创博文,转载请标明出处--周学伟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. 与平台无关的类型,int8_t,uint8_t

    pecific integral type limits Specifier Common Equivalent Signing Bits Bytes Minimum Value Maximum Va ...

  2. ny8 一种排序 sort

    一种排序 时间限制:3000 ms  |  内存限制:65535 KB 难度:3 描述 现在有很多长方形,每一个长方形都有一个编号,这个编号可以重复:还知道这个长方形的宽和长,编号.长.宽都是整数:现 ...

  3. 交叉编译busybox

    交叉编译器: 3.3.2# wget -c http://www.busybox.net/downloads/busybox-1.7.0.tar.bz2# tar jxvf busybox-1.7.0 ...

  4. C#中调用PowerShell代码

    在C#中调用PowerShell代码,很多时候Add是不好使的!要用AddScript!记录一下! using (Runspace runspace = RunspaceFactory.CreateR ...

  5. dp之二维背包poj1837(天平问题 推荐)

    题意:给你c(2<=c<=20)个挂钩,g(2<=g<=20)个砝码,求在将所有砝码(砝码重1~~25)挂到天平(天平长  -15~~15)上,并使得天平平衡的方法数..... ...

  6. excel保存时出现“请注意,您的文档的部分内容可能包含了文档检查器无法删除的个人信息”

    这个问题的原因是由于工作簿包含宏.ActiveX控件等内容, 而Excel被设置为在保存文件时自动删除文件属性中的个人信息,因而出现该对话框.如果要避免出现这个提示,可进行如下设置: Excel 20 ...

  7. 如何用Visual Studio 2013 (vs2013)编写C语言程序

    如何用Visual Studio 2013 (vs2013)编写C语言程序 (2014-05-16 10:58:15)   Visual Studio 2013是一个很强大的软件,但是刚开始用Visu ...

  8. C++笔记 4

    1.类和对象   类就是对对象的描述,主要从属性和行为两个方面描述.   对于属性一般作成private , 行为作为public   函数 (1)构造函数,初始化所有的成员变量,系统自动调用,可以重 ...

  9. Android中自定义控件,三个构造函数

    自定义控件时,最好抽象得彻底,并且编写需严谨,因为可能程序中多处都会引用到它,或者提供给团队中的其他人使用. 其一般步骤为: 1.创建控件的类文件,定义其功能逻辑.一般继承自现有控件或者View 2. ...

  10. socket数据收发

    socket读写 TCP协议是面向流的,read和write调用的返回值往往小于参数指定的字节数.对于read调用,如果接收缓冲区中有20字节,请求读100个字节,就会返回20.对于write调用,如 ...