Virtual webcam with v4l2

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

v4l2-ctl --list-devices

Video to webcam

You can stream a video ( in that case) to your virtualized webcam

ffmpeg -re -i -f v4l2 /dev/video0


If you would like to send your video in a loop

ffmpeg -stream_loop -1 -re -i -f v4l2 /dev/video0

Picture to webcam

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

Desktop to webcam

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

Cloning a webcam

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

Useful commands

Playing the webcam stream

ffplay is a simple media player, which use the FFmpeg library

ffplay /dev/video0

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.

mpv /dev/video0