mofoyiyeshu 2015-05-17 19:30 采纳率: 0%
浏览 2181

linux V4l2 摄像头问题

分辨率不能修改,只要修改以后,程序就会阻塞在 DQUEUE 这个命令中。伪代码如下:
int main()
{
int fd;

fd = open_camer_device();

init_camer_device(fd);

start_capturing(fd);

mainloop(fd);


/****************************************************************/
stop_capturing(fd);
uninit_camer_device(fd);
close_camer_device(fd);
/****************************************************************/



fd = open_camer_device();

init_camer_device(fd);/*这一句里面,设置了不同的参数*/

start_capturing(fd);

mainloop(fd);


stop_capturing(fd);
uninit_camer_device(fd);
close_camer_device(fd);



printf("ok\n");
return 0;

}

int init_camer_device(int fd)
{
struct v4l2_fmtdesc fmt;
struct v4l2_capability cap;
struct v4l2_format stream_fmt;
int ret;
static int iNum =0;
memset(&fmt,0,sizeof(fmt));
fmt.index = 0;
fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;

while((ret = ioctl(fd,VIDIOC_ENUM_FMT,&fmt)) == 0)
{
    fmt.index ++ ;

    printf("{pixelformat = %c%c%c%c},description = '%s'\n",
            fmt.pixelformat & 0xff,(fmt.pixelformat >> 8)&0xff,
            (fmt.pixelformat >> 16) & 0xff,(fmt.pixelformat >> 24)&0xff,
            fmt.description);
}

ret = ioctl(fd,VIDIOC_QUERYCAP,&cap);
if(ret < 0){
    perror("FAIL to ioctl VIDIOC_QUERYCAP");
    exit(EXIT_FAILURE);
}

if(!(cap.capabilities & V4L2_BUF_TYPE_VIDEO_CAPTURE))
{
    printf("The Current device is not a video capture device\n");
    exit(EXIT_FAILURE);
}

if(!(cap.capabilities & V4L2_CAP_STREAMING))
{
    printf("The Current device does not support streaming i/o\n");
    exit(EXIT_FAILURE);
}

stream_fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;

** stream_fmt.fmt.pix.width = 680;
stream_fmt.fmt.pix.height = 480;
if(iNum == 1)
{

printf("aaaaaaaaaa");
stream_fmt.fmt.pix.width = 100;
stream_fmt.fmt.pix.height = 100;
}
iNum++;**
stream_fmt.fmt.pix.pixelformat = V4L2_PIX_FMT_YUYV;
stream_fmt.fmt.pix.field = V4L2_FIELD_INTERLACED;

if(-1 == ioctl(fd,VIDIOC_S_FMT,&stream_fmt))
{
    perror("Fail to ioctl");
    exit(EXIT_FAILURE);
}

init_mmap(fd);

return 0;

}

这个程序就是重复了两次,而且前后两次没有一点关系,是重新打开了摄像头,重新申请内核内存,重新映射,为啥改了分辨率,程序就会阻塞在select,也就是说,没有新的流进入缓冲区了。?

  • 写回答

1条回答 默认 最新

  • zzkjliu 2015-05-18 00:56
    关注

    分析一下linux核心的 V4l2源代码,

    评论

报告相同问题?

悬赏问题

  • ¥15 MATLAB怎么通过柱坐标变换画开口是圆形的旋转抛物面?
  • ¥15 寻一个支付宝扫码远程授权登录的软件助手app
  • ¥15 解riccati方程组
  • ¥15 display:none;样式在嵌套结构中的已设置了display样式的元素上不起作用?
  • ¥15 使用rabbitMQ 消息队列作为url源进行多线程爬取时,总有几个url没有处理的问题。
  • ¥15 Ubuntu在安装序列比对软件STAR时出现报错如何解决
  • ¥50 树莓派安卓APK系统签名
  • ¥65 汇编语言除法溢出问题
  • ¥15 Visual Studio问题
  • ¥20 求一个html代码,有偿