Linux下V4L2拍照测试用例

一、源码test.c

[cpp]  view plain copy
  1. #include   
  2. #include   
  3. #include   
  4. #include   
  5.   
  6. int main(){  
  7.   //////  
  8.   int fd = open("/dev/video0",O_RDWR);  
  9.   printf("TK------->>>fd is %d\n",fd);  
  10.   //////  
  11.   struct v4l2_capability cap;  
  12.   ioctl(fd,VIDIOC_QUERYCAP,&cap);  
  13.   printf("TK---------->>>>>Driver Name:%s\nCard Name:%s\nBus info:%s\n",cap.driver,cap.card,cap.bus_info);  
  14.   //////  
  15.   struct v4l2_fmtdesc fmtdesc;  
  16.   fmtdesc.index = 0; fmtdesc.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;  
  17.   while(ioctl(fd,VIDIOC_ENUM_FMT,&fmtdesc) != -1){  
  18.    printf("TK-------->>>>>fmtdesc.description is %s\n",fmtdesc.description);  
  19.    fmtdesc.index ++;  
  20.   }  
  21.   //////  
  22.   struct v4l2_format fmt;  
  23.   fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;  
  24.   ioctl(fd,VIDIOC_G_FMT,&fmt);  
  25.   printf("TK----------->>>>>fmt.fmt.width is %d\nfmt.fmt.pix.height is %d\nfmt.fmt.pix.colorspace is %d\n",fmt.fmt.pix.width,fmt.fmt.pix.height,fmt.fmt.pix.colorspace);  
  26.   //////  
  27.   struct v4l2_requestbuffers req;  
  28.   req.count = 4;  
  29.   req.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;  
  30.   req.memory = V4L2_MEMORY_MMAP;  
  31.   ioctl(fd,VIDIOC_REQBUFS,&req);  
  32.   struct buffer{  
  33.     void *start;  
  34.     unsigned int length;  
  35.   }*buffers;  
  36.   buffers = (struct buffer*)calloc (req.count, sizeof(*buffers));  
  37.   unsigned int n_buffers = 0;  
  38.   for(n_buffers = 0; n_buffers < req.count; ++n_buffers){  
  39.     struct v4l2_buffer buf;  
  40.     memset(&buf,0,sizeof(buf));  
  41.     buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;  
  42.     buf.memory = V4L2_MEMORY_MMAP;  
  43.     buf.index = n_buffers;  
  44.     if(ioctl(fd,VIDIOC_QUERYBUF,&buf) == -1){  
  45.       printf("TK---------_>>>>>>error\n");  
  46.       close(fd);  
  47.       exit(-1);  
  48.     }  
  49.     buffers[n_buffers].length = buf.length;  
  50.     buffers[n_buffers].start = mmap(NULL,buf.length,PROT_READ|PROT_WRITE,MAP_SHARED,fd,buf.m.offset);  
  51.     if(MAP_FAILED == buffers[n_buffers].start){  
  52.       printf("TK--------__>>>>>error 2\n");  
  53.       close(fd);  
  54.       exit(-1);  
  55.     }  
  56.   }  
  57.   ////  
  58.   unsigned int i;  
  59.   enum v4l2_buf_type type;  
  60.   for(i = 0; i < 4; i++){  
  61.     struct v4l2_buffer buf;  
  62.     buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;  
  63.     buf.memory = V4L2_MEMORY_MMAP;  
  64.     buf.index = i;  
  65.     ioctl(fd,VIDIOC_QBUF,&buf);  
  66.   }  
  67.   type = V4L2_BUF_TYPE_VIDEO_CAPTURE;  
  68.   ioctl(fd,VIDIOC_STREAMON,&type);  
  69.   ////  
  70.   struct v4l2_buffer buf;  
  71.   buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;  
  72.   buf.memory = V4L2_MEMORY_MMAP;  
  73.   ioctl(fd,VIDIOC_DQBUF,&buf);  
  74.   char path[20];  
  75.   snprintf(path,sizeof(path),"./yuyv%d",buf.index);  
  76.   int fdyuyv = open(path,O_WRONLY|O_CREAT,00700);  
  77.   printf("TK--------->>>>fdyuyv is %d\n",fdyuyv);  
  78.   int resultyuyv = write(fdyuyv,buffers[buf.index].start,1280*720*2);  
  79.   printf("TK--------->>>resultyuyv is %d\n",resultyuyv);     
  80.   close(fdyuyv);  
  81.   ////  
  82.   close(fd);  
  83.   return 0;  
  84. }  
二、编译运行

gcc test.c -o rest

./test

三、结果

在本目录下生成yuyv0这样一个文件,是jpeg编码后的文件。

四、极力推荐一款window下的图像查看工具YUVviewerPlus

  该工具可以将原始yuyv(如yuv422选择yuy2,需要后缀改为.yuv),rgb(rgb24选择gbmp24,需要后缀改为.bmp)等数据文件显示出来。

  另外说明:yuyv和jpeg数据大小为width*height*2;rgb为width*height*3;单位为Bytes。

  附免费下载地址:http://download.csdn.net/detail/tankai19880619/6617647

你可能感兴趣的:(Linux下V4L2拍照测试用例)