智能手机算法---2编写android v4l2

本文介绍了如何在Android系统中使用V4L2库获取摄像头的YUV图像。通过打开设备文件,进行ioctl操作,设置格式,分配缓冲区,启动流传输,最终将捕获的图像数据写入文件。详细步骤包括打开设备、查询设备能力、枚举格式、获取图像格式、请求缓冲区、映射内存以及读取和写入图像数据。
摘要由CSDN通过智能技术生成

联系qq 1923962282@qq.com

相机硬件模组大致在智能硬件上数据流

cmos----mipi----isp----v4l2---hal---------.jni ----app

下面介绍v4l2如何获取一张图像yuv图像

 

gcc -o jhf jhf.c

./jhf

#include <fcntl.h>

#include <stdlib.h>
#include <sys/mman.h>
#include <linux/videodev2.h>
 
int main(){
  //
  int fd = open("/dev/video0",O_RDWR);
  printf("TK------->>>fd is %d\n",fd);
  //
  struct v4l2_capability cap;
  ioctl(fd,VIDIOC_QUERYCAP,&cap);
  printf("TK---------->>>>>Driver Name:%s\nCard Name:%s\nBus info:%s\n",cap.driver,cap.card,cap.bus_info);
  //
  struct v4l2_fmtdesc fmtdesc;
  fmtdesc.index = 0; fmtdesc.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
  while(ioctl(fd,VIDIOC_ENUM_FMT,&fmtdesc) != -1){
   printf("TK-------->>>>>fmtdesc.description is %s\n",fmtdesc.description);
   fmtdesc.index ++;
  }
  //
  struct v4l2_format fmt;
  fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
  ioctl(fd,VIDIOC_G_FMT,&fmt);
  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);
  //
  struct v4l2_requestbuffers req;
  req.count = 4;
  req.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
  req.memory = V4L2_MEMORY_MMAP;
  ioctl(fd,VIDIOC_REQBUFS,&req);
  struct buffer{
    void *start;
    unsigned int length;
  }*buffers;
  buffers = (struct buffer*)calloc (req.count, sizeof(*buffers));
  unsigned int n_buffers = 0;
  for(n_buffers = 0; n_buffers < req.count; ++n_buffers){
    struct v4l2_buffer buf;
    memset(&buf,0,sizeof(buf));
    buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
    buf.memory = V4L2_MEMORY_MMAP;
    buf.index = n_buffers;
    if(ioctl(fd,VIDIOC_QUERYBUF,&buf) == -1){
      printf("TK---------_>>>>>>error\n");
      close(fd);
      exit(-1);
    }
    buffers[n_buffers].length = buf.length;
    buffers[n_buffers].start = mmap(NULL,buf.length,PROT_READ|PROT_WRITE,MAP_SHARED,fd,buf.m.offset);
    if(MAP_FAILED == buffers[n_buffers].start){
      printf("TK--------__>>>>>error 2\n");
      close(fd);
      exit(-1);
    }
  }
 
  unsigned int i;
  enum v4l2_buf_type type;
  for(i = 0; i < 4; i++){
    struct v4l2_buffer buf;
    buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
    buf.memory = V4L2_MEMORY_MMAP;
    buf.index = i;
    ioctl(fd,VIDIOC_QBUF,&buf);
  }
  type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
  ioctl(fd,VIDIOC_STREAMON,&type);
 
  struct v4l2_buffer buf;
  buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
  buf.memory = V4L2_MEMORY_MMAP;
  ioctl(fd,VIDIOC_DQBUF,&buf);
  char path[20];
  snprintf(path,sizeof(path),"./yuyv%d",buf.index);
  int fdyuyv = open(path,O_WRONLY|O_CREAT,00700);
  printf("TK--------->>>>fdyuyv is %d\n",fdyuyv);
  int resultyuyv = write(fdyuyv,buffers[buf.index].start,1280*720*2);
  printf("TK--------->>>resultyuyv is %d\n",resultyuyv);    
  close(fdyuyv);
 
  close(fd);
  return 0;
}
 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值