Linux上使用V4L2摄像头

目标

Linux下查看摄像头画面,录制摄像头画面。

V4L内核模块

Video for Linux (V4L),现在已经是V4L2了,V4L2是Linux内核中用于视频设备的API。它提供了一种标准化的方式来访问视频设备,如摄像头、电视调谐器等。

没有安装V4L模块之前是看不到 /dev/video* 设备的, 通过命令

ls /dev/video*
zsh: no matches found: /dev/video*

尝试加载v4l2loopback

sudo modprobe v4l2loopback

提示

modprobe: FATAL: Module v4l2loopback not found in directory /lib/modules/6.1.0-18-amd64

看样子没安装,尝试安装v4l2loopback

sudo apt-get install v4l2loopback-dkms

之后再modprobe,如果这边提示

modprobe: ERROR: could not insert 'v4l2loopback': Key was rejected by service

则是启用了SecureBoot,需要对模块签名才能加载。

签名问题

如果没有上面提示,则直接跳过签名部分。

签名问题的解决方案是关闭SecureBoot或者自签名模块。这里只讨论自签名。

mokutil

mokutil是一个用于管理MOK(Machine Owner Key)列表的工具。MOK是UEFI Secure Boot的一部分,用于允许用户添加自定义密钥以签名内核模块。

确认一下SecureBoot状态

sudo mokutil --sb-state
SecureBoot enabled

注册dkms证书到MOK管理器

sudo mokutil --import /var/lib/dkms/mok.pub

重启系统后,会进入 MOK 管理界面,选择 “Enroll MOK”,注册证书,供内核信任。

UVC内核模块

v4l2loopback加载成功了。现在可以看到设备/dev/video0了。 但是貌似/dev/video0不是usb摄像头,而是虚拟摄像头。 安装v4l-utils来查看摄像头信息。

sudo apt-get install v4l-utils
v4l2-ctl --list-devices
Dummy video device (0x0000) (platform:v4l2loopback-000):
        /dev/video0

尝试加载uvc驱动,再次查看设备

sudo modprobe uvcvideo
v4l2-ctl --list-devices
Dummy video device (0x0000) (platform:v4l2loopback-000):
        /dev/video0

Microsoft® LifeCam HD-6000 for (usb-0000:00:14.0-8):
        /dev/video1
        /dev/video2
        /dev/media0

USB摄像头出来了。 如果查看内容,可以用ffplay直接播放设备。或者mpvvlc等播放器应该也可以。

ffplay /dev/video1

可以看到摄像头画面,是YUYV格式的

使用ffmpeg可以方便的录制视频。

ffmpeg -f v4l2 -i /dev/video1 -c:v libx264 -preset ultrafast -tune zerolatency -f flv camera.flv

最后修改于 2025-05-08