Video4linux2,获取/设置由Camera编码的图像属性

时间:2015-04-16 10:43:45

标签: h.264 v4l2

我正在尝试在linux中设置捕获图像的属性。

例如:

格式,宽度,高度,可通过以下方式实现:

VIDIOC_S_FMT/VIDIOC_G_FMT + struct v4l2_format fmt;

但是,我在获取/设置更多详细信息参数时被阻止:

喜欢H264 key-frame period

我发现有api可以达到目标。 这是v4l2_ext_controlsv4l2-ext-controlVIDIOC_G_EXT_CTRLS。 我试过了,但是在我的示例代码中没有用。

我的代码是这样的:

struct v4l2_ext_control extCtrl;

memset(&extCtrl, 0, sizeof(struct v4l2_ext_control));
extCtrl.id = V4L2_CID_MPEG_VIDEO_H264_I_PERIOD;
extCtrl.size = 0;
extCtrl.value = 2;

struct v4l2_ext_controls extCtrls;

extCtrls.controls = &extCtrl;
extCtrls.count = 1;
extCtrls.ctrl_class = V4L2_CTRL_CLASS_MPEG;


ret = ioctl(fd, VIDIOC_S_EXT_CTRLS, &extCtrls);

if (0 < ret)
{ 
    printf("VIDIOC_S_EXT_CTRLS setting (%s)\n", strerror(errno));
    return -3;
}/*if*/


ret = ioctl(fd, VIDIOC_G_EXT_CTRLS, &extCtrls);
 if (0 < ret)
{ 
    printf("VIDIOC_G_EXT_CTRLS setting (%s)\n", strerror(errno));
    return -4;
}/*if*/

printf("extCtrl.value = %d\n", extCtrl.value );

看起来很好,关键帧周期为2(extCtrl.value)。

但是当我用

ffplay -skip_frame nokey -i saved_raw_h264

关键帧周期显然远大于2.

愿任何人帮助我吗?

顺便说一句:Logitech C920,是我所知道的唯一一款支持消费市场h264输出的相机。

有没有人知道支持h264的其他相机?

1 个答案:

答案 0 :(得分:1)

假设您正确设置参数,Logitech C920 Linux驱动程序很可能忽略了一些(如果不是很多)通过V4L2传入的控制参数。你有C920的驱动源吗?或者它是否使用通用Linux USB相机驱动程序?您至少可以看到驱动程序支持哪些V4L2控件。

编辑
你有没有看到这些线程谈论为gstreamer添加C920支持? http://sourceforge.net/p/linux-uvc/mailman/linux-uvc-devel/thread/505D0DAE.7020907@collabora.co.uk/

http://kakaroto.homelinux.net/2012/09/uvc-h264-encoding-cameras-support-in-gstreamer/