/*
*名称:v4l2demo
*作者:zym
*时间:20180503
*说明:(1)本demo得到的是yuv422格式的图像
* (2)对于图像,我们用宽和高来描述
* (3)对于得到的yuv帧,使用7yuv等软件进行打开
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#include <getopt.h>
#include <fcntl.h>
#include <unistd.h>
#include <errno.h>
#include <malloc.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <sys/time.h>
#include <sys/mman.h>
#include <sys/ioctl.h>
#include <asm/types.h>
#include <linux/videodev2.h>
#include <linux/v4l2-mediabus.h>
#include<unistd.h>
#define BUFFER_COUNT 10 //缓存帧数目
typedef struct VideoBuffer { //用来映射缓存帧
void *start;
size_t length;
} VideoBuffer;
int VIDEO_WIDTH = 1280; //默认宽、高
int VIDEO_HEIGHT = 720;
int n; //定义得到的yuv帧的数量
int continunity; //yuv帧的连续与否
int Open_Camera(){ //打开摄像头
int ret=open("/dev/video0",O_RDWR);//打开方式:read和write,用一个int型来标记这个摄像头
if(ret<0)
printf("opoened error\n");
else
printf("connected success! welcome!\n\n");
return ret;
}
void Close_Camera(int camera){ //关闭摄像头
close(camera);
printf("Thinks for using,goodbye!\n");
}
void Show_Camera_Capability(int camera){//查询摄像头属性
struct v4l2_capability cap;//套路:先定义一个特定的结构体,然后调用v4l2接口函数来将其填充,之后打印出来
ioctl(camera, VIDIOC_QUERYCAP, &cap);
printf("Capability Informations:\n");
printf("driver: %s\n", cap.driver);// 驱动名字
printf("card: %s\n", cap.card);// 设备名字
printf("bus_info: %s\n", cap.bus_info);//设备在系统中的位置
printf("version: %08X\n", cap.version);// 驱动版本号
printf("capabilities: %08X\n\n", cap.capabilities);//设备支持的操作
}
void Show_Current_Format(int camera){//查询当前的帧的格式
struct v4l2_format fmt;
memset(&fmt,0,sizeof(fmt));
fmt.type=V4L2_BUF_TYPE_VIDEO_CAPTURE;
ioctl(camera, VIDIOC_G_FMT, &fmt);
printf("Stream Format Informations:\n");
printf("type: %d\n", fmt.type);
printf("width: %d\n", fmt.fmt.pix.width);
printf("height: %d\n", fmt.fmt.pix.height);
char fmtstr[8];
memset(fmtstr, 0, 8);
memcpy(fmtstr, &fmt.fmt.pix.pixelformat, 4);
printf("pixelformat: %s\n", fmtstr);
*名称:v4l2demo
*作者:zym
*时间:20180503
*说明:(1)本demo得到的是yuv422格式的图像
* (2)对于图像,我们用宽和高来描述
* (3)对于得到的yuv帧,使用7yuv等软件进行打开
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#include <getopt.h>
#include <fcntl.h>
#include <unistd.h>
#include <errno.h>
#include <malloc.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <sys/time.h>
#include <sys/mman.h>
#include <sys/ioctl.h>
#include <asm/types.h>
#include <linux/videodev2.h>
#include <linux/v4l2-mediabus.h>
#include<unistd.h>
#define BUFFER_COUNT 10 //缓存帧数目
typedef struct VideoBuffer { //用来映射缓存帧
void *start;
size_t length;
} VideoBuffer;
int VIDEO_WIDTH = 1280; //默认宽、高
int VIDEO_HEIGHT = 720;
int n; //定义得到的yuv帧的数量
int continunity; //yuv帧的连续与否
int Open_Camera(){ //打开摄像头
int ret=open("/dev/video0",O_RDWR);//打开方式:read和write,用一个int型来标记这个摄像头
if(ret<0)
printf("opoened error\n");
else
printf("connected success! welcome!\n\n");
return ret;
}
void Close_Camera(int camera){ //关闭摄像头
close(camera);
printf("Thinks for using,goodbye!\n");
}
void Show_Camera_Capability(int camera){//查询摄像头属性
struct v4l2_capability cap;//套路:先定义一个特定的结构体,然后调用v4l2接口函数来将其填充,之后打印出来
ioctl(camera, VIDIOC_QUERYCAP, &cap);
printf("Capability Informations:\n");
printf("driver: %s\n", cap.driver);// 驱动名字
printf("card: %s\n", cap.card);// 设备名字
printf("bus_info: %s\n", cap.bus_info);//设备在系统中的位置
printf("version: %08X\n", cap.version);// 驱动版本号
printf("capabilities: %08X\n\n", cap.capabilities);//设备支持的操作
}
void Show_Current_Format(int camera){//查询当前的帧的格式
struct v4l2_format fmt;
memset(&fmt,0,sizeof(fmt));
fmt.type=V4L2_BUF_TYPE_VIDEO_CAPTURE;
ioctl(camera, VIDIOC_G_FMT, &fmt);
printf("Stream Format Informations:\n");
printf("type: %d\n", fmt.type);
printf("width: %d\n", fmt.fmt.pix.width);
printf("height: %d\n", fmt.fmt.pix.height);
char fmtstr[8];
memset(fmtstr, 0, 8);
memcpy(fmtstr, &fmt.fmt.pix.pixelformat, 4);
printf("pixelformat: %s\n", fmtstr);