v4l2loopback 简单使用

2021年10月1日 · 474 字 · 1 分钟

笔记本升级 Ubuntu:21.10 后,自带的摄像头检测不到了。物理摄像头虽然有贴纸盖着,一般不用,但有时需要测试 webrtc 推流,没有视频采集源也是个麻烦事。winmac 平台都有虚拟摄像头软件,linux 必然也有。网上搜了一下,有个 v4l2loopback 的工具,配合 ffmpeg 可以虚拟摄像头供相关软件采集。

## 查看已有设备
❯ ls -ltr /dev/video*
#-output----------------------------------------------------------
zsh: no matches found: /dev/video*
#-----------------------------------------------------------------

## 安装 v4l2loopback
❯ sudo apt install -y v4l2loopback-dkms

## create an additional video-device, e.g. /dev/video0 
❯ sudo modprobe v4l2loopback card_label="Fake WebCam" exclusive_caps=1
❯ ls -ltr /dev/video*
#-output----------------------------------------------------------
crw-rw-rw-+ 1 root video 81, 0 Oct  1 20:37 /dev/video0
#-----------------------------------------------------------------

## 向 v4l2loopback device 写入数据
❯ ffmpeg -stream_loop -1 -re -i ~/Videos/demo.mp4 -vcodec rawvideo -threads 0 -f v4l2 /dev/video0
#-output----------------------------------------------------------
# ....
# ....
Press [q] to stop, [?] for help
Output #0, video4linux2,v4l2, to '/dev/video0':
  Metadata:
    major_brand     : mp42
    minor_version   : 0
    compatible_brands: mp42mp41isomavc1
    encoder         : Lavf58.76.100
  Stream #0:0(und): Video: rawvideo (I420 / 0x30323449), yuv420p(tv, bt709, progressive), 1280x720 [SAR 1:1 DAR 16:9], q=2-31, 331776 kb/s, 30 fps, 30 tbn (default)
    Metadata:
      creation_time   : 2015-08-07T09:13:32.000000Z
      handler_name    : L-SMASH Video Handler
      vendor_id       : [0][0][0][0]
      encoder         : Lavc58.134.100 rawvideo
frame=   88 fps= 29 q=-0.0 Lsize=N/A time=00:00:02.93 bitrate=N/A speed=0.958x
#-----------------------------------------------------------------

## 使用 v4l2-capable application 测试
## 可以用 cheese 打卡查看
## 也可以使用 webrtc sample 测试,网址:https://webrtc.github.io/samples/src/content/getusermedia/gum/

## 停止写入数据,停止 ffmpeg 程序即可

## 删除 v4l2loopback device
❯ sudo modprobe --remove v4l2loopback

cheese 读取摄像头数据正常:

webrtc sample 打开,读取摄像头正常:

## 其他一些使用方法
### 读取,保存数据到文件
❯ ffmpeg -i /dev/video0 out.mp4
### 读取,预览数据
❯ ffplay /dev/video0

REF

1. v4l2loopback(github) 2. demo.mp4 3. Ubuntu – ny way ffmpeg send video to /dev/video0 on Ubuntu