WSL下用OpenCV调用USB摄像头遇select() timeout及usb未实现错误
问题:WSL2中usbipd_win+UVC内核编译后OpenCV调用摄像头超时
错误现象
OpenCV运行时抛出超时警告:
[ WARN:0@30.423] global cap_v4l.cpp:1119 tryIoctl VIDEOIO(V4L2:/dev/video0): select() timeout.
dmesg日志输出
usb usb1: Not yet implemented usb usb1: Not yet implemented ... repeated "Not yet implemented" and "callbacks suppressed lines" usb usb1: Not yet implemented usb usb1: Not yet implemented usb usb1: Not yet implemented usb usb1: Not yet implemented usb usb1: Not yet implemented vhci_hcd: unlink->seqnum 26060 vhci_hcd: the urb (seqnum 26060) was already given back vhci_hcd: unlink->seqnum 26065 vhci_hcd: the urb (seqnum 26065) was already given back uvcvideo 1-1:1.1: Failed to resubmit video URB (-1). vhci_hcd: unlink->seqnum 26067 vhci_hcd: the urb (seqnum 26067) was already given back vhci_hcd: unlink->seqnum 26071 vhci_hcd: the urb (seqnum 26071) was already given back vhci_hcd: unlink->seqnum 26073 vhci_hcd: the urb (seqnum 26073) was already given back
系统信息
uname -a输出:
Linux LAPTOP-0KQUO0A2 5.15.83.1-microsoft-standard-WSL2+ #1 SMP ...
解决步骤
校验内核UVC补丁兼容性
你当前使用的5.15.83内核可能存在usbip/vhci与UVC的适配问题,建议切换到WSL2官方最新稳定内核(或5.15.x后续版本),重新编译时确保以下配置项正确启用:CONFIG_USBIP_VHCI_HCDCONFIG_USB_VIDEO_CLASS及所有依赖子选项
注意补丁必须与内核版本严格匹配,避免因版本不兼容出现Not yet implemented报错。
重置usbipd设备连接
- 以管理员权限打开Windows命令行,执行:
usbipd wsl unbind --busid <你的摄像头总线ID> usbipd wsl bind --busid <你的摄像头总线ID> - 重启WSL2:
wsl --shutdown,重新进入后再测试摄像头。
- 以管理员权限打开Windows命令行,执行:
强制指定OpenCV摄像头参数
在代码中手动设置分辨率、帧率,避免自动协商失败:import cv2 cap = cv2.VideoCapture(0) cap.set(cv2.CAP_PROP_FRAME_WIDTH, 640) cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 480) cap.set(cv2.CAP_PROP_FPS, 30)也可先用V4L2工具验证摄像头可用性:
v4l2-ctl --list-formats-ext v4l2-ctl --set-fmt-video=width=640,height=480,pixelformat=YUYV --stream-mmap --stream-count=10更换内核版本解决vhci驱动bug
如果urb already given back报错持续存在,说明当前内核的vhci_hcd驱动存在URB处理逻辑缺陷,建议升级到5.19或6.x系列的WSL2内核,这类版本对usbip的兼容性更好。
内容的提问来源于stack exchange,提问作者jay jayjay
相关产品推荐
相关产品推荐

