如何强制 Empathy Internet Messaging 更改默认网络摄像头?

如何强制 Empathy Internet Messaging 更改默认网络摄像头?

我最近刚买了一个新的网络摄像头。它是 USB 供电的。出于个人原因,我不想使用上网本自带的网络摄像头。

我想使用这个新版本。我喜欢 empathy,它是一款很棒的聊天客户端。但是,我似乎无法将 empathy 中的默认网络摄像头从内置网络摄像头切换到我刚买的那个。

那么,有没有办法强制 empathy 使用 USB 供电的网络摄像头,而不是内置网络摄像头?

让我们排除一些选项。

  1. 我尝试了 gstreamer-properties 方法、root 和普通用户。没用。

  2. 我也尝试了配置编辑器方法,试图手动更改网络摄像头的默认值。

  3. 我也尝试将内置网络摄像头驱动程序列入黑名单,但我的第二个网络摄像头也运行相同的驱动程序,因此该选项毫无意义,因为它禁用了两个网络摄像头,而不是我需要使用的那个。

答案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。

相关内容