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/

5 thoughts on “FFMPEG: 2D zu 3D in Echtzeit

  1. Pingback: Bino: der 3D Videoplayer - Marius Welt

  2. 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?

Comments are closed.