A few weeks ago I discovered Video4Linux (v4l2), which allows you to control video devices like a webcam.
In my case, I simulated/virtualized a webcam. That means that with the help of v4l2 I could send a video stream (or an image) to a virtual/simulated webcam. And every app that can normally address a webcam (e.g. Zoom or Skype) played my video what I sent to the webcam.
Here are some of the commands I found useful.
With v4l2loopback we can virtualize a webcam.
sudo apt install v4l2loopback-dkms
With v4l2-ctl we can control the video4linux drivers. (It is in the v4l-utils package)
sudo apt install v4l-utils
With ffmpeg we can stream our video to the webcam
sudo apt install ffmpeg
Let’s load the kernel module v4l2loopback, which creates a virtual video device.
sudo modprobe v4l2loopback
If you need multiple video devices, you can load them as follow
sudo modprobe v4l2loopback devices=2
The video devices will appear under /dev/video[0-9].
You can check with v4l2-ctl, which id your video devices have
You can stream a video (input.mov in that case) to your virtualized webcam
ffmpeg -re -i input.mov -f v4l2 /dev/video0
If you would like to send your video in a loop
ffmpeg -stream_loop -1 -re -i input.mov -f v4l2 /dev/video0
If you would like just send a picture to your virtualized webcam.
ffmpeg -loop 1 -re -i input.jpg -f v4l2 -vcodec rawvideo -pix_fmt yuv420p /dev/video0
If you would like to stream your desktop. Very handy if the application you use doesn’t support screen sharing.
ffmpeg -f x11grab -framerate 25 -video_size 1920x1080 -i :1 -f v4l2 /dev/video0
In my case the input is “:1”, this could be different e.g :0.
You can identify your display by echo $DISPLAY
You can identify your resolution with resolution: xrandr -q
If you have multiple screens, you can just add the resolution you have to the display e.g. :1+1920
You can clone e.g. your real webcam (/dev/video0) to multiple devices. In that case /dev/video1 and /dev/video2
That is handy if an application is blocking a device (because it will be used), you can bypass it by cloning the webcam and use it in another application the cloned video device.
ffmpeg -f v4l2 -i /dev/video0 -f v4l2 /dev/video1 -f v4l2 /dev/video2
video1 and video2 need to be created. E.g. sudo modprobe v4l2loopback devices=2
ffplay is a simple media player, which use the FFmpeg library
If the stream you playing is a bit laggy (that was in my case) you can tune it with:
ffplay /dev/video0 -fflags nobuffer -flags low_delay -framedrop
mpv is a free (as in freedom) media player for the command line.