Is there any way ffmpeg send video to /dev/video0 on Ubuntu?
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
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.
Related videos on Youtube
dsddd
Updated on September 18, 2022Comments
-
dsddd almost 2 years
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.
-
Elder Geek over 7 yearsIt's my understanding that a webcam is an video input device so I would say no. What webcam do you have that supports receiving video?
-
dsddd over 7 years@ElderGeek there is no webcam.it is virtual one which need to have video on it.
-
Elder Geek over 7 yearsHAve you tried using a pipe?
-
Elder Geek over 7 yearsInformation is available here
-
dsddd over 7 years@ElderGeek yes and i face the error "pipe broken".
-
dsddd over 7 years@ElderGeek i saw that information, it is confusing for me and i think i need some ffmpeg expert to help me for the command.
-
llogan over 7 yearsPossible duplicate of Fake a webcam using a video loopback device? (although not necessarily using
ffmpeg
). -
Elder Geek over 7 yearsBased on a quick review of the link I provided you it appears that you would have to compile a configured ffmpeg build from source to enable the specific output devices that you intend to use as outlined in the section I linked you to. I understand that you want to accomplish this with ffmpeg, however you might wish to ease your requirements in order to obtain an answer that is within your capabilities.
-
-
dsddd over 7 yearswhere can i specify my video ?
-
llogan over 7 years@dsddd Example updated.
-
Sabbin over 5 yearsI installed the package, but I'm stuck with an error on both examples, either the x11grab or the the mp4 video give me the same
[v4l2 @ 0x55ebc0cfdc40] ioctl(VIDIOC_G_FMT): Invalid argument Could not write header for output file #0 (incorrect codec parameters ?): Invalid argument Error initializing output stream 0:0 -- Conversion failed!
Is there something else I should do? some dependencies I missed? -
llogan over 5 years@Sabbin Please show your command and provide a link to a pastebin of the log.
-
Sabbin over 5 years@llogan following your example above, I have this command
ffmpeg -re -i 1.mp4 -map 0:v -f v4l2 /dev/video0
pastebin.com/9eDK0NTN, if I try the command to run for desktopffmpeg -f x11grab -framerate 15 -video_size 1280x720 -i :1 -f v4l2 /dev/video0
I get this error pastebin.com/xN6uZJR6, also the folder /dev/video0 has rights for write -
llogan over 5 years@Sabbin I guess it didn't compile/install correctly, but there is now a package available so compiling isn't required anymore. Do this:
sudo modprobe -r v4l2loopback && sudo apt remove v4l2loopback && sudo apt install v4l2loopback-dkms && sudo modprobe v4l2loopback
and try again withffmpeg
. -
Sabbin over 5 years@llogan I had the
v4l2loopback-dkms
installed from before. I tried the above command and I still get the same results -
llogan over 5 years@Sabbin I can't duplicate the issue. Works for me on 18.04 using v4l2loopback-dkms and ffmpeg from repository.
-
Sabbin over 5 years@llogan, I will remove everything and try to get it from 0 again, maybe I missed or have done something wrong. Thank you for your assistance!
-
dǝɥɔS ʇoıןןƎ about 5 years@sabbin try with /dev/video1
-
Michael about 4 yearsNow how do I get the device to show up to e.g. Chrome software?
-
llogan about 4 years@Michael Worth asking that as a new question.
-
Michael about 4 years@llogan Thanks, done
-
Petr Doležal over 3 yearsanother error I had was that
snap
installedffmpeg
didn't have access to video feed. The commandsnap connect ffmpeg:camera
fixed it -
Scrooge McDuck over 3 yearswayland compatible solution?
-
llogan over 3 years@ScroogeMcDuck Sorry, but I don't know anything about wayland.
-
Scrooge McDuck over 3 yearsmaybe I found something here, will try later wiki.archlinux.org/index.php/Screen_capture#Wayland