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

使用示例

查看虚拟视频设备

回环虚拟视频设备可以使用以下任何一种方式进行测试查看:

  • ffplayffmpeg 的一部分),
  • mpv
  • gst-launchgstreamer 的一部分)
$ 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-ctlv4l-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为物理摄像头,video10video11为虚拟出来的摄像头。

动态管理设备

添加新的虚拟设备:

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 是一个强大的工具,适用于需要虚拟摄像头或视频流共享的场景,尤其在视频会议、测试和开发中非常实用。