Fake-/Dummy-Webcam für Linux
Nehmen wir mal an, man möchte mit seinem Linux-PC eine Dummy-Webcam, also eine virtuelle statt echte Kamera betreiben, um z.B. bei Skype Video-Clips einspielen zu können oder bei Chatroulette.com sein Unwesen zu treiben. Für solche Fälle habe ich einen Gerätetreiber gefunden und ein wenig damit herum gespielt. Das Projekt nennt sich AVLD (Another Video Loopback Device) und bietet ein Kernel-Modul, das man einbinden und für diverse Zwecke verwenden kann. Neben dem einfachen “Vorgaukeln” einer Webcam für verschiedenste Programme kann man sogar Videos auf diesem Device ausgeben. Es erscheint dem Betrachter dann wie gerade live aufgenommen.
Die Vorgehensweise:
1. Installation
Ich nutze derzeit openSUSE 11.2 (i586). Leider existiert derzeit noch kein offizielles RPM für AVLD, daher muss es von Hand kompiliert werden. Zur Vorbereitung wurden die RPMs “gcc”, “make”, “patch” und “kernel-source” installiert. Außerdem wurde natürlich die aktuellste Version von AVLD (momentan 0.1.4) heruntergeladen und entpackt.
Das Kommando “make” im entpackten Ordner lieferte direkt einen ernüchternden Fehler… “error: ‘v4l_compat_ioctl32’ undeclared here”. Sollte das schon das Ende sein? Nein, glücklicherweise fand sich in den Weiten des Internets einen Patch für AVLD, der für den Kernel 2.6.31 passt. Der Patch wird in das avld-Verzeichnis kopiert. Daraufhin wird das Kommando “patch -Np1 -i avld_0.1.4-2.6.31.patch_.txt” ausgeführt, wodurch die Datei “video_device.c” angepasst wird. Nun steht dem Befehl “make” und dem danach als root ausgeführten Kommando “make install” nichts mehr im Wege. Damit ist das Kernel-Module “avld.ko” nun nutzbar.
2. Laden und Verwenden des Moduls
Das Modul kann – wie bei Linux üblich – mittels “modprobe avld” geladen werden. An dieser Stelle ist es jedoch sehr wichtig, zu verstehen, dass das Device nur eine fest eingestellte Auflösung beherrscht, sich also nicht automatisch der Quelle (z.B. einem Video – siehe unten) anpasst. Werden dem Modul also keine Optionen mitgegeben, verwendet es standardmäßig eine Auflösung von 340×240 Pixel. Möchte man die Größe direkt beim Laden ändern, ruft man modprobe inkl. Parametern auf:
modprobe avld width=640 height=480 fps=25
Hat man das Modul hingegen bereits geladen, können die Parameter angepasst werden, indem man die Optionen per echo an das entsprechende Device schickt, also so:
echo "width=800 height=600 fps=25" > /dev/video0
(ggf. muss hier die Device-Nr. angepasst werden).
Die Fake-Webcam kann nun bereits verwendet werden. Ein Test kann mit MPlayer durchgeführt werden:
mplayer tv:// -tv "driver=v4l:device=/dev/video0:noaudio:outfmt=rgb24"
Sie sollte als ganz normal Gerät auftauchen und ein schwarzes Bild liefern. Möchte man stattdessen lieber bewegte Bilder präsentieren, kann man auf einfache Weise ein Video an das Gerät senden. Das erfolgt mit dem Programm “mencoder” aus dem MPlayer-Paket:
mencoder MOVIECLIP.XYZ -nosound -ovc raw -vf format=bgr24 -of rawvideo -o /dev/video0
Hat soweit alles geklappt, kann der Spaß beginnen… auch ohne echte Kamera. Mir fiele da z.B. der gute alte Casino-Räuber-Trick ein, bei dem man zunächst ein unscheinbares Video aufzeichnet, das dann statt des echten Webcam-Bildes wiedergegeben wird, um dem Betrachter das eigentliche Geschehen vor zu enthalten. :-)



alles super geklappt, nur das mit dem rtsp klappt nciht so ganz
mencoder rtsp://192.168.0.153/live.sdp -nosound -ovc raw -vf format=bgr24 -of rawvideo -o /dev/video0
MPlayer dev-SVN-r31930-4.5-openSUSE Linux 11.3 (i686)-Packman (C) 2000-2010 MPlayer TeamResolving 192.168.0.153 for AF_INET6…
Couldn’t resolve name for AF_INET6: 192.168.0.153
Connecting to server 192.168.0.153[192.168.0.153]: 554…
A single media stream only is supported atm.
rtsp_session: unsupported RTSP server. Server type is ‘unknown’.
STREAM_LIVE555, URL: rtsp://192.168.0.153/live.sdp
success: format: 21 data: 0×0 – 0×0
Stream not seekable!
file format detected.
Initiated “video/MP4V-ES” RTP subsession on port 50714
Initiated “audio/MPEG4-GENERIC” RTP subsession on port 40138
demux_rtp: Failed to guess the video frame rate
VIDEO: [mp4v] 0×0 0bpp 0.000 fps 0.0 kbps ( 0.0 kbyte/s)
[V] filefmt:21 fourcc:0x7634706D size:0×0 fps:0.000 ftime:=0.0000
Opening video filter: [expand osd=1]
Expand: -1 x -1, -1 ; -1, osd: 1, aspect: 0.000000, round: 1
Opening video filter: [format fmt=bgr24]
==========================================================================
Opening video decoder: [ffmpeg] FFmpeg’s libavcodec codec family
Selected video codec: [ffodivx] vfm: ffmpeg (FFmpeg MPEG-4)
==========================================================================
Flushing video frames.
Filters have not been configured! Empty file?
Video stream: -nan kbit/s (-2147483648 B/s) size: 0 bytes 0.000 secs 0 frames
achso, zu dem muss ich sagen mplaxer packt das allgemein nicht (rtsp) und vlc funktioniert problemlos…
so nun wie schaffe ich vlc zu sagen das der den stream nun auf /dev/video0 legt???
cvlc ist auch ne option, aber ich kann nichts mit dem format=bgr24 anfangen, naja vllt. hast du eine idee, ansonsten eine super Anleitung