Piping von xpra zu ffmpeg

3

Ich versuche, ein kopfloses xpra-Display aufzunehmen. (Ich habe versucht, die Optionen xvfb und Xdummy zu verwenden).

Das Problem ist mit ffmpegs "x11grab". Der verwendete Befehl lautet:

/usr/bin/ffmpeg -y -framerate 2 -video_size 1920x1080 -f x11grab -i :102 -vcodec libx264 -crf 0 -preset ultrafast /output.mkv

Das Problem ist, dass dies nur eine leere Anzeige aufzeichnet. Es ist komplett weiß, mit Ausnahme des schwarzen X, das Sie auf einem Linux-System erkennen würden.

Ffmpeg funktioniert einwandfrei für die Aufnahme von "echten" Anzeigen, und ich kann eine Verbindung zur xpra-Sitzung herstellen und feststellen, dass tatsächlich Fenster in der Anzeige vorhanden sind. Wenn Sie eine xwd-Ausgabe in xwud umleiten, werden dieselben Fenster angezeigt.

Ich habe den ganzen Tag damit verschwendet! Kennt jemand irgendwelche Hacks, die ich machen kann, um x11grab zum Laufen zu bringen?

user2426679
quelle

Antworten:

2

Nachdem ich einige Male ausgegraben habe, habe ich festgestellt, dass dies etwas mit der Art und Weise zu tun hat, wie xpra seine aktiven Fenster verwaltet.

Um xwd in xwud umzuleiten, muss ich die untergeordnete Fenster-ID für xwd angeben. Andernfalls wird nur ein leerer Fensterrahmen angezeigt. Optisch ist dies sehr unterschiedlich zu dem leeren, weißen Rahmen, den ich von ffmpeg erhalte, aber ich denke, dass er auf dasselbe hinweist.

Wenn ich raten müsste, hat das etwas mit den Flugzeugen zu tun

 444  req->planeMask = (unsigned int)AllPlanes;
 445  req->format = ZPixmap;

^ Den ffmpeg-Code für x11grab von https://ffmpeg.org/doxygen/trunk/x11grab_8c_source.html

Ich habe mich entschlossen, xpra zu verschrotten und das xvfb-Standalone zu verwenden. Dadurch kann ich ffmpeg verwenden

user2426679
quelle
1

Xpra ist ein Compositing-Fenstermanager , ich zitiere: Der Fenstermanager setzt die Fensterpuffer zu einem Bild zusammen, das den Bildschirm darstellt, und schreibt das Ergebnis in den Anzeigespeicher. . Im xpra-Fall befindet sich der Anzeigespeicher auf dem Client, und bis Sie den Client anfügen, ist er nicht vorhanden, sodass auf dem vfb nichts angezeigt wird. So funktioniert xpra.

Wenn Sie xpra verwenden möchten und das VFB weiterhin mit x11grab an ffmpeg weiterleiten möchten, können Sie das VFB separat starten und anschließend xpra shadowüber xpra auf das vorhandene VFB zugreifen. (xpra shadow mode ist viel weniger effizient ... da es kein Compositing verwendet, sondern wie x11grab Screenscraping verwendet)

Ab Version 0.16 gibt es eine neue Option namens sync-xvfb (in Millisekunden), mit der auch der virtuelle Bildschirm gezeichnet werden kann, den Sie dann erfassen können.

Totaam
quelle