树莓派4使用的USB摄像头能否修改ID_V4L_PRODUCT等设备属性?
问题背景
你在树莓派4上使用ELP品牌的USB摄像头,希望修改ID_V4L_PRODUCT、ID_VENDOR、ID_MODEL这类udev属性,实现多摄像头接入时Qt程序可以自动识别适配。
可行方案
上述属性默认是udev服务从摄像头硬件的USB描述符中读取后动态生成的,有两种方案可以满足需求,优先推荐第一种无需修改硬件的方案:
方案1:通过udev规则自定义/覆盖属性(推荐)
udev支持通过自定义规则给指定硬件覆盖原有属性、甚至新增自定义属性,操作无风险,适配灵活:
- 首先提取目标摄像头的唯一匹配标识,从你提供的设备信息可以获取到该款摄像头的固定硬件标识:
- 厂商ID(VID):
32e4 - 产品ID(PID):
4689 - 设备序列号:
2020042001
同型号批量摄像头可以用VID+PID匹配,单台特定摄像头可以用序列号精准匹配。
- 厂商ID(VID):
- 新建自定义udev规则文件:
/etc/udev/rules.d/99-custom-usb-cam.rules - 写入规则示例,可按需修改属性值,也可以新增自定义属性方便Qt程序识别:
# 匹配对应摄像头,覆盖原有属性 SUBSYSTEM=="video4linux", ID_VENDOR_ID=="32e4", ID_MODEL_ID=="4689", ENV{ID_V4L_PRODUCT}="ELP_1080P_CAM", ENV{ID_VENDOR}="ELP", ENV{ID_MODEL}="ELP_USB_CAM" # 也可以新增自定义属性,不用修改原有属性,适配更安全 SUBSYSTEM=="video4linux", ID_VENDOR_ID=="32e4", ID_MODEL_ID=="4689", ENV{CUSTOM_CAM_TYPE}="ELP_WIDE_ANGLE_1080P", MODE="0666" - 执行以下命令重载规则生效,也可以直接重新插拔摄像头:
sudo udevadm control --reload-rules sudo udevadm trigger - 验证修改结果:执行
udevadm info /dev/video1即可查看属性是否已经更新。
方案2:修改摄像头硬件USB描述符(不推荐)
部分ELP摄像头支持通过厂家提供的专属工具刷写固件,修改内置的USB厂商名、产品名、VID、PID等参数,修改后系统读取到的原生属性就是你修改后的值,但该操作有刷坏摄像头固件的风险,且不同型号工具不通用,非必要不建议使用。
Qt程序适配建议
你可以通过Qt调用libudev库读取摄像头的udev属性,无论是原有属性还是你自定义的属性都可以直接读取;也可以直接识别/dev/v4l/by-id/路径下的固定符号链接,该链接名包含设备序列号,不会随USB插入端口变化,也可以用来区分不同摄像头。
内容的提问来源于stack exchange,提问作者Lolix Dudu
相关产品推荐
相关产品推荐

