v4l2loopback 简单使用
2021年10月1日 · 474 字 · 1 分钟
笔记本升级 Ubuntu:21.10
后,自带的摄像头检测不到了。物理摄像头虽然有贴纸盖着,一般不用,但有时需要测试 webrtc
推流,没有视频采集源也是个麻烦事。win
和 mac
平台都有虚拟摄像头软件,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