A virtual webcam
There are a lot of fun things you can do with Linux. What I propose you today is to stream an arbitrary video as if it were your webcam and microphone output.
See original (before 2018-06-18)
Some sort of disclaimer
Okay, so the draft of this blog post has been sitting on my hard drive for months now, and if I don’t post it yet, I’ll never post it. The reason I didn’t is because it is incomplete, as there’s a tiny something I don’t understand. I lost interest in this so I won’t look for the solution myself, but if you find it you’re welcome to share it with me! Anyway, let’s see this.
Setup a virtual webcam
First, install v4l2loopback. It’s a kernel module for Linux we will use to create a virtual webcam.
Then we will check for already existing webcams. Like almost every devices in UNIX, they’re located in
/dev/ and their names are
video followed by a number.
$ ls /dev/ | grep video video0
We see here that I have one webcam:
Let’s load v4l2loopback:
Now we’ll see if our virtual webcam is there:
$ ls /dev/ | grep video videvide
Yes, it is!
Setup a virtual microphone
Actually, we won’t create a microphone, we’ll create a soundcard. Microphones are handled by soundcards, which deal with the collected data.
To create a virtual soundcard we will proceed similarly as we did with the webcam, first we list the connected soundcards:
$ cat /proc/asound/cards 0 [Intel ]: HDA-Intel - HDA Intel HDA Intel at 0xfdff4000 irq 27 1 [NVidia ]: HDA-Intel - HDA NVidia HDA NVidia at 0xfcffc000 irq 17 2 [H2300 ]: USB-Audio - HP Webcam HD 2300 Hewlett Packard HP Webcam HD 2300 at usb-0000:00:1a.7-5, high speed
As you see, I have three soundcards.
Next we load the kernel module:
And then, I got a new soundcard!
$ cat /proc/asound/cards 0 [Intel ]: HDA-Intel - HDA Intel HDA Intel at 0xfdff4000 irq 27 1 [NVidia ]: HDA-Intel - HDA NVidia HDA NVidia at 0xfcffc000 irq 17 2 [H2300 ]: USB-Audio - HP Webcam HD 2300 Hewlett Packard HP Webcam HD 2300 at usb-0000:00:1a.7-5, high speed 3 [Loopback ]: Loopback - Loopback Loopback 1
It’s the one called Loopback, remember its number: 3.
Stream video to the virtual webcam
ffmpeg to extract a stream from a file and input it to the virtual webcam, in this case
/dev/video1. You don’t have to, but you should read at least its synopsis.
ffmpeg -re -i 'your/file.avi' -f v4l2 /dev/video1
If it doesn’t work, you’ll have to explicitly set options for the input file, read
ffmpeg‘s manpage to know those.
See original (before 2018-06-18)
Ok, this is the part I’m unsure about. I don’t get why I have to specify
hw:3,1 . If this setting doesn’t work for you, well, try trial and error. And if you know why it’s this and not anything else, I’ll be glad to hear why!
$ ffmpeg -i some/test/file.mp3 -f alsa hw:3,1
Both sound and video
First, list your streams with
ffprobe, you’ll get something like this:
$ ffprobe your/file.avi Stream #0:0: Video: mpeg4 (Advanced Simple Profile) (XVID / 0x44495658), yuv420p, 512x384 [SAR 1:1 DAR 4:3], 1005 kb/s, 29.97 fps, 29.97 tbr, 29.97 tbn, 29.98 tbc Stream #0:1: Audio: mp3 (U / 0x0055), 48000 Hz, stereo, s16p, 133 kb/s
It means that the first stream of the first file (
#0:0) is a video whereas the second (
#0:1) is the audio stream.
And then you can use this with ffmpeg’s option
-map to specify where to output respectively the video stream and the audio stream:
$ ffmpeg -i "your/file.avi" -map 0:0 -f v4l2 /dev/video1 -map 0:1 -f alsa hw:3,1
And that’s it! now you have a virtual webcam and a virtual microphone you can use, for example, to stream videos on videochats.