关于linux命令pict的信息( 六 )


struct video_picture picture;
struct video_mmap mmap;
struct video_mbuf mbuf;
unsigned char *map;//用于指向图像数据的指针
int frame_current;
int frame_using[VIDEO_MAXFRAME];//这两个变量用于双缓冲在后面介绍 。
};
typedef struct _v4l_struct v4l_device;
//上面的定义的结构体,有的文中章有定义channel的变量,但对于摄像头来说设置这个变量意义不大通常只有一个channel,本文不是为了写出一个大而全且成熟的函数库,只是为了介绍如何使用v4l , 再加上本人水平也有限,能够给读者一个路线我就很知足了,所以并没有设置这个变量同时与channel相关的函数也没有给出 。
extern int v4l_open(char *, v4l_device *);
extern int v4l_close(v4l_device *);
extern int v4l_get_capability(v4l_device *);
extern int v4l_get_picture(v4l_device *);
extern int v4l_get_mbuf(v4l_device *);
extern int v4l_set_picture(v4l_device *, int, int, int, int, int,);
extern int v4l_grab_picture(v4l_device *, unsigned int);
extern int v4l_mmap_init(v4l_device *);
extern int v4l_grab_init(v4l_device *, int, int);
extern int v4l_grab_frame(v4l_device *, int);
extern int v4l_grab_sync(v4l_device *);
上述函数会在下文中逐渐完成,功能也会逐渐介绍,虽然现在看起来没什么感觉只能从函数名上依稀体会它的功能,或许看起来很烦,不过看完下文就会好了 。
前面已经说过使用v4l视频编程的流程和对文件操作并没有什么本质的不同,大概的流程如下:
1.打开视频设备(通常是/dev/video0)
2.获得设备信息 。
3.根据需要更改设备的相关设置 。
4.获得采集到的图像数据(在这里v4l提供了两种方式,直接通过打开的设备读取数据,使用mmap内存映射的方式获取数据) 。
5.对采集到的数据进行操作(如显示到屏幕,图像处理,存储成图片文件) 。
6.关闭视频设备 。
知道了流程之后 , 我们就需要根据流程完成相应的函数 。
那么我们首先完成第1步打开视频设备,需要完成int v4l_open(char *, v4l_device *);
具体的函数如下
#define DEFAULT_DEVICE “/dev/video0”
int v4l_open(char *dev , v4l_device *vd)
{
if(!dev)dev= DEFAULT_DEVICE;
if((vd-fd=open(dev,O_RDWR))0){perror(“v4l_open:”);return -1;}
if(v4l_get_capability(vd))return -1;
if(v4l_get_picture(vd))return -1;//这两个函数就是即将要完成的获取设备信息的函数
return 0
}
同样对于第6步也十分简单,就是int v4l_close(v4l_device *);的作用 。
函数如下:
int v4l_close(v4l_device *vd)
{close(vd-fd);return 0;}
现在我们完成第2步中获得设备信息的任务,下面先给出函数在对函数作出相应的说明 。
int v4l_get_capability(v4l_device *vd)
{
if (ioctl(vd-fd, VIDIOCGCAP, (vd-capability))0) {
perror("v4l_get_capability:");
return -1;
}
return 0;
}
int v4l_get_picture(v4l_device *vd)
{
if (ioctl(vd-fd, VIDIOCGPICT, (vd-picture))0) {
perror("v4l_get_picture:");
return -1;
}
return 0;
}
对于以上两个函数我们不熟悉的地方可有vd-capability和vd-picture两个结构体,和这两个函数中最主要的语句ioctl 。对于ioctl的行为它是由驱动程序提供和定义的,在这里当然是由v4l所定义的 , 其中宏VIDIOCGCAP和VIDIOCGPICT的分别表示获得视频设备的capability和picture 。对于其他的宏功能定义可以在你的Linux系统中的/usr/include/linux/videodev.h中找到,这个头文件也包含了capability和picture的定义 。例如:
struct video_capability
{
char name[32];
int type;
int channels;

推荐阅读