Videos in der Konsole mit ffmpeg konvertieren

Die eigene Action Cam produziert wunderbare Videos in Full HD (1080p) mit 60 Bildern pro Sekunde (FPS). Die Videos sind scharf und flüssig, aber mit einer Bitrate von etwa 65 Mbit/s auch recht groß. Nextcloud hilft mir zwar, die Videos auch anderen zugänglich zu machen, aber direktes Streaming ist bei den meisten Internetanschlüssen nicht möglich. Für Freunde mit an­ti­quierten Internetanschlüssen stelle ich deshalb eine qualitativ reduzierte Version bereit, hierfür nutze ich ffmpeg.

Hier ist ein einfaches Beispiel, wie man mit ffmpeg ein Video in 720p mit 30 FPS konvertiert. Ausgehend von einer Full HD Auflösung (1920 x 1080 Pixel) ergibt sich dann eine Auflösung von 1280 x 720 Pixeln.

Entscheidend für die Bitrate/Dateigröße und Qualität sind vor allem die Parameter -crf  und -preset, diese können bei Bedarf entsprechend angepasst werden. Eine Erklärung zum CRF Faktor findet man in Werner Robitzas Blog, übliche werte liegen zwischen 18 (kaum sichtbarer Qualitätsverlust) und 23 (Qualitätsverlust sichtbar, aber noch akzeptabel). Preset gibt an, wie viel Zeit sich ffmpeg für das Konvertieren nehmen darf. Je mehr Zeit man ffmpeg gewährt, desto besser fällt die Kompression und damit die Dateigröße aus. Weitere Informationen zum H.264 Encoding findet man im ffmpeg Wiki.

Außerdem soll das Video statt 60 FPS nur noch 30 FPS aufweisen, was mit  -r 30  erreicht wird. Der Unterschied fällt vielen nicht unbedingt auf, aber in Szenen mit rasanten Bewegungen sind 60 FPS deutlich von Vorteil.

Meine mit dieser Methode konvertierten Videos haben  je nach Ausgangsmaterial eine Bitrate von etwa 6 bis 14 Mbit/s, was meiner Meinung nach akzeptabel ist. Mit dem CRF Faktor wählt man nicht die gewünschte Bitrate, sondern die gewünschte Qualität. Die Bitrate variiert, weil sich das Video je nach Inhalt unterschiedlich gut komprimieren lässt.

Ich habe das ganze in ein kleines Script gepackt und bei Github veröffentlicht, hiermit kann ich schnell meine Videos konvertieren. Der Aufruf erfolgt unter Angabe der Eingabedatei, Auflösung und Bildrate:

2 Gedanken zu „Videos in der Konsole mit ffmpeg konvertieren

  1. Sehr spannend das ganze danke!

    Kurze Frage, Ich habe da eine Menge alter Videos und filme, die scheinbar sehr schlecht komprimiert wurden. Ichhabe da bei einem Video Testweise einfach VLC angewiesen ohne Codec Änderung das Video zu „konvertieren“ die Angaben unter Codec waren danach die selben aber das Video war um 1/3 kleiner.

    Sähest du eine Möglichkeit ein Script durch einen Ordner mit Unterordner laufen zu lassen welches alle Videos entgegen nimmt und sie einfach neu, möglichst verlustfrei komprimiert? Sekundär wäre das Wirrwarr von Dateiendungen los zu werden. Ich habe da Dateiendungen die kennt keiner mehr. Auch von alten Mobiltelefonen oder ganz speziell ein als SVCD.bin abgespeicherte DiaShow zum 50 Geburtstag. Das als .bin/cue vor liegt. Das Bin File spielt nur noch VLC ab (gibt einige Dateien die nur VLC abspielt). Ich weiss gar nicht mehr wie ich das (damals noch unter Windows) erstellt hatte. Und mittlerweile fürchte ich mich davor geliebte Daten zu verlieren.

  2. Hallo,

    ob ffmpeg ohne zusätzlichen Aufwand mit .bin Dateien umgehen kann, weiß ich ehrlich gesagt nicht. Das nächste Problem bei den Videos wären vermutlich die unterschiedlichen Auflösungen, diese sollte man am besten beibehalten.

    Eventuell hilft das ein wenig, der Audio Codec sollte schließlich auch angepasst werden, damit einige alte Formate später keine Probleme mehr bereiten. Aber da ich eigentlich immer mit dem gleichen Videomaterial zu tun habe, bin ich darin nicht sehr erfahren.

    ffmpeg -i video.mp4 -c:v libx264 -crf 20 -preset fast -codec:a libvorbis -qscale:a 5 video_out.mp4

    Wenn du das in ein Script (z.B. script.sh) packst, lässt sich die Rekursion leicht mit find umsetzen:

    find -exec script.sh {} \;

    Mit dem Parameter -iname „*.avi“ lässt sich das dann noch auf bestimmte Dateiendungen begrenzen.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.