Linux (v4l) 网络摄像头 - 使设置“保留”

Linux (v4l) 网络摄像头 - 使设置“保留”

我的 Logitech 摄像头 (C300) 被正确检测到并出现在 /dev/video0 中。但是,默认情况下,图像的对比度和饱和度设置为最大,这大大降低了图像质量。我可以使用 guvcview 更改设置,但退出后设置恢复正​​常(我使用 mplayer 来捕获帧)。如何使我在 guvcview 中所做的更改永久生效?

编辑:

看起来 guvcview 的设置确实“粘性”——如果我再次打开它,图像保持不变。所以这是其他程序对网络摄像头的初始化所做的操作(mplayer 和 vlc 上也有同样的问题)

答案1

首先是坏消息:目前据我所知,任何发行版中都没有内置的解决方案可以解决这个问题。

好消息是,这样的解决方案非常容易实现,并且可以适用于许多类似的问题:我们只需要使用一点 udev 和 bash。

首先,我们需要一种编程(脚本友好)的方式来设置这些设置。我最喜欢的是v4l2ctrl,因为它可以保存 V4L2 配置,然后根据需要恢复它们。例如:

  1. 首先用你喜欢的任何程序更改相机设置。我强烈推荐 qv4l2,它太棒了。
  2. 然后,将相机设置保存到文件中。(-d /dev/video0是可选的,但如果您有多个相机则很有用。)

    v4l2ctrl -d /dev/video0 -s camera-settings.txt
    
  3. 如果拔下并再次插入,设置将丢失,但现在我们可以恢复它们:

    v4l2ctrl -d /dev/video0 -l camera-settings.txt
    

一旦让它像这样工作,就该使用 udev 来自动化它了。为此,我们将创建一个与相机匹配的规则文件。该文件可以调用/etc/udev/rules.d/99-v4l2-default-settings.rules并包含以下内容:

SUBSYSTEM=="video4linux", ATTR{name}=="HD Pro Webcam C920", RUN+="/etc/camera-defaults/udev-hook.sh"

每当检测到或拔出制造商名称为“HD Pro Webcam C920”的/etc/camera-defaults/udev-hook.sh 子系统设备时,上述脚本将以 root 身份运行我们即将创建的脚本。video4linux

我们可以为规则添加许多不同的过滤器。您可以使用它们udevadm info -a -p $(udevadm info -q path -n /dev/video0)来获取设备及其父设备的所有可能变量。

最后,创建脚本。下面是一些可以工作的简单脚本。赋予其执行权限!

#!/bin/bash
set -eu

# Useful for debugging, if you want to check what variables are available:
# set > /tmp/vars

if [ "$ACTION" == "add" ]; then
  v4l2ctrl -d "$DEVNAME" -l "/etc/camera-defaults/camera-settings.txt"
fi

移至camera-settings.txt指定目录,拔下并重新插入。该文件中的设置应该已成功恢复。

将来任何时候您需要永久保存您的设置,使用您最喜欢的程序来调整它们,然后运行:

v4l2ctrl -s /etc/camera-defaults/camera-settings.txt

答案2

我按照以下步骤修复了类似的问题(改编自来源):

$ sudo apt-get install mercurial
$ hg clone http://linuxtv.org/hg/v4l-dvb
$ cd v4l-dvb
$ sudo make menuconfig <-- dont change anything, just "Exit" and save changes
$ sudo emacs v4l/.config <-- change CONFIG_DVB_FIREDTV=m to CONFIG_DVB_FIREDTV=n
$ make
$ sudo make install
$ v4l2ucp <-- Auto Gain off

相关内容