V4L2视频采集实现例程
http://zhougaofeng.ixiezi.com/2009/12/01/v4l2/#more-59
Video4linux 简介
Video4Linux是为市场现在常见的电视捕获卡和并口及USB口的摄像头提供统一的编程接口。同时也提供无线电通信和文字电视广播解码和垂直消隐的数据接口。本文主要针对USB摄像头设备文件/dev/video0,进行视频图像采集方面的程序设计。
Video4linux 编程指南
1.视频编程的流程
(1)打开视频设备:
(2)读取设备信息
(3)更改设备当前设置(可以不做)
(4)进行视频采集,两种方法:
a.内存映射
b.直接从设备读取
(5)对采集的视频进行处理( 本程序没做,下次再show给大家)
(6)关闭视频设备
//下面我对这些操作做了个简单的函数封装
#ifndef _V4L_H
#define _V4L_H
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <error.h>
#include <assert.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <sys/types.h>
#include <sys/mman.h>
#include <linux/videodev.h>
#include <sys/types.h>
#include <string.h>
/*采集的图像的最大长和宽*/
#define MAX_WIDTH 400
#define MAX_HEIGHT 300
/*设备文件*/
#define DEFAULT_DEVICE “/dev/video0″
/*自定义数据结构,包含v4l 中用到的数据结构*/
typedef struct v4l_struct
{
int fd;/*设备号*/
struct video_capability capability; //包含设备的基本信息(设备名称、支持的最大最小分辨率、信号源信息等)
struct video_channel channel[8];//信号源个数
struct video_picture picture;//设备采集的图象的各种属性
struct video_mmap mmap;//用于mmap
struct video_mbuf mbuf;//利用mmap进行映射的帧的信息
unsigned char *buffer ;/*图像数据存放区*/
unsigned char *map;/*mmap方式获取数据时,数据的首地址*/
int frame_current;
int frame_using[2]; /*这个帧的状态0 表示可用,1表示不可用*/
}v4l_device;
/**************************************************************
* 函数名:v4l_open
* 功 能: 打开设备
* 输 入: dev,vd
* 输 出: 无
* 返 回: -1—-失败 0—-成功
**************************************************************/
int v4l_open( char *dev, v4l_device *vd )
{
if( !dev )
{
dev=DEFAULT_DEVICE ;
}
if( ( vd->fd = open( dev, O_RDWR ) ) < 0 )
{
perror( “v4l_open error” );
return -1;
}
return 0;
}
/**************************************************************
* 函数名: v4l_get_capability
* 功 能: 获取设备属性
* 输 入: vd
* 输 出: 无
* 返 回: -1—-失败 0—-成功
*************************************************************