FFMPEG: 2D zu 3D in Echtzeit

Teil 2 der Linux am Dienstag Mini-Serie zum Thema „2D in 3D umwandeln“ befasst sich mit FFMPEG und den verschiedenen Möglichkeiten, die sich daraus ergeben, und da gibt es einiges 😀

FFMPEG: 2D zu 3D in Echtzeit

Wer den ersten Beitrag noch nicht gelesen hat, sollte sich den vorher durchlesen, da diverse Rahmenbedingungen wie Framerate und Algorithmus auch für FFMPEG gelten, die ich aber nicht nochmal erklären werde 😉

Bino: der 3D Videoplayer

Die grundlegende Filtertechnik

Wer mit FFMPEG arbeitet weiß um die Myriaden von Dateiargumenten in der der Konsole, daher mache ich es Euch einfach: -vf stereo3d=al:arcc 

Das ist der Stereo3D-Filter den wir allen FFMPEG Tools mitgeben können, damit wir rot-cyanblaue 3D Bilder bekommen. Das Format stereo3d=in:out könnt Ihr auch ändern, je nachdem was Ihr so machen wollt. Es gibt im Netz diverse Webseiten, die da helfen können:

https://trac.ffmpeg.org/wiki/Stereoscopic
http://underpop.online.fr/f/ffmpeg/help/stereo3d.htm.gz

Der erste Link sollte eigentlich reichen um das Prinzip zu erklären. Da wir die Angaben in allen FFMPEG-Werkzeugen benutzen können, muß man den Teil also nur einmal austüfteln.

Wenn man sich einen Film in 3D ansehen möchte, kann man dafür FFPLAY benutzen:

ffplay -vf stereo3d=al:arcc film.mp4

Da hier die soweit alles auf Anhieb funktioniert, eignet es sich hervorragend für einen NEMO/Nautilus Actionmenüeintrag, also zum Abspielen auf Klick im Dateimanager 😉

Im Bild: Nemo

Um so einen Menüeintrag zu bekommen, braucht Ihr zwei Dateien:

/home/<username>.local/share/nemo/actions/play3d.nemo_action

[Nemo Action]
Name=Play 3D Video
Comment=Spiele Videos in 3D ab.

Exec=<play3d.sh %F>

Icon-Name=soundconverter

Selection=Any
Separator=;

Extensions=m4a;mp4;avi;webm;ogg;ogv;oga;wav;mkv

und /home/<username>.local/share/nemo/actions/play3d.sh

#!/bin/bash

IN=$*

IFS=";" read -ra FILES <<< "$IN"
for i in "${FILES[@]}"; do
    ffplay -vf stereo3d=al:arcc "$i" > /dev/null
done

Aber das ist natürlich nur der Anfang 😉 Kommen wir zur Abteilung „zu kalt für den Gefrierschrank“:

Zum Coolsein gehört v4l2loopback

Wer das auf seinem Rechner noch nicht drauf hat, sollte sich das v4l2loopback-Device nachinstallieren und dann kurz rebooten, damit der Kernel das korrekt verarbeiten kann. Für Fedora geht das so: dnf -y install v4l2loopback;reboot .

Wenn der PC wieder da ist, laden wir das Modul als normaler Benutzer: modprobe v4l2loopback

Ggf. dürft Ihr das auf Eurer Installation nicht, dann benutzt sudo dafür. Der Teil der jetzt kommt ist stark individuell von Eurer WebCam abhängig und wie Euer Kernel Lust hatte, mit dem V4L2 Videokram umzugehen.

Wenn meine Versionen der Befehle bei Euch nicht direkt funktionieren, dann gibt es diverse Gründe:

die Kamera kann die Auflösung nicht => eine andere Auflösung benutzen
die Kamera kann das Bildformat ( „pixfmt“ ) nicht => einfach mal „rawvideo“ angeben, das sollten alle können.
ffmpeg kann das Videogerät nicht lesen (/dev/video0: Kein passendes Gerät gefunden) => video1 benutzen

Am besten die Fehlermeldungen sorgsam lesen, ist meistens recht einfach.

… und es werde ein 3D-Bild !

ffmpeg -f video4linux2 -input_format mjpeg -video_size 1920×1080 -r 30 -i /dev/video1 -vf stereo3d=al:arcc -framerate 30 -video_size 1920×1080 -pixel_format yuvj422p -c:v:0 rawvideo -s 1920×1080 -r 30 -f v4l2 /dev/video0

ja, richtig geraten, die WebCam liefert jetzt ein 3D Bild aus, aber nur wenn Ihr Euch auch bewegt 😀 Das Bild kann von Firefox oder Chromium ( nehmt den dafür, FF zickt noch rum ) z.b. im Rahmen einer Videokonferenz oder bei Matrixcalls verwendet werden. Ihr könnt es Euch natürlich auch per WebCam-Tool wie Camorama ansehen und mit lustigen Effekten versehen, es per OBS Streamen, was auch immer Ihr wollt \o/

Ein paar Erklärungen

-f video4linux2 -input_format mjpeg -video_size 1920×1080 -r 30 -i /dev/video1

Einlesen von einer WebCam mit dem Videocodec „mjpeg“ aka MotionJPEG mit 30 FPS und in FULLHD Auflösung. Wenn man hier kein mjpeg nimmt, bekommt man i.d.R. nur Ruckelvideo mit 5 FPS, egal was man anfordert. Falls Eure Cam das nicht kann, was wie aber wohl können wird, nehmt „rawvideo“ als Codec, das geht immer. Hinweis: 5 FPS reichen für 3D nicht!

-vf stereo3d=al:arcc

Den Teil kennt Ihr ja schon von oben.

-framerate 30 -video_size 1920×1080 -pixel_format yuvj422p -c:v:0 rawvideo -s 1920×1080 -r 30 -f v4l2 /dev/video0

Mit 30 FPS (-r) in FullHD(-video_size) als Rawvideo skaliert (-s) auf FullHD als Video4Linux2 (-f) WebCam an /dev/video0 schreiben. Ja, zweimal die Auflösung drin, einfach machen, es gibt unterschiedliche FFMPEG Versionen, so klappts am Ehesten und einer ist eh die Streaminfo für den, der die Kamera benutzen will 😉

Wie, das reicht Euch noch nicht?

Hmm… na gut, es will ja nicht jeder sein Bild in die Konferenz streamen 😀

Die FFMPEG Argumente habe ich oben in 3 Teile aufgeteilt, Teil 2 ist immer gleich, aber die Teile 1 und 3 könnt Ihr austauschen, z.B. mit …

-c:v libx264 -preset fast -pix_fmt yuv420p -s 1920×1080 -strict experimental -acodec aac -ab 128000 -ar 48000 -ac 2 -vbsf h264_mp4toannexb -f mpegts „udp://127.0.0.1:10000?pkt_size=1316“

Ja ja, wieso OBS nutzen zum Streamen, FFMPEG kann das auch solo 😀

Um da einen TON zu bekommen, muß im ersten Teil „-f pulse -i default“ eingefügt werden, nach dem Videoteil, aber vor Teil 2. Das greift das PulseAudio Default Sink ab und kodiert es in die Tonspur ein.

Ganzen Desktop streamen…

ffmpeg -f x11grab -framerate 30 -video_size 1920×1080 -i :1.0 -f v4l2 /dev/video2 <- variabel

Als MP4 Film speichern …

-c:v libx264 -preset superfast -pix_fmt yuv420p -s 1920×1080 -strict experimental -acodec aac -ab 128000 -ar 48000 -ac 2 -f mp4 filmname.mp4

Da geht einiges, aber das coolste ist wohl die 3D Videokonferenz und jetzt Viel Spaß \o/

Bino: der 3D Videoplayer

Bei Linux am Dienstag hatten wir jetzt zwei Wochen lang Spaß mit 3D Bildern, da wird es Zeit Euch daran teilhaben zu lassen 😉  In Teil 1 der neuen Miniserie, befassen wir uns mit Bino, dem 3D-Videoplayer. Dann mit FFMPEG und den spannenden Möglichkeiten, die sich damit bieten.

Bino: der 3D Videoplayer

Wer war schon in den 80ern auf der Welt und hat noch eine Rot-Grünbrille von Damals? 🙂 Die, oder besser die moderne Version in Rot-Cyanblau, werdet Ihr gleich brauchen:

Szene aus „Alice in Borderland 2020“ IMDB

BINO kann aus 2D Material 3D Material machen, aber das kostet uns etwas.

Das hier angewandte Verfahren, analysiert die Pixelbewegung zwischen zwei aufeinander folgenden Bildern. Je nach der Geschwindigkeit der Pixelbewegung, also wieweit die in einem Frame gekommen sind, werden die zwei Bilder zu einem Mischbild verrechnet und die bewegten Pixel in Rot bzw. Cyanblau eingefärbt. Man sieht das ja oben im Bild. Durch die Brille sieht man jetzt jeweils auf einem Auge nur eine der beiden Farbe, die sehr genau ausgefiltert sein müssen, damit möglichst viele andere Farben in dem Bild „sauber“ durchkommen.

Wer sich das Bild oben ohne Brille ansieht, der erkennt das natürlich sofort 😉 mit Brille sieht das schon viel „besser“ aus. Achtet bei dem Testbild mal auf die Schulter von der Person im Vordergrund, die springt mit Einsatz der Brille förmlich vom Hintergrund weg und der 3D Effekt zeigt sich ganz deutlich.

Verluste sind eingepreist

Um diesen Effekt zu bekommen, werden ja zwei Bilder verglichen. Leider ist der von Bino eingesetzte Algorithmus nicht der allerbeste, was als Konsequenz bedeutet, wir verlieren 50% der Frames. Bei einer 30 FPS Aufnahme, fängt das Bild beim Abspielen dann an zu rucken wie in den 10er Jahren des letzten Jahrhunderts. Das ist weniger schön, aber kompensierbar, wenn man 60 FPS Material benutzt. Es verursacht auch auf Dauer böses Kopfweh.

Aufgrund der eingesetzten Methode durch bestimmte Farben, sieht das Bild nicht mehr normal aus, deswegen hat man ja dann in den 2000er Jahren die Polarisationsgläser im Kino eingesetzt, die das Farbsehen nicht beeinflussen. Auf einem normalen Monitor kann man solche Brillen aber nicht einsetzen, dazu braucht es dann spezielle 3D Monitore, die mittlerweile ziemlich rar gesät sind. VR Brillen füllen diese Lücke, sind aber finde ich, zu teuer um sich da mal einen Spaß zu machen.

Dem Algorithmus is auch geschuldet, daß Bildteile, die sich nicht bewegen, keinen 3D Effekt erzeugen. Das kann Bino aber ein bisschen ausgleichen in dem es eine Kantenerkennung einsetzt und dort perspektivische Pixelverschiebungen erzeugt:

geht auch bei Standbildern

Den Parallaxenwert zu hoch zusetzen ist sinnlos, 0,01 – 0,05 reichen völlig aus für einen Tiefeneindruck. Dieser kleine Trick macht das Erlebnis etwas besser, ist aber zu einem Film, der in 3D gedreht wurde, kein Vergleich.

Bino kann aber noch mehr

Bino kann als Bildquelle auf Webcams benutzen, so daß man sich, oder etwas, in 3D bewundern kann, vorausgesetzt man bewegt sich ausreichend 😀 Leider kann man das Bild nicht live exportieren, also nicht in einer Videokonferenz benutzen. Das ist aber die perfekte Überleitung zum nächsten Artikel der Serie: „Mit FFMPEG zur Live 3D Videokonferenz“ 😀

Programmtechnisch hat Bino leider auch noch ein paar kleine Bugs, z.b. muß man alle Werte neu setzen, wenn man einen neuen Film lädt. Auch macht die GUI nicht mit, wenn man über das Menü einen Film laden will, werft den stattdessen via Drag&Drop auf das Programmfenster, das funktioniert zuverläßig.

Update: Teil 2

FFMPEG: 2D zu 3D in Echtzeit

 

 

Firefox Update 57 -> 96 – keine gute Idee

Admins reden sich den Mund fusselig, aber einige Benutzer interessieren sich einfach nicht für Updates der von Ihnen genutzen Software. Was das für Firefox bedeuten kann, beleuchten wir heute.

Firefoxupdate 57 -> 96 – keine gute Idee

Vor ein paar Wochen sollte ich einen defekten Laptop retten.. es war hoffungslos :

Totalschaden

Da haben wir, auch aufgrund des Alters, einfach einen neuen bestellt. Leider hatte der neue nur noch M2 Schnittstellen, aber keine internen SATA Anschlüsse mehr. Also mußte das OS auf eine SSD geclont werden, was an sich eine leichte Übung ist.

Das N15 Acer Extensa EX215-51-52AW

Das mit einem i5 10te Generation, 8GB Ram sowie 256 GB M2.SSD ausgestattete ist ein nettes Gerät, wenn man denn Linux darauf installieren könnte. Natürlich habe ich eine LiveDisk reingesteckt, konnte aber die versprochene SSD nicht finden, egal mit welcher Distro ich es probierte 🙁 Auch im Bios tauchte das Gerät nicht auf. Sachen gibt es.

Stunden später tauchte einem ACER-Forum ein Beitrag auf, daß jemand glaubt vergessen hatte, den Raidmodus des Controllers auf AHCI umzustellen, nur leider gab es da keine Möglichkeit zu im Bios des Geräts.. dachte ich.. eine Weile.. dann stolperte ich immer wieder über diesen Artikel und beiläufig erwähnte jemand eine geheime Tastenkombination, die diesen Wechsel überhaupt erst möglich machte.

Und tatsächlich, die Kombination gab es wirklich: CTRL-s

Danach war es ganz leicht, weil sich die SSD endlich meldete. Ein externer SATA-Adapter und ein DD später bootete das Laptop die bisherige Installation. Datenverluste: 0.00 .. so lob ich es mir. Dann der Schock, nicht ganz so unerwartet 😉 Das installierte OS hatte seit 5 Jahren keine Updates gesehen. Eine wandelnde Sicherheitslücke. Installiert war noch Fedora 25 und somit ein Firefox 57, was uns zum eigentlichen Thema des Artikels führt 🙂

5 Jahre keine Updates

Natürlich habe ich in großen Schritten von Fedora 25 auf Fedora 35 aktualisiert. Das Laptop ist echt schnell, also haben 5 Distributionsupgrades nur 2h gedauert ( man muß es ja auch mal runterladen ). Dabei wurde der Firefox von 57 auf 96 aktualisiert, allerdings nur der Firefox, nicht das Profil. Als der Kunde dann seinen neuen Laptop ausprobierte, waren alle Bookmarks, Logins und Passwörter weg. 5 Jahre ohne Updates gehen an keinem Programm spurlos vorbei. Merke: UPDATEN ! UPDATEN ! UPDATEN !

Nun waren die Logins und Passwörter noch in den Profildatenbanken enthalten, es kam aber nichts mehr raus, und kurioserweise ging auch nichts mehr rein.Die übliche Lösung, ein neues Profil anlegen und Key4.db, logins.json und places.db zu kopieren, half nichts, also mußte Mozilla ran. Zur großen Überraschung von den beteiligten Mozilla Devs gab es den Fehler auch bei Ihnen: Beweisvideo von Mozilla

Ein paar Wochen später stand fest: Man kann nicht von 57 auf irgendwas 73+ updaten, ohne daß es zum kompletten Verlust kommt. In Version 72.0.2 wurden die Datenbanken des Profiles intern umstrukturiert und sind damit zu früheren Versionen inkompatibel.

Der Workaround

Der Workaround sieht vor, einfach auf Version 72.0.2 zu downgraden, den dort befindlichen Updatevorgang durch Start von Firefox zu aktivieren und dann die Versionen wieder auf 96, oder jetzt schon 97, hochziehen.

Mit Fedora ist das eher schmerzlos von einem erfahrenen Benutzer zu machen, für Laien aber zu schwierig. Da der Kunde alle seine Passwörter schon von Hand eingegeben hatte, was auch nicht ganz ohne war, gab es für Mozilla und mich nichts mehr zu tun.

Gehen wir das mal theoretisch durch:

su root
dnf downgrade firefox –releasever=32
exit
firefox
su root
dnf update firefox -y

Das wäre es schon. Es könnte sein, daß auf dem Weg noch andere Pakete mit downgegraded werden müssen, was im Einzelfall bei der Zeitspanne von 2,5 Jahren echt spannend sein wird. Natürlich gibt es eine bessere Lösung:

Installiert Euch ein altes System in eine CHROOT-Umgebung 🙂

DNF ist in der Lage eine komplette Basisinstallation in ein beliebiges Verzeichnis vorzunehmen, einfach mit –installroot pfadname angeben. Wenn man da Firefox als Wunschpaket mit angibt, dann zieht das alle Pakete nach, die man dazu braucht, auch einen Desktopmanager usw. Achtet darauf, daß es der gleiche ist, wie der, der gerade läuft, weil Ihr dann natürlich kein System im System mehr startet müßt, was eh nicht geht.

In der Chroot-Umgebung wird dann einfach das alte Profil ins Home kopiert und der Firefox gestartet. Problem gelöst.

Noch bessere Methode

Nichts geht über eine Iteration von Ideen hinaus, oder? 🙂 Vergesst einfach die Chroot, ist viel zu viel Aufwand dafür. Macht Gnome-Boxen auf, startet eine alte, versionsmäßig passende, LIVE-Disk von Eurer Distro, aktualisiert den Firefox auf die 72.0.2 und dann schiebt z.b. per SCP das Profil in die Box und startet den Firefox. Idealerweise legt Ihr vorher noch passend einen Benutzer gleichen Namens an, damit die Pfade stimmen, aber das sollte auch ohne gehen. Danach das geänderte Profil in Eurer Home verschieben. Fertig.

An die Updatemuffel dieser Welt

Eure Strategie ist genauso, wenn nicht noch, riskanter als einfach die Updates mitzumachen!

Sollte nämlich mal ein Update unter Linux nicht laufen, kann man mit einem einfachen Downgrade zurück und schon geht es wieder, außer der Bug wäre in einer Version wie 72.0.2, die die Datenbank an das neue Format anpasst, dann ist das Profil erst einmal unbrauchbar geworden. Deswegen.. Backups! Backups! Backups!