我最近刚买了一个新的网络摄像头。它是 USB 供电的。出于个人原因,我不想使用上网本自带的网络摄像头。
我想使用这个新版本。我喜欢 empathy,它是一款很棒的聊天客户端。但是,我似乎无法将 empathy 中的默认网络摄像头从内置网络摄像头切换到我刚买的那个。
那么,有没有办法强制 empathy 使用 USB 供电的网络摄像头,而不是内置网络摄像头?
让我们排除一些选项。
我尝试了 gstreamer-properties 方法、root 和普通用户。没用。
我也尝试了配置编辑器方法,试图手动更改网络摄像头的默认值。
我也尝试将内置网络摄像头驱动程序列入黑名单,但我的第二个网络摄像头也运行相同的驱动程序,因此该选项毫无意义,因为它禁用了两个网络摄像头,而不是我需要使用的那个。
答案1
我认为您想要的是 udev 规则。
我使用的是 12.04,所以您的情况可能会有所不同,但这里有一个例子:
您想要更改开关 /dev/video1 和 /dev/video0。首先获取所需的信息:
udevadm info -a -p $(udevadm info -q path -n /dev/video0)
udevadm info -a -p $(udevadm info -q path -n /dev/video1)
将这两个大段文本复制到 gedit 中,
我的情况如下:
查看设备'/devices/pci0000:00/0000:00:12.2/usb1/1-1/1-1:1.0/video4linux/video0': 内核==“video0” 子系统==“video4linux” 司机==“” ATTR{name}=="USB2.0 电脑摄像头" ATTR{索引}=="0" 查看父设备'/devices/pci0000:00/0000:00:12.2/usb1/1-1/1-1:1.0': 内核==“1-1:1.0” 子系统==“usb” 驱动程序==“uvcvideo” ATTRS{bInterfaceNumber}=="00" ATTRS{bAlternateSetting}==" 0" ATTRS{bNumEndpoints}=="01" ATTRS{bInterfaceClass}=="0e" ATTRS{bInterfaceSubClass}=="01" ATTRS{bInterfaceProtocol}=="00" ATTRS{supports_autosuspend}=="1" ATTRS{iad_bFirstInterface}=="00" ATTRS{iad_bInterfaceCount}=="02" ATTRS{iad_bFunctionClass}=="0e" ATTRS{iad_bFunctionSubClass}=="03" ATTRS{iad_bFunctionProtocol}=="00" 查看父设备'/devices/pci0000:00/0000:00:12.2/usb1/1-1': 内核==“1-1” 子系统==“usb” 驱动程序==“usb” ATTRS{配置}=="" ATTRS{bNumInterfaces}==" 4" ATTRS{bConfigurationValue}=="1" ATTRS{bmAttributes}=="80" ATTRS{bMaxPower}=="320mA" ATTRS{urbnum}=="5064" ATTRS{idVendor}=="18ec" ATTRS{idProduct}=="3299" ATTRS{bcdDevice}=="0100" ATTRS{bDeviceClass}=="ef" ATTRS{bDeviceSubClass}=="02" ATTRS{bDeviceProtocol}=="01" ATTRS{bNumConfigurations}=="1" ATTRS{bMaxPacketSize0}=="64" ATTRS{速度}=="480" ATTRS{总线编号}=="1" ATTRS{devnum}=="14" ATTRS{devpath}=="1" ATTRS{版本}==" 2.00" ATTRS{maxchild}=="0" ATTRS{quirks}=="0x0" ATTRS{avoid_reset_quirk}=="0" ATTRS{授权}=="1" ATTRS{制造商}=="ARKMICRO" ATTRS{product}=="USB2.0 电脑摄像头" 查看父设备'/devices/pci0000:00/0000:00:12.2/usb1': 内核==“usb1” 子系统==“usb” 驱动程序==“usb” ATTRS{配置}=="" ATTRS{bNumInterfaces}==" 1" ATTRS{bConfigurationValue}=="1" ATTRS{bmAttributes}=="e0" ATTRS{bMaxPower}==" 0mA" ATTRS{urbnum}=="324" ATTRS{idVendor}=="1d6b" ATTRS{idProduct}=="0002" ATTRS{bcdDevice}=="0302" ATTRS{bDeviceClass}=="09" ATTRS{bDeviceSubClass}=="00" ATTRS{bDeviceProtocol}=="00" ATTRS{bNumConfigurations}=="1" ATTRS{bMaxPacketSize0}=="64" ATTRS{速度}=="480" ATTRS{总线编号}=="1" ATTRS{devnum}=="1" ATTRS{devpath}=="0" ATTRS{版本}==" 2.00" ATTRS{maxchild}=="6" ATTRS{quirks}=="0x0" ATTRS{avoid_reset_quirk}=="0" ATTRS{授权}=="1" ATTRS{制造商}=="Linux 3.2.0-22-通用 ehci_hcd" ATTRS{product}=="EHCI 主机控制器" ATTRS{序列号}=="0000:00:12.2" ATTRS{authorized_default}=="1" 查看父设备'/devices/pci0000:00/0000:00:12.2': 内核==“0000:00:12.2” 子系统==“pci” 驱动程序==“ehci_hcd” ATTRS{供应商}=="0x1002" ATTRS{设备}=="0x4396" ATTRS{子系统供应商}=="0x1043" ATTRS{子系统设备}=="0x8389" ATTRS{class}=="0x0c0320" ATTRS{irq}=="17" ATTRS{local_cpus}=="00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,0000000f" ATTRS{local_cpulist}=="0-3" ATTRS{numa_node}=="0" ATTRS{dma_mask_bits}=="32" ATTRS{consistent_dma_mask_bits}=="32" ATTRS{broken_parity_status}=="0" ATTRS{msi_bus}=="" ATTRS{companion}=="" ATTRS{uframe_periodic_max}=="100" 查看父设备'/devices/pci0000:00': 内核==“pci0000:00” 子系统=="" 司机==“”
您正在寻找与您的相机匹配的 lsusb 属性:
SUBSYSTEMS=="usb"
ATTRS{idVendor}=="firsthalf"
ATTRS{idProduct}=="secondhalf"
然后以 root 身份编辑您的/etc/udev/rules.d/25-video-device.rules
该名称相对随意。数字与首先解析的集合有关,但它会在许多 udev google 搜索中出现。我们就使用它吧。
我的样子如下:
SUBSYSTEMS=="usb", ATTRS{idVendor}=="18ec", ATTRS{idProduct}=="3298", NAME:="video0", OPTIONS:="link_priority=100"
SUBSYSTEMS=="usb", ATTRS{idVendor}=="090c", ATTRS{idProduct}=="c371", NAME:="video2"
保存文件
有些来源表明是 root service udev restart
,但我遇到了硬锁。因此只需在插入电源的情况下重新启动即可。
现在启动任何不允许您选择视频设备的东西。由于它们可能硬连线使用 /dev/video0,因此这应该“正常工作”。
无论出于什么原因,至少对我来说,它不会覆盖和取代现有的 video0,它只会创建两个文件(可能是设计使然)。你可以ln -sf /dev/video1 /dev/video0
。对于我来说,我以这种方式指定的设备似乎可以工作。我使用 guvcview 进行了测试。
恭喜,您刚刚编写了一个 udev 规则来克服硬编码的 url。
您也可以在这些 udev 规则的末尾指定运行命令。
SUBSYSTEMS=="usb", ATTRS{idVendor}=="18ec", ATTRS{idProduct}=="3298", NAME:="video0", OPTIONS:="link_priority=100", RUN+="ln -sf /dev/video1 /dev/video0"
SUBSYSTEMS=="usb", ATTRS{idVendor}=="090c", ATTRS{idProduct}=="c371", NAME:="video2"
现在您的 USB 视频占用了 /dev/video0 和 /dev/video1。您也不会丢失内置视频,因为它现在位于 /dev/video2。