Mit FFMPEG Videos für Web optimal speichern, nur heute, nur jetzt

Wer Videos über Vimeo oder youtube publiziert, muss sich mit solchen Fragen nicht beschäftigen. Für die zwei Leute, die selber noch Videos in mp4 konvertieren um sie dann in ihre Webseiten einbinden ist es vieleicht interessant.

Also vielleicht interessant zu erfahren, dass ich lange Zeit es falsch gemacht habe mit direkten Exporten aus FinalCut oder MPEGStreamclip. Es geht besser mit ffmpeg.

FFMPEG kann man recht leicht mit Homebrew installieren, wie man alles so leicht mit homebrew installieren kann.

Und dann im Terminal zum gewünschten Ordner navigieren und FFMPEG ausführen mit den Zauberoptionen:

ffmpeg -vcodec libx264 -vf "format=yuv420p" -preset slow -tune film -crf 25 -maxrate 4000k -bufsize 1000k -movflags +faststart -y videooutput.mp4 -i video.mov

Dies konvertiert video.mov in h264 mit guter Qualität und einer variablen Bitrate die nach oben hin auf 4Mbit begrenzt ist.

Im Einzelnen bedeutet es:

-vcodec libx264
Wir konvertieren in h264 und verwenden dafür den libx264 encoder.

-vf «format=yuv420p»
Der Farbraum wird umgewandelt, damit es kompatibler ist mit Quicktime. Interessanter Weise funktioniert es besser als -pix_fmt yuv420p, denn letzteres konvertiert die Farben ungenau, sie werden bleicher und grüner.

-preset slow
Wie schnell ffmpeg rechnen soll. slow spart ein paar Prozent bei der Dateigröße gegenüber medium und fast, und veryslow ist wirklich wirklich langsam.

-tune film
Dies sind interne Voreinstellungen von ffmpeg, die zu sowas wie in diesem Fall –deblock -1:-1 –psy-rd unset:0.15 führen. Die film Version entfernt tatsächlich kleineres Rauschen und führt zu geringerer Dateigröße. Man kann noch grain verwenden, wenn man das Rauschen beibehalten will, oder animation, falls es große einfarbige Flächen gibt.

-crf 25
Ist die Qualitätsstufe von 0 bis 53, wobei 18 visuell verlustfrei ist, und 23 standard ist. Ich verwende 25 für 1080p und 21 für 720p.

-maxrate 4000k -bufsize 1000k
Diese Einträge bestimmen die Obergrenze, was die Datenrate betrifft. Damit und mit -crf hat man eine variable Bitrate, die nach oben hin aber eingeschränkt ist. 4000k ist meistens gut genug und lädt bei normalem DSL schnell genug, kann man aber nach Belieben erhöhen. -bufsize bestimmt den Datenraum, aus dem die Datenrate berechnet wird - also je größer, desto ungenauer die Beschränkung. Für Streaming wäre eine kleine -bufsize von Vorteil, hier allerdings weniger kritisch.

-movflags +faststart
Konstruiert die Ausgabedatei so, dass sie schneller abgespielt wird, auch wenn noch nicht ganz geladen.

-y videooutput.mp4 -i video.mov
-y überschreibt die Ausgabedatei, falls eine gleichnamige Datei schon existiert, und -i video.mov ist eben das, was wir konvertieren wollen.

Alles in allem recht übersichtlich, oder? Steht auch alles im Encoding guide aber das liest ja niemand.