主题 : 求帮忙:tiny6410的V4L2编程问题 复制链接 | 浏览器收藏 | 打印
级别: 新手上路
UID: 68309
精华: 0
发帖: 15
金钱: 75 两
威望: 15 点
综合积分: 30 分
注册时间: 2012-04-21
最后登录: 2012-05-17
楼主  发表于: 2012-04-26 23:51

 求帮忙:tiny6410的V4L2编程问题

/* Set format */
    memset ( &codec_fmt, 0, sizeof(codec_fmt) );
        codec_fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
    codec_fmt.fmt.pix.width = 320;
    codec_fmt.fmt.pix.height = 240;    
    codec_fmt.fmt.pix.pixelformat = V4L2_PIX_FMT_YUYV;
        codec_fmt.fmt.pix.field = V4L2_FIELD_INTERLACED;
        //codec_fmt.fmt.pix.priv = 1;
        //printf("LCD_WIDTH = %d\n",codec_fmt.fmt.pix.width);
        //printf("LCD_HEIGHT = %d\n",codec_fmt.fmt.pix.height);

    ret = ioctl(cam_c_fp , VIDIOC_S_FMT, &codec_fmt);
    if (ret < 0) {
        printf("V4L2 : ioctl on VIDIOC_S_FMT failled\n");
        exit(1);
    }

做了一个视频采集编码的,运行总是出错:V4L2 : ioctl on VIDIOC_S_FMT failled

关于格式我是上面那样设置的,但改来改去都不行~但是用友善之臂的“USB摄像头”程序是可以使用摄像头的。。

求高手帮忙,谢谢!!!
级别: 新手上路
UID: 68309
精华: 0
发帖: 15
金钱: 75 两
威望: 15 点
综合积分: 30 分
注册时间: 2012-04-21
最后登录: 2012-05-17
1楼  发表于: 2012-04-27 12:53
        memset ( &codec_fmt, 0, sizeof(codec_fmt) );
        codec_fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;

        ret = ioctl(cam_c_fp , VIDIOC_G_FMT, &codec_fmt);
    if (ret < 0) {
        printf("V4L2 : ioctl on VIDIOC_G_FMT failled\n");
        exit(1);
    }

    ret = ioctl(cam_c_fp , VIDIOC_S_FMT, &codec_fmt);
    if (ret < 0) {
        printf("V4L2 : ioctl on VIDIOC_S_FMT failled\n");
        exit(1);
    }

        改成这样就可以了。。但不知如何打印codec_fmt的那些信息。。。

    然后        
                /* read from camera device */
        if (read(cam_c_fp, g_yuv, YUV_FRAME_BUFFER_SIZE) < 0) {
            perror("read()");
        }

    这里出错了。。。等高手出现。。
级别: 新手上路
UID: 68309
精华: 0
发帖: 15
金钱: 75 两
威望: 15 点
综合积分: 30 分
注册时间: 2012-04-21
最后登录: 2012-05-17
2楼  发表于: 2012-04-27 13:47
        /*  Settings v4l2_fmtdesc */
        memset(&fmt, 0, sizeof(fmt));
        fmt.index = 0;
        fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
        while ((ret = ioctl(cam_c_fp, 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);
        }

        发现输出结果为:pixelformat = ”MJPG“,description = ”MJPEG“。。
        因为这样所以上面的read才会出错吗?
        是不是这样就不能使用yuvl了?
级别: 侠客
UID: 63868
精华: 0
发帖: 56
金钱: 280 两
威望: 56 点
综合积分: 112 分
注册时间: 2012-02-25
最后登录: 2015-04-28
3楼  发表于: 2012-05-09 19:33
说明你的摄像头是MJPG格式输出的,改成codec_fmt.fmt.pix.pixelformat = V4L2_PIX_FMT_MJPG;
级别: 荣誉会员
UID: 34761
精华: 0
发帖: 1348
金钱: 6835 两
威望: 1367 点
综合积分: 2696 分
注册时间: 2010-12-21
最后登录: 2017-06-02
4楼  发表于: 2012-05-10 00:39
楼上正解
级别: 新手上路
UID: 71606
精华: 0
发帖: 30
金钱: 150 两
威望: 30 点
综合积分: 60 分
注册时间: 2012-06-07
最后登录: 2012-06-28
5楼  发表于: 2012-06-14 21:24
mark