Spielwiese Home

Videohokuspokus mit ffmpeg


Ich muss vorausschicken, dass ich absolut keine Video-Expertin bin. Dieses ganze Howto beruht auf "learning by doing". Die Dokumentation zu ffmpeg ist dürftig (ich erwähnte es schon), sogar die manpage ist hoffnungslos veraltet. Die Dokumentation von Mplayer/mencoder, die auf ffmpeg basieren, ist deutlich besser. Da viele Optionen recht ähnlich heißen, hilft mitunter die mencoder Dokumentation weiter.

Warum ich dann nicht gleich mencoder verwende, fragt ihr?

Beispiel 11:

Nun will ich die Konvertierung der DVD (vgl. Beispiel 10) noch optimieren: Es ist immer ein Kompromiss zwischen Rechenzeit zur Kodierung, Dateigröße und Qualität.

Die erste Frage ist: "Welcher Container/Codec ist der beste?" - Die Antwort darauf kann schnell religiöse Züge annehmen, ich persönlich halte die Frage für nicht beantwortbar.

x264 wird hoch gelobt (mit Recht), aber mein schwaches Rechnerlein hat keine Freude damit - das Transkodieren ist sehr CPU-lastig und dauert ewig.
AVI - geht schnell, aber die Qualität bei gleicher Dateigröße ist eher mau.
Theora - ist in ffmpeg momentan sehr buggy, also nicht zu gebrauchen. ffmpeg2theora (es basiert auf ffmpeg) ist wiederum zu langsam beim Codieren (eventuell liegts auch am Codec selbst).

Schlussendlich fällt meine Wahl auf mp4: Das Transkodieren geht relativ schnell, die Datei ist klein genug bei brauchbarer Qualität.

Die Vorgehensweise:

  1. Seitenverhältnis und Größe (in Pixeln) ausknobeln
  2. Bitraten testen (Video und Audio)
  3. Qualität optimieren mit 2-Pass-Encoding
Die VOB-Datei, kopiert mit Mplayer (siehe Beispiel 10) auf meine Festplatte, hat folgendes Innenleben:
ffmpeg -i title2.vob

Input #0, mpeg, from 'title2.vob':
Duration: 00:23:11.5, start: 0.360000, bitrate: 5057 kb/s
Stream #0.0[0x1e0]: Video: mpeg2video, yuv420p,
              720x576 [PAR 64:45 DAR 16:9], 6430 kb/s, 25.00 fps(r)
Stream #0.1[0x80]: Audio: liba52, 48000 Hz, stereo, 192 kb/s
Stream #0.2[0x81]: Audio: liba52, 48000 Hz, stereo, 192 kb/s
Stream #0.3[0x21]: Subtitle: dvdsub

Der Film ist etwas über 23 Min. lang, hat eine sehr unpraktische Auflösung, zwei mal die gleiche Tonspur und Untertitel, die ich nicht brauche.

Ich fange mit den Grundeinstellungen an und arbeite mich zur gewünschen Qualität vor.
ffmpeg -i title2.vob -t 30 test1.mp4
-t 30 nur (die ersten) 30 Sek. des Filmes

Experimentieren:

Zur Auflösung: Ich möchte eine Letterbox (16:9 Film mit Balken oben und unten), die endgültige Höhe und Breite sollte aber durch 16 teilbar sein (Makroblocks). Das klappt mit dieser Auflösung nicht, deshalb muss ich skalieren (das Bild etwas verkleinern).

ffmpeg bietet eine Vielzahl an (schlecht dokumentierten) Filtern zur Verbesserung der Qualität an. Ich experimentiere auch tüchtig, aber das bisschen Verbesserung rechtfertigt meist die zusätzliche Rechenzeit nicht.
Nur -mbd rd bringt bei diesem Film und diesem Codec wirklich etwas (MacroBlock Decision).

Ein Tipp: ffmpeg zeigt eine Statuszeile, die so ausschaut:
frame=  758 fps= 42 q=5.1 Lsize=    3968kB time=30.0 bitrate=1083.0kbits/s
fps sind die Frames, die pro Sekunde berechnet werden. Damit kann man recht genau hochrechnen, wie lange die Umwandlung des Ganzen Filmes dauern wird. Mit Lsize kann man die Dateigröße hochrechnen.

Hoppla, die Audioqualität darf ich nicht vergessen. Eine Audio-Bitrate von 128kb sollte genügen. Da sich der Audiocodec ändert, verwende ich auch noch -async 50, damit Bild und Ton synchron bleiben.

Stunden später... :)
ffmpeg -i title2.vob -t 30 \
	-s 704x528 -aspect 4:3 -b 1200k -mbd rd \
	-ab 128k -async 50 test1.mp4 -padtop 66 -padbottom 66
-t 30 noch immer sind es nur 30 Sek.
-s 704x528 Breite und Höhe in Pixel, beides teilbar durch 16
-aspect 4:3 das Seitenverhältnis
-b 1200k Video-Bitrate in kbit/s
-mbd rd macroblock decision=rate distortion
-ab 128k Audio-Bitrate
-async 50 siehe oben
test1.mp4 die Ausgabe-Datei
-padtop 66 der obere Balken, 66 Pixel hoch
-padbottom 66 der untere Balken

Jetzt kommt der Clou: 2-Pass-Encoding

Das bedeutet, dass das selbe File zwei mal hintereinander Encodiert wird, wobei ffmpeg das erste mal ein Logfile schreibt, das es beim zweiten Durchgang zur Optimierung verwendet. Siehe Wikipedia. Es dauert dann zwar doppelt so lange, aber das ist es auch wert.
ffmpeg -i title2.vob -pass 1 -t 30 -s 704x528 -aspect 4:3 -b 1200k -mbd rd \
	-ab 128k -async 50 test11.mp4 -padtop 66 -padbottom 66

ffmpeg -i title2.vob -y -pass 2 -t 30 -s 704x528 -aspect 4:3 -b 1200k -mbd rd \
	-ab 128k -async 50 test11.mp4 -padtop 66 -padbottom 66
-pass 1 der erste Durchgang
-y ja, das erste File überschreiben
-pass 2 der zweite Durchgang
-t 30 30 Sek., wie gehabt

Diesen 30-Sekunden-Schnipsel begutachte ich kritisch. Nein, ich sehe absolut keinen Qualitäts-Unterschied mehr zur DVD. Auch die letzten Blockartefakte sind verschwunden. Und das bei weniger als einem Drittel der Dateigröße der VOB-Datei (DVD).

Dann kanns losgehen, jetzt kriegt mein Rechenknecht ordentlich zu tun:
ffmpeg -i title2.vob -pass 1 -s 704x528 -aspect 4:3 -b 1200k -mbd rd \
	-ab 128k -async 50 test11.mp4 -padtop 66 -padbottom 66

ffmpeg -i title2.vob -y -pass 2 -s 704x528 -aspect 4:3 -b 1200k -mbd rd \
	-ab 128k -async 50 test11.mp4 -padtop 66 -padbottom 66

Seite 3 von 3