【linux v4l2】关于 v4l2 select() timeout 这个问题

这个星期,我在 linux 环境驱动一个 usb 连接的 4K 800 万像素的摄像头,图像处理的代码倒是挺简单的,就是打开摄像头获取无损的帧图像比较费劲。

当然,开始之前我使用过 v4l2-ctl 命令查过最高支持的分辨率就是 3264 x 2448

v4l2-ctl --list-formats-ext -d /dev/video0

所以为了获得最高分辨率的帧图像,我就将帧的尺寸设置为了上面的比例数值。

首先,我是使用 opencv 去加载摄像头的,正常的代码也就是下面几行:

import cv2
capture = cv2.VideoCapture(-1)
capture.set(cv2.CAP_PROP_FRAME_WIDTH, 3264)
capture.set(cv2.CAP_PROP_FRAME_Height, 2448)
while True:
	is_success, frame = capture.read()
	if is_success:
		cv2.namedWindow('frame', cv2.WINDOW_NORMAL)
		cv2.imshow('frame', frame)
capture.release()
cv2.destroyAllWindows()

结果出现了下面的 timeout 的错误:

global cap_v4l.cpp:1119 tryIoctl VIDEOIO(V4L2:/dev/video0): select() timeout

权宜之计:MJPG 编码

这时候我去网上寻找解决方案,如果是将编码的格式设定成 MJPG 的话,就是加上下面这句话:

capture.set(6, cv2.VideoWriter.fourcc('M', 'J', 'P', 'G'))

就可以正常的捕获帧,输出视频了,但是这已经是经过压缩的图像,我想要的是无损的 YUYV 格式的图像,这就很难受了。我试过将分辨率降低,降到某个程度,确实也是能正常捕获的。

但是我的目的是:高分辨率无损 YUYV 格式的帧图像

另辟蹊径:ffplay 测试

我也尝试使用过下面语句来直接调用 video4linux2 捕获视频:

ffplay -f video4linux2 -input_format mjpeg -framerate 30 -video_size 3264*1836 /dev/video0
ffplay -f video4linux2 -input_format yuyv422 -video_size 2564*1836 /dev/video0
ffplay -f video4linux2 -input_format yuyv422 -video_size 3264*1836 /dev/video0

发现,第一和第二句是可以正常捕获的,但是第三句还是不行,应该就是 v4l2 的问题了。

amcap

百思不得其解,没有理由啊,为什么会出现 timeout 的,然后就去问厂家,厂家给我一个 amcap.exe 文件,我在 window 上使用了其中的拍照功能,虽然可能要等个 1 秒左右,但是人家确实给我输出了一张无损的 YUYV 格式的图片。

额,但是这什么也说明不了啊,opencv 的在 linux 和 window 和摄像头的交互接口完全不一样,linux 是通过 video4linux2, 而 window 是通过 DirectShow,我感觉一顿操作下来,一无所获。

唯一知道的是,问题估计出在 v4l2 上面,要么就是缓存区太小了,要么就是 usb 接口的带宽太小了,要么就是 timeout 的时间设置得太短了。

总结

感觉现在也没啥特别好的解决方案,如果不要无损图片的话,编码成 MJPG 也不失为一种方法,起码帧图像可以正常的采集,分辨率也能够满足要求,就是经过了压缩。可能后面会按照 v4l2 的流程,自己写一段 c++ 的代码来捕获帧图像吧。

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
v4l2是一个视频捕获和处理设备的接口,在某些情况下,当使用rk3588芯片进行视频捕获和处理时,可能会遇到"v4l2 select timeout rk3588"的错误。 "v4l2 select timeout rk3588"意味着在进行视频捕获或处理时,系统无法在规定的时间内获取到所需的数据。这可能是由于以下几个原因导致的: 1.硬件故障:该错误可能是由于rk3588芯片本身或与之相关的硬件设备出现故障所导致的。这可能需要检查芯片或相关设备的连接和功能是否正常。 2.驱动问题:该错误也可能是由于驱动程序的问题所引起的。请确保你所使用的驱动程序与rk3588芯片兼容,并且是最新版本。 3.设置错误:在使用v4l2接口进行视频捕获和处理时,可能需要正确配置一些参数,如分辨率、帧率等。如果这些参数设置不正确,可能会导致超时错误。请检查你的配置是否正确。 4.系统资源不足:如果系统资源不足,如处理器负载过高或内存不足,也可能导致超时错误。在此情况下,你可以尝试减少其他程序的运行,以提供足够的资源给v4l2接口。 总之,"v4l2 select timeout rk3588"错误可能有多种原因导致,如硬件故障、驱动问题、设置错误或系统资源不足。你可以通过检查硬件连接、更新驱动程序、正确配置参数以及提供足够的系统资源来解决该错误。如果问题仍然存在,建议你联系技术支持或查阅相关文档以获取更多帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值