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 đ
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 đ
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/
Pingback: Bino: der 3D Videoplayer - Marius Welt
Danke fuer diesen Eintrag. Ich bin total begeistert und werde es mal versuchen.
Das Eingabeformat „al“ fĂŒhrt keine 2D->3D-Konvertierung aus, so wie das hier (und im Bino-Artikel) suggeriert wird. Das ist lediglich ein Format um „echte“ 3D-Inhalte in ĂŒblichen 2D-Formaten zu speichern (im Gegensatz z.B. zu MVC, das freie Tools nicht beherrschen), dabei werden das linke und rechte Auge abechselnt gespeichert. Bei fester Kamera muss das Bild also in 2D-Ansicht sehr unangenehm wackeln, damit die 3D-Ansicht korrekt ist. Bewegt man die Kamera beim Filmen dagegen kostant nach rechts, kann die Konviertierung hier ggf. nette Ergenisse liefern, ansonsten kann da eigentlich nicht viel bei Herumkommen. Als Zielformat ist „al“ ĂŒbrigens auch deswegen schlecht, weil man bei H264 und Co. dann die Zwischenbildkompression kaputt macht und Wechselwirkungen zwischen linkem und rechtem Auge bekommt; „sbsl“ oder „abl“ sind besser. Bei MJPEG ist das natĂŒrlich keiin Problem.
Ich schreibe das hier deswegen, weil es *sehr* viel schlechte 3D-Inhalte gibt und dadurch auch immer wieder die gesamte Stereoskopie als Jahrmarkattraktion gesehen wird. Halbwegs passabel kann man 3D aus TiefenschĂ€tzungen (z.B. ĂŒber Fokus) bekommen, das geht m.W. aber nicht (qualitativ) in Echtzeit, aber z.B. ĂŒber G’Mic in GIMP.
Echte 3D-Fotos lassen sich ĂŒbrigens recht gut auch mit einer 2D-Kamera und viel Ăbung von unbewegten Motiven machen. Dazu kann man z.B. StereoPhotoMaker (Windows-Freeware) nutzen, geht auch prima per Wine. Stereoskopische Videos sind selbst mit passenden Kameras eine Herausforderung, wenn man seinem Publikum nicht Kopfschmerzen bereiten will.
Das Problem mit der Eingabe als „2D“ Material ist, so wie es Bino auch vorsieht, ist, daĂ das Ergebnis davon eher mau ist.
Ich hatte vor 10 Jahren ein Windows Programm aus der Doom9 Gegend, daĂ hat das extrem gut hinbekommen ohne die Framerate zu drĂŒcken. Das hat damals die Pixelbewegungen sauber analysiert und ein gutes Ergebnis angeliefert, natĂŒrlich auch nicht in Echtzeit.
Was empfiehlst Du denn als Modus um aus reinem 2D ein gutes Ergebnis zu bekommen?
Ich kenne keine (im Sinne von habe sie erfolgreich benutzt) frei verfĂŒgbaren Programme, die das wirklich gut hinbekommen. Es gibt einige Versuche mit neuronalen Netzen, z.B.: https://github.com/piiswrong/deep3d
Wie einfach das zu benutzen ist, weiĂ ich nicht.