Verwenden des Desktops als gefälschte Webcam unter Linux

47

Ich möchte einen Live-Stream von (einem Fenster auf) meinem Linux-Desktop über eine kostenlose Streaming-Site erstellen und das aufgezeichnete Video als gefälschte Webcam verwenden. Unter Windows gibt es dafür viele Tools. Mit ffmpeg kann ich Eingaben in einem bestimmten Fenster erfassen, aber ich kann keine Möglichkeit finden, das Video auf einem gefälschten Gerät im Webcam-Stil auszugeben, das von Flash verwendet werden kann.

Kann jemand eine Methode (oder Software) dafür empfehlen?

bkconrad
quelle
Bis Sie sagten, "gefälschtes Gerät im Webcam-Stil, das von Flash verwendet werden kann", war das alles ziemlich blitzschnell.
Ignacio Vazquez-Abrams
Ich bin mir nicht sicher was du meinst? Mit "Webcam-Stil" meinte ich so etwas wie eine gefälschte / dev / videoN-Gerätedatei oder ähnliches. Ich gehe davon aus, dass das aufgenommene Video auf diese Weise von Flash verwendet werden kann.
bkconrad
Genau. Das ist schwierig.
Ignacio Vazquez-Abrams

Antworten:

51

Sie können v4l2loopback installieren . Es ist ein Kernelmodul, das eine Webcam simuliert. Laden Sie es mit:

modprobe v4l2loopback

Dann müssen Sie den Videostream mit einem Programm wie ffmpeg an das Gerät / dev / video0 senden. Um den Desktop zu erfassen und ihn mit ffmpeg an / dev / video0 weiterzuleiten, können Sie die folgende Befehlszeile verwenden:

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

Ändern Sie den Wert von -r von 15 in einen anderen Wert, wenn Sie eine andere Bildrate wünschen. Die Auflösung wird im Parameter -s ausgewählt. Wenn Sie einen Versatz von der oberen linken Ecke des Bildschirms angeben möchten, übergeben Sie ihn im Parameter -i in der Form "-i: 0.0 + x, y", wobei x und y der horizontale bzw. vertikale Versatz sind.

Víctor Fernández
quelle
5
Dein Bild kann gespiegelt sein, ich meine, du bekommst einen horizontalen Flip, abhängig von deinem ffmpeg Build . Verwenden Sie den Videofilter -vf hflip . Wenn Sie bereits ein vf verwenden, setzen Sie diese in Anführungszeichen und trennen Sie sie durch Komma, z. B. -vf 'hflip, scale = 640: 360'.
Marcelo Teixeira Ruggeri
3
Ich bin ein paar Fehler mit diesem bekommen [x11grab @ 0x24013c0] Stream #0: not enough frames to estimate rate; consider increasing probesize, [v4l2 @ 0x2409520] ioctl(VIDIOC_G_FMT): Invalid argumentundCould not write header for output file #0 (incorrect codec parameters ?): Invalid argument
Lotus
1
Ich erhalte genau die gleichen Ausgaben wie @Lotus mit ffmpeg 3.1.4. Gibt es spezielle Codecs oder Pakete, die neben v4l2loopback und ffmpeg benötigt werden?
cguenther
1
@ Lotus Ich habe es geschafft, das Problem zu umgehen, wenn ich ein anderes / dev / video-Gerät verwende. Sie sollten sicherstellen, dass Sie das Videogerät v4l2 verwenden (in meinem Fall / dev / video1). Der Versatz kann durch ein bereits vorhandenes echtes Webcam-Gerät unter Verwendung von / dev / video0 verursacht werden.
cguenther
2
@Lotus Vergewissern Sie sich, dass der Befehl modprobe (als root oder mit sudo) ausgeführt wurde, bevor Sie Ihren Chrome-Browser starten. Überprüfen Sie, ob das Modul korrekt mit <code> lsmod | geladen ist grep v4l2loopback </ code>.
cguenther
6

Benutze v4l2loopback mit mplayer .

  1. Lade es herunter,
  2. kompiliere es ( makeund su -c 'make install'),
  3. Laden Sie das Modul mit su -c 'modprobe v4l2loopback',
  4. Ändern Sie dann eine Zeile in der Datei examples/yuv4mpeg_to_v4l2.cdes v4l2loopback-Quellordners ab

    v.fmt.pix.pixelformat = V4L2_PIX_FMT_YUV420;
    

    zu

    v.fmt.pix.pixelformat = V4L2_PIX_FMT_YVU420;
    
  5. und makein diesem Ordner tun .

  6. Führen Sie es dann aus dem folgenden examplesVerzeichnis aus:

    mkfifo /tmp/pipe  # only needed once, as long as you do not delete the file /tmp/pipe
    ./yuv4mpeg_to_v4l2 < /tmp/pipe &
    mplayer movie.mp4 -vf scale=480:360 -vo yuv4mpeg:file=/tmp/pipe
    

    wo Sie movie.mp4mit dem Namen Ihrer Videodatei ersetzen . Und ersetzen Sie /dev/video0mit Ihrem Loopback-Gerät.

MPlayer ist in der Lage, alle Webstreams, alle Arten von Videodateien abzuspielen, sogar von stdin! Ich habe es gerade mit einer Datei von http://www.tagesschau.de getestet .

TS=$(wget "http://www.tagesschau.de/multimedia/video/" -q -O - | grep --regexp='http.*\.webm"' | sed -e 's%.*href="%%' -e 's%\.webm".*%\.webm%')
./yuv4mpeg_to_v4l2 < /tmp/pipe &
mplayer $TS -vf scale=480:360 -vo yuv4mpeg:file=/tmp/pipe

Anstelle des $ TS könnte man ein setzen -(was für stdin steht). Und vor mplayer leitet Ihr Befehl ffmpeg seine Ausgabe auf stdout um. Also so etwas wie:

./yuv4mpeg_to_v4l2 < /tmp/pipe &
fmpeg -someOptions ... -o - | mplayer - -vf scale=480:360 -vo yuv4mpeg:file=/tmp/pipe

Habe den letzten nicht getestet, weil du nicht weißt, wie dein ffmpeg-Befehl aussieht.

erik
quelle
Bitte Hilfe: ./yuv4mpeg_to_v4l2 < /dev/video0 &Leads ./yuv4mpeg_to_v4l2: : missing YUV4MPEG2 header. Wie ersetze ich /tmp/pipedurch /dev/video0?
User123456
3

Welche Distribution benutzt du? Ich hatte Erfolg mit WebCamStudio unter Arch in Kombination mit dem webbasierten "Studio" von Livestream. Es ist allerdings eine Weile her, seit ich es benutzt habe.

http://www.ws4gl.org/

Was versuchst du genau zu tun? Mit x11grab kompiliertes ffmpeg kann den Desktop aufzeichnen. Ich hatte nur begrenzten Erfolg damit, Ustream davon zu überzeugen, aber es ist wieder eine Weile her und ich denke, dass das, was ich getan habe, nicht mehr funktioniert.

Wenn Sie nur eine Datei statt Ihres Desktops streamen möchten (ich denke, wenn Sie "Ein Fenster" sagen, meinen Sie "VLC"), kann ich Sie in die richtige Richtung lenken, damit das mit Livestream funktioniert (vielleicht) Ustream). Ich finde ungeschickt heraus, wie das durch Experimentieren geht. Es ist nicht fantastisch, aber es funktioniert mit Livestream.

Justin.tv hat Skripte, die auch von VLC auf ihren Dienst streamen können.

http://apiwiki.justin.tv/mediawiki/index.php/Linux_Broadcasting_API

Mike Mitchell
quelle
Oh wow das ist sehr interessant. Ich versuche, das Live-Gameplay einiger Spiele zu streamen. Ich weiß bereits, wie man von ffmpeg in eine Videodatei aufnimmt. Ich frage mich, ob ich dieselbe Datei in vlc öffnen und sie irgendwie streamen kann, während sie geschrieben wird. Danke für die Information.
bkconrad
Die Website ws4gl.org scheint sehr veraltet zu sein, und alle Links verweisen auf die Wayback-Maschine. Ich nehme an, dass die neueste Version unter sourceforge.net/projects/webcamstudio
Denilson Sá Maia
"WEBCAMSTUDIO WIRD NICHT MEHR GEPFLEGT": /
Raphael
2

Erstens macht appear.in wahrscheinlich, was Sie wollen, ohne Ärger (ich bin nicht angeschlossen): http://appear.in/

Zweitens können Sie mithilfe von OBS, das kürzlich die Linux-Unterstützung (!) Hinzugefügt hat, Streams an Twitch oder andere Dienste senden: https://obsproject.com/

OBS löst auch das viel schwierigere Problem, den Sound und die Audioeingabe des Systems während der Bildschirmaufnahme auf Ubuntu zu muxen (nicht durch irgendetwas im universeRepo gelöst , das ich bisher gefunden habe).

Ich habe keine großartigen Unix-y-Lösungen. Aber die haben in der realen Welt für mich funktioniert.

bkconrad
quelle
OBS Studio unter Debian: tracker.debian.org/pkg/obs-studio
27.