Linux内核模块之v4l2loopback虚拟视频设备
Linux内核模块之v4l2loopback虚拟视频设备
简介
v4l2loopback - a kernel module to create V4L2 loopback devices
This module allows you to create “virtual video devices”. Normal (v4l2) applications will read these devices as if they were ordinary video devices, but the video will not be read from e.g. a capture card but instead it is generated by another application. This allows you for instance to apply some nifty video effects on your Zoom video call… It also allows some more serious things (e.g. I’ve been using it to add streaming capabilities to an application by the means of hooking GStreamer into the loopback devices).
此模块允许你创建“虚拟视频设备”。正常的(v4l2)应用程序可以像读取普通视频设备一样读取这些虚拟设备,但视频不会从例如采集卡中读取,而是由另一个应用程序生成。这使你可以为你的 Zoom 视频通话应用一些炫酷的视频效果……它还可以实现一些更重要的功能(例如,我一直在通过将 GStreamer 集成到回环设备中来为一个应用程序添加流媒体功能)。
v4l2loopback
是一个 Linux 内核模块,用于创建虚拟视频设备。通过这些虚拟设备,用户可以将视频流从一个程序传递到另一个程序,模拟摄像头或共享物理摄像头的输出。
官方仓库: https://github.com/v4l2loopback/v4l2loopback
archlinux相关文档: https://wiki.archlinux.org.cn/title/V4l2loopback
功能与应用场景
v4l2loopback
的主要功能是创建虚拟摄像头设备(如 /dev/video0
),这些设备可以被常规的 V4L2 应用程序读取。常见应用包括:
- 在没有物理摄像头的情况下模拟摄像头。
- 将桌面录屏或视频文件作为虚拟摄像头输入。
- 让多个程序共享一个物理摄像头的视频流。
- 在视频会议中添加特效或滤镜。
安装与配置
安装驱动模块
- 使用包管理器安装:
sudo apt-get install v4l2loopback-dkms
- 也可以直接下载源码自己编译:
git clone https://github.com/v4l2loopback/v4l2loopback.git cd v4l2loopback make sudo make install
加载模块
加载 v4l2loopback
模块并创建虚拟设备:
sudo modprobe v4l2loopback
v4l2loopback
可以加载各种设备创建选项:
sudo modprobe v4l2loopback video_nr=9 card_label=Video-Loopback exclusive_caps=1
这里创建 /dev/video9
作为回环设备。exclusive_caps=1
对于某些基于 Chromium/WebRTC 的应用程序是必要的。这将启用 exclusive_caps
模式,该模式仅排他性地报告 CAPTURE/OUTPUT 功能。新创建的设备将仅声明 OUTPUT 功能(因此普通网络摄像头应用程序(包括 Chrome)将看不到它)。一旦您将生产者连接到设备,它将开始仅声明 CAPTURE 功能(因此拒绝打开具有除捕获之外其他功能的设备的应用程序也可以打开它)。更多选项可以在 官方文档 中找到。
可以通过使用 devices
参数创建多个回环设备。每个设备的选项通过逗号指定。
以下命令创建三个回环设备,/dev/video8
,/dev/video9
和第一个可用的 /dev/videoX
,所有设备都启用了 exclusive_caps
。
sudo modprobe v4l2loopback devices=3 video_nr=8,9 exclusive_caps=1,1,1 card_label="Loopback-1,Loopback-2,Loopback-3"
验证设备
检查虚拟设备是否创建成功:
#直接查看video设备节点,是否有多出虚拟设备
ls /dev/video*
#可以通过 v4l2-ctl
v4l2-ctl --list-devices
使用示例
查看虚拟视频设备
回环虚拟视频设备可以使用以下任何一种方式进行测试查看:
ffplay
(ffmpeg
的一部分),mpv
gst-launch
(gstreamer
的一部分)
$ ffplay /dev/video0
$ mpv av://v4l2:/dev/video0
$ gst-launch-1.0 -v v4l2src device=/dev/video0 ! glimagesink
模拟摄像头
使用 ffmpeg 将桌面录屏推送到虚拟摄像头:
ffmpeg -f x11grab -r 15 -s 1280x720 -i :0.0 -vcodec rawvideo -pix_fmt yuv420p -f v4l2 /dev/video0
共享物理摄像头
使用v4l2-ctl将物理摄像头的视频流输出到虚拟设备:
sudo v4l2-ctl --stream-mmap --stream-to=/dev/video1 --stream-from=/dev/video0
现在,多个程序可以同时打开虚拟摄像头设备/dev/video1
,并读取摄像头的视频流。
这里,v4l2-ctl
由v4l-utils
工具包提供,video0
为物理摄像头,video1
为虚拟摄像头,需根据情况和需求自行调整。
使用ffmpeg将物理摄像头的视频流copy到虚拟设备:
ffmpeg -f video4linux2 -s 640x480 -r 30 -i /dev/video0 -vcodec copy -f v4l2 /dev/video10 -vcodec copy -f v4l2 /dev/video11
这里,video0
为物理摄像头,video10
和video11
为虚拟出来的摄像头。
动态管理设备
添加新的虚拟设备:
sudo v4l2loopback-ctl add -n "Virtual Camera" /dev/video2
动态删除虚拟设备:
sudo v4l2loopback-ctl delete /dev/video2
这里需要使用v4l2loopback-ctl
工具,可以直接安装v4l2loopback-utils
工具包,或者通过v4l2loopback
源码手动编译:cd utils && make && sudo make install
。
更多用法
更多使用Example可参看官方wiki:
https://github.com/v4l2loopback/v4l2loopback/wiki
注意事项
- 如果系统启用了安全启动(Secure Boot),可能需要禁用安全启动或对模块进行签名。
- 确保内核版本与模块兼容,避免加载失败。
- 可以通过
/etc/modules-load.d/
和/etc/modprobe.d/
配置文件设置模块的自动加载和默认选项。
小结
v4l2loopback 是一个强大的工具,适用于需要虚拟摄像头或视频流共享的场景,尤其在视频会议、测试和开发中非常实用。