Webcam 设置

来自 ArchWiki
(重定向自 Webcam

这是一份关于设置您的网络摄像头的指南。

大多数情况下,您的网络摄像头应该即插即用。访问视频设备(例如 /dev/video0)的权限由 udev 处理,无需任何配置。

加载

最新的网络摄像头大多数都符合 UVC (USB Video Class) 标准,并由通用的 uvcvideo 内核驱动模块支持。要检查您的网络摄像头是否被识别,请在插入网络摄像头后查看 日志。您应该看到类似这样的内容

kernel: sn9c102: V4L2 driver for SN9C10x PC Camera Controllers v1:1.24a
usb 1-1: SN9C10[12] PC Camera Controller detected (vid/pid 0x0C45/0x600D)
usb 1-1: PAS106B image sensor detected
usb 1-1: Initialization succeeded
usb 1-1: V4L2 device registered as /dev/video0
usb 1-1: Optional device control through 'sysfs' interface ready
usbcore: registered new driver sn9c102

一些 pre-UVC 网络摄像头也通过 gspca 内核驱动模块支持。请参阅 gspca 卡列表,以获取此框架下支持的设备的不完全列表。

否则,如果您的网络摄像头不受内核驱动程序支持,则需要外部驱动程序。第一步是使用例如 lsusb 识别网络摄像头的名称。然后您可以查看 网络摄像头设备,以获取有关网络摄像头的信息和资源。一旦找到与网络摄像头兼容的驱动程序,您可以在启动时加载模块

注意: 用于控制网络摄像头的 Linux 内核到用户空间 API 被称为 Video4Linux2,简称 v4l2。所有支持 v4l2 的应用程序都将与内核驱动程序一起工作。

配置

如果您想配置亮度、颜色和其他网络摄像头参数(例如,在开箱即用的颜色太蓝/红/绿的情况下),您可以使用各种应用程序。某些特定的网络摄像头,例如 Logitech Brio 或 Razer Kiyo Pro,可能需要特定的应用程序来配置它们的一些特定选项,例如 HDR。在配置 V4L 设置的应用程序中更改任何设置通常会更改使用这些摄像头的全部应用程序的设置,除非它们自行覆盖这些设置。

命令行

v4l-utils 安装了一个命令行工具 v4l2-ctl。列出所有视频设备:

$ v4l2-ctl --list-devices

列出视频设备的可配置设置:

$ v4l2-ctl -d /dev/video0 --list-ctrls

您可以通过执行以下操作来更改视频设备的设置:

$ v4l2-ctl -c brightness=128

或者,您可以使用 cameractrls

$ cameractrls -c brightness=128

图形界面

对于通用的图形化网络摄像头配置工具,您可以使用来自 v4l-utilsqv4l2guvcview。此外,cameractrls 包含 cameractrlsgtk4,除了支持所有其他 v4l 选项外,它还允许您为 Logitech Brio 以及 Razer Kiyo Pro 配置一些相机特定的功能。

持久化配置更改

通过 V4L2 进行的配置在网络摄像头断开并重新连接后不会持久存在。可以使用带有 Udev 规则的 v4l2-ctl,以便在每次连接特定摄像头时设置一些配置。

例如,要在每次连接特定的 Logitech 网络摄像头时设置默认缩放设置,请添加类似这样的 udev 规则

/etc/udev/rules.d/99-logitech-default-zoom.rules
SUBSYSTEM=="video4linux", KERNEL=="video[0-9]*", ATTR{index}=="0", ATTRS{idVendor}=="046d", ATTRS{idProduct}=="0892", RUN+="/usr/bin/v4l2-ctl -d $devnode --set-ctrl=zoom_absolute=170"

上面的规则适用于 Logitech C920 HD Pro Webcam - 硬件 ID 046d:0892。

设备的供应商 ID 和产品 ID 可以使用 lsusb 找到。这些 ID 每个产品都是唯一的,除非产品获得新的硬件修订版,否则不会更改。

要查找 udev 属性(如产品名称和序列号),请参阅 Udev#列出设备的属性。也可以为视频设备设置静态名称)。

禁用笔记本电脑内置摄像头

有时我们可能想要禁用笔记本电脑的内置摄像头,以便只显示通过 USB 连接的摄像头。这可以通过 udev 规则完成。首先,我们需要设备的供应商 ID 和产品 ID

$ lsusb
Bus 001 Device 008: ID 1bcf:28c1 Sunplus Innovation Technology Inc. Integrated_Webcam_HD

然后我们添加新的 udev 规则,以便在检测到设备时立即移除它

/etc/udev/rules.d/40-disable-internal-webcam.rules
ACTION=="add", ATTR{idVendor}=="1bcf", ATTR{idProduct}=="28c1", RUN="/bin/sh -c 'echo 1 >/sys/\$devpath/remove'"

完全禁用摄像头

要完全禁用摄像头,您可以黑名单 uvcvideo 内核模块。例如

/etc/modprobe.d/nowebcam.conf
blacklist uvcvideo

应用程序

另请参阅 应用程序列表/多媒体#网络摄像头

xawtv

这是一个基本的 Video4Linux2 设备查看器,虽然它旨在与电视调谐器卡一起使用,但它也可以很好地与网络摄像头配合使用。它将在窗口中显示您的网络摄像头看到的内容。

安装 xawtvAUR 并使用以下命令运行它:

$ xawtv -c /dev/video0

如果出现错误,请参阅 #使用 NVIDIA 显卡的 xawtv

VLC

VLC 也可以用于查看和录制您的网络摄像头。在 VLC 的媒体菜单中,打开捕获设备...对话框并输入视频和音频设备文件。或者从命令行,例如

$ vlc v4l2://:input-slave=alsa://:v4l-vdev="/dev/video0"

这将使 VLC 镜像您的网络摄像头。

  • 要拍摄静止图像,只需在视频菜单中选择快照
  • 要录制流,请向命令行添加 --sout 参数,例如
$ vlc v4l://:v4l-vdev="/dev/video0":v4l-adev="/dev/audio2" --sout "#transcode{vcodec=mp1v,vb=1024,scale=1,acodec=mpga,ab=192,channels=2}:duplicate{dst=std{access=file,mux=mpeg1,dst=/tmp/test.mpg}}"

请注意,默认情况下这不会显示视频。为了看到您正在录制的内容,您需要将显示器添加为参数的目标(这将减慢操作速度)

... :duplicate{dst=display,dst=std{access= ....
注意: 如果 VLC 未检测到网络摄像头,请确保已安装 zvbi 软件包。

MPlayer

要使用 MPlayer 从您的网络摄像头拍摄快照,请从终端运行此命令:

$ mplayer tv:// -tv driver=v4l2:width=640:height=480:device=/dev/video0 -fps 15 -vf screenshot

从这里您必须按 s 才能拍摄快照。快照将以 shotXXXX.png 的形式保存在当前文件夹中。如果您想连续录制视频:

$ mencoder tv:// -tv driver=v4l2:width=640:height=480:device=/dev/video0:forceaudio:adevice=/dev/dsp -ovc lavc -oac mp3lame -lameopts cbr:br=64:mode=3 -o filename.avi

Ctrl+c 结束录制。

要使用 MJPEG 作为像素格式而不是默认格式(在大多数情况下为 YUYV)播放视频,您可以使用以下命令运行 MPlayer

$ mplayer tv:// -tv driver=v4l2:width=640:height=480:device=/dev/video0:outfmt=mjpeg -fps 15

mpv

要使用 mpv 从您的网络摄像头拍摄快照,请从终端运行此命令:

$ mpv av://v4l2:/dev/video0 --profile=low-latency --untimed

从这里您必须按 s 才能拍摄快照。快照将以 mpv-shotNNNN.jpg 的形式保存在当前文件夹中。

要使用 MJPEG 作为像素格式而不是默认格式(在大多数情况下为 YUYV),您可以改为运行以下命令:

$ mpv --demuxer-lavf-format=video4linux2 --demuxer-lavf-o-set=input_format=mjpeg av://v4l2:/dev/video0

在某些情况下,这可以显着提高质量和性能(例如,5FPS -> 30FPS)。

要调整网络摄像头设置,包括分辨率,请参阅 mpv 文档

FFmpeg

有关各种示例,请参阅 v4l2loopback#用例,其中 FFmpeg 用于将视频输出到可以用作网络摄像头的 v4l2 设备。

对于没有网络摄像头的笔记本电脑,IP 摄像头可以用作 droidcam 的替代品,后者不会让额外的网络摄像头设备挂起。对于 Android,可以在手机上托管类似 IP Webcam 的应用,然后使用 IP 摄像头作为笔记本电脑的视频输入。首先,安装 linux-headersv4l2loopback-dkms,然后使用 v4l2loopback 连接到视频源 /dev/video0,其中 192.168.1.xxx 是手机的 IP 地址:

# modprobe v4l2loopback exclusive_caps=1
$ ffmpeg -i http://192.168.1.xxx:8080/video -vf format=yuv420p -f v4l2 /dev/video0
注意: exclusive_caps=1 有助于解决视频输入在某些 Chrome/WebRTC 应用程序上不可用的问题 [1]

故障排除

V4L1 支持

Linux 内核 2.6.27 版本放弃了对旧版 Video4Linux (1) API 的支持。像素格式解码已被推送到用户空间,因为 Video4Linux 版本 2 不支持内核空间解码。libv4l 库为用户空间应用程序提供像素解码服务,并将被大多数程序使用。还有其他兼容性层可用。

如果您的设备已创建,但您的图像看起来很奇怪(例如,几乎完全是绿色),您可能需要这个。

如果应用程序具有 V4L2 支持但没有像素格式支持,请使用以下命令:

LD_PRELOAD=/usr/lib/libv4l/v4l2convert.so application

如果应用程序仅支持旧版本的 V4L,请使用此命令:

LD_PRELOAD=/usr/lib/libv4l/v4l1compat.so application
提示: 您可能还想在 /etc/profilexprofile 中放入类似以下内容的行,这样您就不必一直输入那么长的命令:export LD_PRELOAD=/usr/lib/libv4l/v4l2convert.soexport LD_PRELOAD=/usr/lib/libv4l/v4l1compat.so

对于 32 位 multilib 应用程序,安装 lib32-v4l-utils 软件包,并将上述命令中的 /usr/lib/libv4l/ 替换为 /usr/lib32/libv4l/

使用 NVIDIA 显卡的 xawtv

如果您正在使用 NVIDIA 显卡,并收到类似这样的错误:

X Error of failed request:  XF86DGANoDirectVideoMode
 Major opcode of failed request:  139 (XFree86-DGA)
 Minor opcode of failed request:  1 (XF86DGAGetVideoLL)
 Serial number of failed request:  69
 Current serial number in output stream:  69

您应该改为以 xawtv -nodga 运行它。

Microsoft Lifecam Studio/Cinema

在某些配置下,Microsoft lifecam studio/cinema 可能会请求过多的 usb 带宽并失败请参阅 Uvcvideo FAQ。在这种情况下,通过加载带有 quirks=0x80uvcvideo 驱动程序来更改缓冲。将其添加到 /etc/modprobe.d/uvcvideo.conf 中 

/etc/modprobe.d/uvcvideo.conf
## fix bandwidth issue for lifecam studio/cinema
options uvcvideo quirks=0x80
注意: 如果日志中可见延迟,或者摄像头周期性工作,则此解决方法通常应适用。更大的值(例如 quirks=0x100)是可能的。

Skype

在测试网络摄像头时,请注意以下事项:

  • 回声测试机器人不支持视频聊天。请勿使用它来测试您的网络摄像头。
  • Skype 可能会识别不同的视频/摄像头设备 (/dev/video*)。这些将在摄像头设置中的下拉菜单中列为类似集成摄像头...的内容。尝试每个摄像头并等待几秒钟,因为切换到不同的摄像头需要时间。

检查 USB 摄像头占用的带宽

当在单个 USB 总线上运行多个网络摄像头时,它们可能会使 USB 总线的带宽饱和并无法正常工作。您可以使用来自 usbtopAUR 软件包的 usbtop 工具来诊断此问题。

反转视频流

如果您的视频流是倒置的,您可以创建一个新的虚拟摄像头,该摄像头反转倒置的视频。您需要安装 v4l-utilsv4l2loopback-dkms。创建虚拟摄像头:

# modprobe v4l2loopback

检查新创建的摄像头的名称:

$ v4l2-ctl --list-devices
Dummy video device (0x0000) (platform:v4l2loopback-000):
   	/dev/video1

然后您可以运行 ffmpeg 以从您的实际网络摄像头(此处为 /dev/video0)读取,反转它并将其馈送到虚拟摄像头:

$ ffmpeg -f v4l2 -i /dev/video0 -vf "vflip" -f v4l2 /dev/video1

这里的 vflip 垂直反转视频流。使用 hflip 水平反转它。

请注意,可能需要格式参数 yuv420p 以避免错误,否则可能没有任何视频流,并且会显示黑屏 [2]。换句话说:

$ ffmpeg -f v4l2 -i /dev/video0 -vf "hflip,format=yuv420p" -f v4l2 /dev/video1

然后您可以在应用程序中使用“Dummy”摄像头代替“Integrated”摄像头。

图像质量差

如果您遇到图像太亮、太暗、曝光过度或任何其他问题,您可以安装 v4l2ucpAUR 来调整您的图像输出。

Logitech Quickcam Pro 9000

安装 libwebcam-gitAUR 以启用自动对焦控制。安装后,断开并重新连接您的摄像头以触发新添加的 udev 规则

Creality 摄像头

Creality 摄像头基于许多廉价 2MP 摄像头(USB ID 1d6c:0103)中使用的 Fullhan FH8852 芯片,但其固件需要一个特殊的序列才能启用它,否则您将获得黑屏。尝试使用 FFmpeg 抓取帧似乎可以正确初始化设备,使其在其他应用程序上工作。您可能必须在 /dev/video0/dev/video2 上尝试以下操作,并查看哪个产生正确的 /tmp/test_img.jpg 图像:

$ ffmpeg -i /dev/video0 /tmp/test_img.jpg

完成后,摄像头应在 Web 浏览器、Cheese 等应用程序上工作。