DE
EN

FFmpeg

Wenn mich jemand fragen würde, was denn mein Lieblings-Encoder sei, so würde ich wahrscheinlich mit FFmpeg antworten. Das hat zwar noch niemand getan, (warum auch!? 😀 ) aber trotzdem möchte ich ihn hier vorstellen.
Seit einer halben Ewigkeit habe ich nun einen Notizzettel, auf dem verstreut die besten Kommandozeilen dafür liegen, da dachte ich mir, ich bringe etwas Ordnung in das Ganze und hoffe, dass es auch für andere hilfreich ist.

Warum FFmpeg ?

Bevor wir in die nerdigen Details gehen und wir uns fühlen können wie bei hackertyper.com, zunächst ein paar grundlegende Worte, wieso mich FFmpeg überzeugt hat, auch wenn es nicht mal eine grafische Oberfläche (GUI) hat und auf den ersten Blick etwas abschreckend wirken kann.

  • FFmpeg unterstützt quasi jedes Audio- und Video-Format. Man ist nicht an Presets gebunden wie bei den meisten Schnittsoftwares und kann sehr detailliert in den Encoding-Vorgang eingreifen.
  • Selbst ist der Tonmensch: Im Produktionsprozess, gerade bei Virtual Reality, kann es sehr viel Zeit sparen, sich das Video einfach selber so zu konvertieren, wie man es gerne hätte, ohne, dass man den Editor nochmal bitten muss, ein neues File zu rendern, welches dann noch hoch- und wieder runtergeladen werden muss.
  • Auch für den Editor interessant: In den meisten Fällen ist kein Re-Rendering nötig. Wenn z.B. nur der Ton ausgetauscht werden muss, kann FFmpeg einfach den Audio-Stream ändern, wobei das Video unangetastet bleibt und ist damit nicht nur für 360° Videos interessant.
  • Die meisten Programmcodes, wie hier, können einfach kopiert, eingefügt, und hier immer wieder gerne nachgeschlagen werden.
  • FFmpeg ist übrigens auch für das Streaming von herkömmlichen und VR-Videos interessant.

Wer wissen will, für welche Plattform man am besten welches Audio-Format nutzt, kann hier ebenso bei meinem Blog-Post dazu nachschauen: Spatial Audio format support for 360° Video Platforms & Players

Installation

Die Einrichtung von FFmpeg ist nicht ganz so einfach, wie man das heutzutage von anderen Softwares gewohnt ist, aber die Dateien lassen sich hier schonmal kostenlos runterladen.
Zum Glück gibt es im Internet sehr gute Anleitungen für Windows und Mac auf Deutsch, Englisch und anderen Sprachen, also einfach mal die Suchmaschine des Vertrauens fragen.
Wenn man alles richtig gemacht hat, kann man nun mit Strg+Rechtsklick die Eingabeaufforderung (cmd) direkt im Explorer öffnen und die unten beschriebenen Codes direkt nutzen.

Übersicht

Die Basics:

  • Audio aus Video entfernen
  • Audio aus Video extrahieren
  • Audio an Video anfügen
  • Audio.wav bei Video.mp4 ersetzen
  • Lautstärke von einem Video anpassen
  • Länge eines Media-File anpassen
  • Länge auf das kürzestes Media-File anpassen

360° Video spezifischer:

  • Bildrate halbieren
  • Video skalieren
  • Stereoskopisch zu Monoskopisch
  • Standbild loopen und Ton anhängen

Spatial Audio Encoding:

  • Vierkanaliges FOA.wav mit Video
  • Video für Google Jump Inspector encodieren
  • Higher Order Ambisonic HOA.wav zu Quicktime.mov
  • Quad-Binaural

Weitere interessante Codecs:

  • H.264 (MPEG-4/AVC: Advanced Video Coding)
  • H.265 (HEVC: High-Efficiency Video Coding)
  • DNxHD (Digital Nonlinear Extensible High Definition)
  • WebM
  • TIFF, EXR oder DPX Sequenzen
  • MPEG-H 3D Audio

Copy and Paste

Die Basics

Audio aus Video entfernen

Fangen wir einfach an. Der Prozess den ich mit am meisten nutze, ist es, die Audio-Spur, die meistens einem Videofile anhängt, komplett zu entfernen (nicht nur stumm schalten). Das stellt sicher, dass beim späteren Encoding kein Konflikt entsteht, wenn etwa der Ton ausgetauscht werden soll. Es wird ein neues Video-File mit identischem Bildinhalt erstellt, der Video-Stream wird einfach kopiert, enthält aber nun keine Audio-Spur mehr.

ffmpeg -i input.mp4 -c:v copy -an output.mp4

Audio aus Video extrahieren

Das gleiche geht quasi auch umgekehrt, wenn man etwa den Ton aus einem Video gewinnen will. Meistens ist der Ton hier schon durch AAC o.ä. verlustbehaftet komprimiert, ist also eher die unschöne Lösung, das Audio einfach in ein wav zurückzuführen, kann aber zu Testzwecken praktisch sein.

ffmpeg -i video.mp4 -vn -c:a copy -acodec pcm_s16le output.wav

Audio an Video anfügen

Möchte man Sound an ein stummes Video hinzufügen, geht das mit zwei Inputs, Bewegtbild und Ton. Hier muss der Ton in AAC umgewandelt werden, da mp4 als H264 kein Audio-Stream im Wav-Format unterstützt.

ffmpeg -i input.mp4 -i input.wav -c:v copy -c:a aac -b:a 320k output.mp4

Audio.wav bei Video.mp4 ersetzen

Will man nicht den Umweg gehen, erst ein neues Video-File, ohne Tonspur zu erstellen, sondern will das Audio einfach direkt austauschen, geht das so:

ffmpeg -i input.mp4 -i newaudio.wav -c:v copy -c:a aac -b:a 320k -map 0:v:0 -map 1:a:0 output.mp4

Lautstärke von einem Video anpassen

Ebenfalls sehr praktisch ist das Anpassen der Lautstärke. Diese Code kann für eine gleichmäßige Lautstärke bei mehreren Videos untereinander sorgen, ohne, dass neu gerendert oder gar neuer Ton exportiert werden muss.

ffmpeg -i input.mp4 -vcodec copy -af "volume=-15dB" -b:a 320k output.mp4

Länge eines Media-File anpassen

Möchte man nur einen bestimmten Teil eines Videos, oder Audios, etwa zum Testen nutzen, geht das wie folgt. Auch hier wird nicht neu gerendert, sondern lediglich die unerwünschten Teile des Videos entfernt.

ffmpeg -i input.mp4 -ss 00:01:00 -t 00:00:10 -c:v copy -c:a copy output.mp4

Länge auf das kürzestes Media-File anpassen

Im Normalfall sollten Bild und Ton die gleiche Länge haben, kann aber ebenfalls eine hilfreiche Abkürzung sein, da mit “-shortest” die Länge des finalen Files auf die kürzeste Dauer der beiden Inputs gesetzt wird.

ffmpeg -i input.mp4 -i audio.aac -shortest -c:v copy -c:a copy output.mp4

360° Video spezifischer

Bildrate halbieren

Ein Video, das z.B. mit 59,94 Frames aufgenommen wurde, auf 29,97 Frames konvertieren? FFmpeg wird automatisch eine Bitrate auswählen, welche in den meisten Fällen zu gering gesetzt wird. Manuell müsste sie mit dem Befehl -b:v 40m z.B. auf die Hälfte der ursprünglichen Bitrate gesetzt werden.

ffmpeg -i input.mp4 -r 30000/1001 output.mp4

Video skalieren

Zum Arbeiten sind Videos mit 4k oder mehr meist zu groß und belasten die Performance unnötig. Hierfür kann man die Höhe und Breite des Videos manuell festsetzen.

ffmpeg -i input.mp4 -s 1920*960 output.mp4

Alternativ kann der Videofilter die Ausmaße des Videos halbieren.

ffmpeg -i input.mp4 -vf scale=iw*.5:ih*.5 output.mp4

Stereoskopisch zu Monoskopisch

Hat man ein 3D 360° Video, sieht es auf der VR-Brille bestimmt toll aus, ist aber für herkömmliche Bildschirme weniger geeignet, da ein Auge zur Ansicht reicht, also 2D. Hier wird das Video in der Mitte, horizontal bzw. vertikal, halbiert.

Over-under (top-bottom):

ffmpeg -i input.mp4 -vf crop=h=in_h/2:y=0 output.mp4

Side-by-side (left-right):

ffmpeg -i input.mp4 -vf crop=w=in_w/2:x=0 output.mp4

Standbild loopen und Ton anhängen

Hat man gerade nur ein 360° Bild Panorama zur Verfügung und möchte den Ton schnell in ein Video umwandeln, kann das Standbild mit folgendem Befehl einfach hintereinander kopiert werden.

ffmpeg -loop 1 -i stillframe.jpg -i input.wav -map 1:a -map 0:v -c:a copy -channel_layout 4.0 -c:v libx264 -b:v 50000k -bufsize 50000k -shortest output.mov

Spatial Audio

Vierkanaliges FOA.wav mit Video

Nützlich für z.B. YouTube und SamsungVR. Einfacher geht es auch mit dem FB360 Encoder, der injiziert Metadaten automatisch, was sonst manuell noch mit dem "YouTube Spatial Media Metadata Injector" getan werden muss. Funktioniert auch für FuMa oder Quad, eben alles, was vierkanalig ist, meistens ist es aber ein First Order Ambisonic im ambiX Format.

ffmpeg -i input.mp4 -i input.wav -c:v copy -c:a aac -b:a 512k output.mp4

Video für Google Jump Inspector encodieren

Jump Inspector kann Ambisonics erster Ordnung und Ambisonics dritter Ordnung, benötigt darüber hinaus aber auch das Video in einem bestimmten Format. Außerdem liest der Google Jump Inspector die Meta-Daten aus dem Dateinamen, diesen also unbedingt anpassen, wie hier vorgeschlagen.

ffmpeg -i input.mp4 -c:v libx264 -b:v 40m -vf scale=3840:2160 -r 30 -profile main -pix_fmt yuv420p -an output.360.mono.mp4

Higher Order Ambisonic HOA.wav zu Quicktime .mov

Da mp4 keine 16 Audio-Kanäle unterstützt, muss das Video in ein Quicktime-Format gebracht werden. Dafür kann der mov-Container den Ton verlustfrei als wav-Stream abspielen, was für den Google Jump Inspector, GoPro VR Player 3 oder VLC Media Player interessant sein kann. Ton ist ein wav in Ambisonic dritter Ordnung mit 16 Kanälen.

ffmpeg -i input.mp4 -i input.wav -c:a copy -c:v copy output.mov

Quad-Binaural

Ein kleiner Spezialfall ist quad-binaural, gelegentlich auch als omni-binaural bezeichnet, welches der SamsungVR Player unterstützt. Auch hier werden die Meta-Daten aus dem Dateinamen gelesen. Vor- und Nachteile dieses Exoten können hier nachgelesen werden: Formate für 360° Sound ffmpeg -i input.mp4 -i 0.wav -i 90.wav -i 180.wav -i 270.wav -map 0:v -map 1:a -map 2:a -map 3:a -map 4:a -vcodec copy -c:a aac -b:a 512k output_mono360_quadraphonic_binaural.mp4

Weitere interessante Codecs

H.264 (MPEG-4/AVC: Advanced Video Coding)

Das wohl am meisten verbreitetste Format für Videos ist aktuell wohl H264. Dieser unterstützt aber Audio nicht als .wav, sondern z.B. AAC und ist damit kein verlustfreier Sound, was beim Arbeiten mit 3D Audio später eine Rolle spielt.

ffmpeg -i input.mp4 -c:v libx264 -b:v 50M -c:a aac -b:a 320K output.mp4

H.265 (HEVC: High Efficiency Video Coding)

H265 ist immer mehr im Kommen, aber noch nicht so weit verbreitet. Er kann die Dateigröße eines Video bei gleicher Qualität im Vergleich zu H264 um die Hälfte reduzieren, ist aber entsprechend rechenintensiv.

ffmpeg -i input.mp4 -c:v libx265 -b:v 25M -c:a aac -b:a 320K output.mp4

DNxHD (Digital Nonlinear Extensible High Definition)

Die meisten Digital Audio Workstations (DAW) wie Avid ProTools können Rechenleistung sparen, in dem das Video auf eine geringe Auflösung gebracht und in einen Codec gewandelt wird, der weniger prozessorlastig ist, als etwa H264.

ffmpeg -i input.mp4 -vf scale=iw*.5:ih*.5 -map 0:v -an -c:v dnxhd -pix_fmt yuv422p -profile:v dnxhr_lb -y output.mov

WebM

WebM, ist ein Container für die von Google eingeführten Videocodecs VP8 und VP9, welcher für gewöhnlich das Audioformat Opus als .ogg nutzt, aber einige Zeit zum Encodieren benötigt.

ffmpeg -i input.mp4 -c:v libvpx -crf 4 -b:v 50M -map 0:v:0 -map 0:a:0 -c:a libvorbis -af "pan=quad|c0=c0|c1=c1|c2=c2|c3=c3" -preset ultrafast output.webm

TIFF, EXR oder DPX Sequenzen

Solche Dateitypen erreichen die Audio-Postproduktion eher selten, ist aber trotzdem nicht uninteressant. Hier wird nicht nur eine Datei als Input gesetzt, sondern es muss auch eine Framerate für den Input festgelegt werden, damit die Länge des späteren Videos klar ist. Im Output kann die Framrate mit “-r” wieder angepasst werden.

ffmpeg -i input_0001.dpx -framerate 60 -c:v libx264 -b:v 30M -r 30 -an output.mp4

MPEG-H 3D Audio

Ich konnte noch nichts über dieses Format bezüglich FFmpeg finden, bin aber gespannt wie es sich entwickelt in Sachen Objekt-basiertes Audio und Audio Definition Model (ADM). Ich denke, dass FFmpeg mit den ganzen Meta-Daten unhandlich werden kann und vermute, dass hier spezielle Encoder zu Einsatz kommen werden, aber wir werden sehen.

Troubleshooting

FFmpeg zeigt Fehlermeldungen meist in roter Schrift an. Diese können schnell gegoogelt werden. Sonst helfen spontan diese kleinen Tricks:

  • Leerzeichen im Dateinamen beseitigen
  • Dateipfad enthält nicht die benötigte(n) Dateie(n)
  • Videocodec unterstützt das Format der Variablen nicht und FFmpeg findet keine passenden Alternativen.

Ebenfalls hilfreich

Wer ein Mac-User ist und sich den ganzen Spaß verpassen will, der kann iFFmpeg probieren, oder einfach per Drag and Drop seine Dateien mit Droplets von AudioEase360 konvertieren. Danke dafür!
Windows Nutzer können myFFmpeg ausprobieren.

Außerdem hat sich bei der Erstellung dieses Artikels Github als hilfreich erwiesen und hat noch eine Übersicht der Variablen. FFmpeg Cheat Sheet for 360° video.

Hier das eigene Wiki von und zu FFmpeg: https://trac.ffmpeg.org/wiki

Mit dem Kommando ffmpeg -i input.mp4 kann man Dateien auch analysieren. Für mich praktischer ist aber die Verwendung einer anderen Software, wie MediaInfo passender, da hier Dateien per Drag and Drop schneller und übersichtlicher kontrolliert werden können.

Danke auch an sämtliche Foren, die per Suchmaschine auch meine Fragen beantworten konnten. Ich hoffe mit diesem Artikel ist nicht nur mir geholfen.

zurück zum Blog