我正在尝试在linux中设置捕获图像的属性。
例如:
格式,宽度,高度,可通过以下方式实现:
VIDIOC_S_FMT/VIDIOC_G_FMT + struct v4l2_format fmt;
但是,我在获取/设置更多详细信息参数时被阻止:
喜欢H264 key-frame period
。
我发现有api可以达到目标。 这是v4l2_ext_controls,v4l2-ext-control和VIDIOC_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
的其他相机?
答案 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/