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
直接播放设备。或者mpv
、vlc
等播放器应该也可以。
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