日期:2014-05-16  浏览次数:20740 次

v4l2输出格式的问题
内核的v4l2驱动应该没有问题 只能输出mjpeg格式的 调用ioctl VIDIOC_S_FMT 
memset ( &fmt, 0, sizeof(fmt) );
fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
        fmt.fmt.pix.pixelformat = V4L2_PIX_FMT_YUYV;
fmt.fmt.pix.width = 640;
        fmt.fmt.pix.height =480;
fmt.fmt.pix.field       = V4L2_FIELD_INTERLACED;
if (ioctl(fd_v4l, VIDIOC_S_FMT, &fmt) < 0)
        {
                printf("set format failed\n");
perror("fmt");
                return 0;
        } 
但显示的是set format failed
fmt:invalid argument
若改成V4L2_PIX_FMT_MJPEG就能输出
问过摄像头的厂商他们说输出的是yuy2也就是yuyv格式的
------解决方案--------------------
你还是枚举一下摄像头支持的格式吧:
struct v4l2_fmtdesc fmt;
int len = 0;
memset(&fmt, 0, sizeof(fmt));
fmt.index = 0;
fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
while ((ret = ioctl(dev, VIDIOC_ENUM_FMT, &fmt)) == 0) {
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);
   }
你还可以获取到每种格式支持的分辨率,帧率是多少,可参考 luvcview
感觉你的V4L2跑在嵌入式系统上或usb2.0设备跑在usb1.1,才有出现有些格式不支持全面情况。