Is there any way ffmpeg send video to /dev/video0 on Ubuntu?

I want to send video to webcam device on Ubuntu which is loaded on /dev/video0

I've already seen this command that send desktop to it but is there any way to send video to it?

ffmpeg -f x11grab -r 15 -s 1280x720 -i :0.0+0,0 -vcodec rawvideo -pix_fmt yuv420p -threads 0 -f v4l2 /dev/video0

I should mention that i specifically want to use ffmpeg command.


You can do this with v4l2loopback. First you need to install it:

Install v4l2loopback

Method 1: Install v4l2loopback from the repository

sudo apt install v4l2loopback-dkms
sudo modprobe v4l2loopback

This is easy but older versions of v4l2loopback have some known bugs, so consider compiling it instead if you encounter any issues.

Method 2: Compile v4l2loopback

If it's not in the repository for your Ubuntu version, or you want the latest version, you can compile it:

sudo apt-get install build-essential checkinstall
wget https://github.com/umlaeute/v4l2loopback/archive/main.zip
unzip main.zip
cd v4l2loopback-main
make
sudo checkinstall --pkgname=v4l2loopback --pkgversion="$(date +%Y%m%d%H%M)-git" --default
sudo modprobe v4l2loopback

Uninstalling

If you want to remove the package you compiled:

sudo apt-get remove v4l2loopback

Examples

Note that the actual video number may vary depending if an existing device is already using /dev/video0. Check output of ls /dev/video* or v4l2-ctl --list-devices.

Desktop to virtual camera

Now run ffmpeg. Example for desktop using x11grab:

ffmpeg -f x11grab -framerate 15 -video_size 1280x720 -i :0.0 -f v4l2 /dev/video0

Video file (MP4) to virtual camera

ffmpeg -re -i input.mp4 -map 0:v -f v4l2 /dev/video0

Image to virtual camera

ffmpeg -re -loop 1 -i input.jpg -vf format=yuv420p -f v4l2 /dev/video0

Webcam → ffmpeg → Virtual webcam

Add text

With drawtext filter:

ffmpeg -f v4l2 -i /dev/video0 -vf "drawtext=text='Hello World':fontsize=12:fontcolor=white:font=Arial:x=w-tw-10:y=h-th-10,format=yuv420p" -f v4l2 /dev/video1

See How to position drawtext text?

Greenscreen / chroma key / replace background

Using chromakey, overlay, and format filters:

ffmpeg -re -i background.jpg -f v4l2 -i /dev/video0 -filter_complex "[1]chromakey=color=#326964:similarity=0.07:blend=0.02[fg];[0][fg]overlay=(main_w-overlay_w)/2:(main_h-overlay_h)/2:format=auto,format=yuv420p" -f v4l2 /dev/video1

See How to position overlay?

Preview with ffplay

ffplay /dev/video0

Common errors

  • Unable to open V4L2 device '/dev/video0'
  • Failed to open /dev/video0: No such file or directory
  • Unknown V4L2 pixel format equivalent for yuvj422p

See this answer for solutions.