Kleine FFmpeg-Anleitung

Moderator: Macmacfriend

Benutzeravatar
polysom
Beiträge: 486
Registriert: So 6. Feb 2022, 21:24
Wohnort: Da wo Kekse 🍪 sind
Kontaktdaten:

Kleine FFmpeg-Anleitung

#1

Beitrag von polysom »

Kleine FFmpeg-Anleitung

Wer sich schon einmal mit Audio- oder Videokonvertierung beschäftigt hat, ist sicher schon einmal über FFmpeg gestolpert. Dabei handelt es sich um ein extrem vielseitiges Werkzeug um Video/Audio-Dateien zu bearbeiten, zu konvertieren, zu streamen und vieles mehr. Es kommt in Form eines Kommandozeilenprogramms daher und wird klassisch über das Terminal bedient und kann daher auch für eigene Skripte oder Finder/Automator-Aktionen verwendet werden. Es gibt aber auch verschiedene Benutzeroberflächen von Drittanbietern (siehe unten). Sehr viele Programme verwenden unter der Haube FFmpeg: https://trac.ffmpeg.org/wiki/Projects. Da ich dieses Werkzeug recht oft benutze wollte ich es hier einmal kurz in Form einer kleinen Anleitung vorstellen.

Die Hauptseite von FFmpeg befindet sich hier: https://www.ffmpeg.org
Der Wikipedia-Artikel informiert über einige Hintergründe und die Historie: https://de.wikipedia.org/wiki/FFmpeg

FFmpeg ist offen (Open Source). Das heißt, jeder kann den Quellcode einsehen und Patche einbringen. Die bekanntesten Namen und Modul-Verantwortlichen hinter FFmpeg sind: https://www.ffmpeg.org/consulting.html Der aktivste und bekannteste ist dabei u.a. Prof. Dr. Michael Niedermayer.
Der Quellcode kann auf Github gefunden werden: https://github.com/FFmpeg/FFmpeg

Neben FFmpeg gibt es noch die Komponente ffplay, diese dient zum Abspielen von Audio/Video-Dateien und kann zur Vorschau von FFmpeg-Befehlen verwendet werden. Darauf wird an dieser Stelle aber nicht näher eingegangen. Die Dokumentation dazu findet sich hier: https://ffmpeg.org/ffplay.html




1. FFmpeg installieren

Dafür gibt es mehrere Möglichkeiten. Gehen wir dazu zuerst zur Downloadseite:
https://www.ffmpeg.org/download.html
Hier finden sich mehrere Möglichkeiten. Der prominente Button ganz oben lädt ein tar.bz2-Archiv des aktuellen Quellcodes der Release-Version. Dazu kommen wir gleich noch, das ist was für Bastler.
Weiter unten gibt es unter "Get the packages" schon fertig erstellte Versionen von FFmpeg. Diese wurden mit vordefinierten Funktionalitäten erstellt und genügt für die meisten Standardanwendungen. Klickt man auf den Apfel kommt man zu den "OS X Packages". Man sollte hier einen "Static build" nehmen. Die entpackte Datei "ffmpeg" verschiebt man dann am besten in den unsichtbaren Ordner /usr/local/bin. Dazu im Finder unter Gehe zu --> Gehe zum Ordner... den Pfad /usr aufrufen. Ist dort kein Ordner /local/bin, erstellt man ihn. Sodann ist FFmpeg einsatzbereit.

Will man sich seine FFmpeg-Version selber erstellen benötigt man den Quellcode. Selber erstellen hat den Vorteil, dass man selber entscheiden kann welche Funktionalitäten/Codecs FFmpeg unterstützen soll. Hier können auch Codecs aktiviert werden die aus Lizenzgründen in der schon vorgefertigten Version nicht enthalten sind.

a) Als erstes lädt man sich dazu den Quellcode von hier: https://www.ffmpeg.org/download.html
Entweder oben unter "Download" die momentan stabile Releaseversion oder weiter unten unter "Download Snapshot" den aktuellen (evtl. instabilen) Code.

b) Nach dem Entpacken öffnet man das Terminal und geht mit cd in den Ordner

Code: Alles auswählen

$ cd ffmpeg
Jetzt kann man im Terminal mit

Code: Alles auswählen

$ ./configure --help
schon einmal alle Optionen anschauen mit denen man seine Version konfigurieren kann. Je nachdem welche Funktionen man will lassen sich Dinge an- (--enable) oder abstellen (--disable). Einfach loslegen geht aber nicht, denn je nach Funktionalität benötigt FFmpeg sogenannte Dependencies und außerdem Xcode als Entwicklungsumgebung.

c) Der nächste Schritt ist daher sich Xcode zu installieren: https://developer.apple.com/xcode/
Sodann installiert man die Command Line Developer Tools mit "$ xcode-select --install" und öffnet danach Xcode kurz einmal, bestätigt die Nutzerbedingungen und prüft unter Preferences... --> Locations, dass unter "Command Line Tools" etwas eingetragen ist. Falls nicht, einfach kurz auf das Dropdownmenü klicken. Dann kann man Xcode wieder schließen.

c) Hat man sich überlegt welche Funktionalitäten FFmpeg haben soll, muss man nun alle benötigten Dependencies installieren. Das geht am einfachsten mit Paketverwaltungsprogrammen wie MacPorts oder Homebrew. Wie das genau funktioniert kann im Internet gefunden werden. Wichtig ist, dass das Paket pkgconfig mit installiert wird. Ein Beispiel unter MacPorts könnte z.B. so aussehen

Code: Alles auswählen

$ sudo port -N install libass libbluray faac libfdk-aac libmodplug lame libopus rtmpdump soxr libssh speex libtheora libvpx wavpack x264 x265 xvid libcdio-paranoia samba3 pkgconfig libidl yasm nasm
d) Nun ist man soweit, dass man endlich loslegen kann. Dazu geht man wieder mit cd in den Ordner "ffmpeg" und konfiguriert seine Version mit den gewünschten Optionen. Das kann zum Beispiel wie folgt aussehen:

Code: Alles auswählen

$ ./configure --enable-swscale --enable-avfilter --enable-fontconfig --enable-gpl --enable-version3 --enable-libass --enable-libbluray --enable-libfreetype --enable-libsoxr --enable-libmp3lame --enable-libtheora --enable-libvorbis --enable-libvpx --enable-libwavpack --disable-ffplay --disable-debug --enable-libmysofa --enable-libx264 --enable-libx265 --enable-libxvid --enable-nonfree --enable-libfdk-aac --enable-librtmp --enable-libsmbclient --enable-opencl --enable-libssh --enable-openssl --enable-bsf=aac_adtstoasc --enable-encoder=h264_videotoolbox --enable-encoder=hevc_videotoolbox --disable-sdl2 --extra-ldflags="-L/opt/local/lib"
(Die --extra-ldflags sind nur wichtig wenn MacPorts verwendet wird)

Bekommt man hierbei eine Fehlermeldung der Art "XY not found using pkg-config", dann fehlt entweder pkg-config selbst oder die in der Meldung angesprochene Dependency XY.
Geht alles glatt folgt ein

Code: Alles auswählen

$ make build
(hier kann die -j Option verwendet werden, z.B. make -j6 build)
und danach ein

$ sudo make install
Danach ist alles installiert und man kann sein FFmpeg verwenden.


2. FFmpeg verwenden

Eine Dokumentation über alle Funktionen findet sich hier: https://www.ffmpeg.org/documentation.html
Da FFmpeg so vielseitig ist, kann ich hier nicht auf alles eingehen. Aber ich würde hier gerne ein paar Beispiele angeben um die Vielseitigkeit von FFmpeg zu zeigen.

Code: Alles auswählen

$ ffmpeg -codecs
und

Code: Alles auswählen

$ ffmpeg -formats
bzw.

Code: Alles auswählen

$ ffmpeg -encoders
oder

Code: Alles auswählen

$ ffmpeg -decoders
zeigt alle unterstützten Codecs/Encoder/Decoder und Formate und die dazugehörigen Kürzel. Die Kürzel sind wichtig für die Terminaleingabe.

Fangen wir ganz einfach an, sagen wir, wir wollen uns eine Datei genauer anschauen. Das geht mit FFmpeg wie folgt:

Code: Alles auswählen

$ ffmpeg -i /Pfad/zur/Datei.endung
Das -i begegnet uns dabei noch öfter, das zeigt FFmpeg einfach die Eingabedatei (Input) an. Bei einer Video-Datei könnte das Ergebnis wie folgt aussehen:

Code: Alles auswählen

$ ffmpeg -i /Volumes/Filme/Film.m4v 
ffmpeg version N-93077-g075fd5ba45 Copyright (c) 2000-2019 the FFmpeg developers
built with Apple LLVM version 10.0.0 (clang-1000.11.45.5)
configuration: --enable-swscale --enable-avfilter --enable-fontconfig --enable-gpl --enable-version3 --enable-libass --enable-libbluray --enable-libfreetype --enable-libsoxr --enable-libmp3lame --enable-libtheora --enable-libvorbis --enable-libvpx --enable-libwavpack --disable-ffplay --disable-debug --enable-libmysofa --enable-libx264 --enable-libx265 --enable-libxvid --enable-nonfree --enable-libfdk-aac --enable-muxer=mov --enable-muxer=mp4 --enable-muxer=ipod --enable-encoder=eac3 --enable-encoder=ac3 --enable-encoder=flac --enable-librtmp --enable-libsmbclient --enable-opencl --enable-libssh --enable-openssl --enable-bsf=aac_adtstoasc --enable-encoder=h264_videotoolbox --enable-encoder=hevc_videotoolbox --disable-sdl2
libavutil 56. 26.100 / 56. 26.100
libavcodec 58. 46.100 / 58. 46.100
libavformat 58. 26.100 / 58. 26.100
libavdevice 58. 6.101 / 58. 6.101
libavfilter 7. 48.100 / 7. 48.100
libswscale 5. 4.100 / 5. 4.100
libswresample 3. 4.100 / 3. 4.100
libpostproc 55. 4.100 / 55. 4.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '/Volumes/Filme/Film.m4v':
Metadata:
major_brand : mp42
minor_version : 512
compatible_brands: isomiso2mp41
creation_time : 2019-01-05T00:15:49.000000Z
title : Mein tolles Video
encoder : HandBrake 20190101165012-2a01285-master 2019010301
Duration: 01:43:32.57, start: 0.000000, bitrate: 3418 kb/s
Stream #0:0(und): Video: hevc (Main 10) (hvc1 / 0x31637668), yuv420p10le(tv, bt709), 1280x544 [SAR 1:1 DAR 40:17], 3286 kb/s, 24.16 fps, 24.08 tbr, 90k tbn, 24.16 tbc (default)
Metadata:
creation_time : 2019-01-05T00:15:49.000000Z
handler_name : VideoHandler
Stream #0:1(eng): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 124 kb/s (default)
Metadata:
creation_time : 2019-01-05T00:15:49.000000Z
handler_name : SoundHandler
Stream #0:2(deu): Subtitle: mov_text (tx3g / 0x67337874), 1280x81, 0 kb/s (default)
Metadata:
creation_time : 2019-01-05T00:15:49.000000Z
handler_name : SubtitleHandler
At least one output file must be specified
Was sagt uns das nun? Man sieht oben erst einmal allgemeine Dinge, wie FFmpeg-Version, Konfiguration usw. Darunter sieht man unter "Stream #0:0(und): Video", dass es sich um ein HEVC-Video der Größe 1280x544 mit eine Datenrate von 3286 kb/s und 24,16 Bildern pro Sekunde handelt. "Stream #0:1(eng): Audio" gibt an, dass der englische Ton als AAC mit 48kHz in Stereo vorliegt und "Stream #0:2(deu): Subtitle" gibt an, dass der Film eine deutsche Untertitelspur hat.

Nun wollen wir ganz einfach eine Audio-Datei (FLAC) in AAC umwandeln:

Code: Alles auswählen

$ ffmpeg -i /Eingabe.flac -acodec aac /Ausgabe.m4a
Dabei ist "Eingabe.flac" der Pfad zur Eingabedatei, -acodec ist der Befehl um FFmpeg zu sagen welchen Audiocodec man gerne hätte (hier AAC) und "Ausgabe.m4a" der Pfad zur Ausgabedatei, sprich der Ort und Name unter dem man die neue Datei gerne abgespeichert haben möchte. Die Ausgabedatei muss mit der richtigen Dateiendung benannt werden!

Sagen wir nun, wir wollen nicht nur den Codec ändern:

Code: Alles auswählen

$ ffmpeg -i /Eingabe.flac -acodec aac -ab 320k -ar 44100 -ac 2 /Ausgabe.m4a
Hier legt -ab die Datenrate auf 320 kBit/s fest, -ar die Abtastrate auf 44,100 kHz und -ac setzt die Kanäle auf 2 (Stereo).

Kommen wir nun zu Video. Genau wie -acodec für Audio gibt es auch den Schalter -vcodec für Video. Zum Beispiel:

Code: Alles auswählen

$ ffmpeg -i /Eingabe.mkv -acodec copy -vcodec hevc_videotoolbox -b:v 20000k -tag:v hvc1 -profile:v main /Ausgabe.mp4
Hier bedeutet "-acodec copy", dass der Ton ohne Änderung durchgereicht werden soll. Der Befehl "-vcodec hevc_videotoolbox" gibt an, dass das Video in den Codec HEVC umgewandelt und dazu der Videotoolbox-Codec genommen werden soll, "-b:v 20000k" setzt die Videodatenrate und "-tag:v hvc1" den Video-Tag, da Apple nur HEVC-Videos mit dem hvc1-Tag unterstützt. Mit -profile:v lässt sich das Videoprofil wählen.
Wenn benötigt ließen sich mit -metadata noch die Metadaten der Datei ändern: https://wiki.multimedia.cx/index.php/FFmpeg_Metadata

Jetzt sind wir soweit, dass wir Audio- und Video-Dateien in jedes beliebige Format wandeln können. Dabei lässt sich -acodec und -vcodec beliebig (innerhalb der Spezifikationen) variieren. Hierbei findet sich auch oft -c:a als Kurzform von -acodec und -c:v als Kurzform von -vcodec.

Was aber tun, wenn die Datei z.B. mehrere Audiostreams enthält, man aber nur einen Stream davon umwandeln möchte bzw. alle Audiostreams anders? Das geht mit dem Befehl -map. Dazu schaut man sich mit ffmpeg -i zuerst das Video genauer an. Wichtig ist der Teil mit "Stream #0:X", das ist der Identifier des Streams, den man nun benötigt. Sagen wir, wir wollen nur den Videostream 0:0 und den Audiostream 0:2 behalten, aber 0:1 und Kapitelmarker entfernen, kann man folgendes verwenden:

Code: Alles auswählen

$ ffmpeg -i /Eingabe.mp4 -map 0:0 -map 0:2 -c copy -map_chapters -1 /Ausgabe.mp4
Als Alternative wäre auch sowas wie

Code: Alles auswählen

-map 0:a:2
oder

Code: Alles auswählen

-codec:a:2 copy
möglich. Dabei entfernt "-map_chapters -1" die Kapitelmarker und "-c copy" sagt, dass Audio und Video ohne Änderung durchgereicht werden soll. Mit -vn / -an / -sn liese sich der Videostream / Audiostream / Untertitelspur entfernen.
-map ist ein extrem vielseitiger Befehl, mit dem sich noch weit mehr tun lässt. Näheres kann auch hier gelesen werden:
http://ffmpeg.org/ffmpeg.html#Advanced-options
https://trac.ffmpeg.org/wiki/Map
https://trac.ffmpeg.org/wiki/AudioChannelManipulation
https://github.com/stoyanovgeorge/ffmpe ... -in-FFMPEG

Kommen wir nun zu etwas anderem Nützlichen das man mit FFmpeg machen kann, Videos schneiden. Nehmen wir an, wir haben ein Video und wollen daraus 120 Sekunden als neue Datei speichern. Dazu gibt es verschiedene Möglichkeiten, z.B. gehen wir wie folgt vor:

Code: Alles auswählen

$ ffmpeg -ss 00:01:00 -i /Eingabe.mp4 -to 00:02:00 -c copy /Ausgabe.mp4
Bedeutet, starte im Video bei Zeitpunkt 00:01:00 (Minute 1) und schneide daraus ein zweiminütiges Stück heraus.
Näheres siehe bei: https://trac.ffmpeg.org/wiki/Seeking

Nachdem wir das Video geschnitten haben, fügen wir es wieder zusammen. Auch das geht mit FFmpeg, der Befehl dazu nennt sich concat. Sind alle Ausgangsdateien im selben Format, geht dies am einfachsten. Ein Zusammenfügen von drei Einzeldateien wäre hier:

Code: Alles auswählen

$ ffmpeg -i "concat:Eingabe1.mp4|Eingabe2.mp4|Eingabe3.mp4" -c copy Ausgabe.mp4
Näheres dazu hier: https://trac.ffmpeg.org/wiki/Concatenate

Angenommen wir haben Video und Ton in getrennten Dateien und wollen dies nun zu einer Datei zusammenfügen (muxen). Auch das lässt sich mit FFmpeg machen:

Code: Alles auswählen

$ ffmpeg -i /Eingabe1.mp4 -i /Eingabe2.m4a -c copy -map 0:v:0 -map 1:a:0 -shortest /Ausgabe.mp4
Mit "-map 0: v:0" sagen wir einfach, dass das Video von der ersten Eingabe der neue Video-Stream werden soll, "-map 1: a:0" sagt, die zweite Eingabe soll der neue Audio-Stream werden. Mit -shortest wird lediglich angegeben, dass alles an die Länge des kürzesten Streams angeglichen werden soll.

Kommen wir nun zu einem weiteren sehr großen Feld von FFmpeg, Filter. FFmpeg beinhaltet eine sehr große Anzahl an Filtern mit dem sich Audio- und Videodateien verändern lassen. Gehen wir als Beispiel davon aus, wir haben eine Audiodatei bei der wir die Stereobreite erhöhen wollen. Das ginge mit dem Filter stereowiden:

Code: Alles auswählen

$ ffmpeg -i /Eingabe.m4a -filter:a stereowiden -vn /Ausgabe.m4a
Hierbei bedeutet -filter:a, dass ein Audiofilter angewendet werden soll, danach steht dann der Name des Filters. Selbes ginge auch für Videofilter mit -filter:v. Gelegentlich findet man auch die Kurzform -af und -vf.

Filter lassen sich mit anderen Funktionen kombinieren. Nehmen wir an wir wollen ein Video in HEVC und den Audiostream in AAC umwandeln und gleichzeitig die Lautstärke um 150% anheben. Beim Video soll durch einen Filter die Helligkeit um 0,1 und der Kontrast auf das Doppelte erhöht werden. Dann kommen wir zu diesem Ergebnis:

Code: Alles auswählen

$ ffmpeg -i /Eingabe.mkv -acodec aac -filter:a "volume=1.5" -vcodec hevc_videotoolbox -b:v 20000k -tag:v hvc1 -profile:v main -vf "eq=brightness=0.1:saturation=2" /Ausgabe.mp4
Näheres zu Audio volume: https://trac.ffmpeg.org/wiki/AudioVolume

Das war jetzt nur ein kleiner Einblick in Filter. Wie man in der Übersicht sehen kann, gibt es zu so ziemlich jeder Manipulationen Filter: http://ffmpeg.org/ffmpeg-filters.html

FFmpeg eignet sich auch für Live-Streaming oder um Streams aufzuzeichnen. Da ich damit keine Erfahrungen habe, hier nur ein paar Links:
https://trac.ffmpeg.org/wiki/StreamingGuide
https://forum.ubuntuusers.de/topic/ffmp ... st-8877609
https://stackoverflow.com/questions/162 ... am-to-file
FFmpeg beherrscht dabei eine Reihe verschiedener Protokolle (UDP, TCP, RTMP usw.) : https://ffmpeg.org/ffmpeg-protocols.html

Außerdem lässt sich mit FFmpeg der Bildschirm bzw. von Eingabegeräten (Kamera/Mikrofon) aufzeichnen: https://trac.ffmpeg.org/wiki/Capture/Desktop

Kommen wir noch zu einem letzten Punkt. Die Befehle bisher lassen sich nur immer auf eine Datei anwenden. Hat man nun z.B. einen Ordner mit 20 Dateien die umgewandelt werden sollen, dann ist das so sehr mühsam. Allerdings lassen sich mit einem Kniff FFmpeg-Befehle auch im Stapel (Batch) ausführen. Angenommen wir wollen einen Ordner an FLAC-Audiodateien in ALAC umwandeln, ginge das sehr einfach so:

Code: Alles auswählen

$ for file in *.flac; do ffmpeg -i "$file" -vn -acodec alac "${file%.flac}".m4a; done
Dazu einfach mit cd in den Ordner mit den FLAC-Dateien gehen und obigen Befehl ausführen. Nach einer gewissen Zeit befinden sich dann 20 m4a-Dateien in dem Ordner. Diese Methode lässt sich dementsprechend anpassen und für vielerlei Zwecke umbauen.

Soweit eine kleiner Abriss der Möglichkeiten von FFmpeg. Vertiefend empfehle ich die Dokumentation: https://www.ffmpeg.org/ffmpeg.html


3. Eine Benutzeroberfläche für FFmpeg

Wer das Terminal nicht so mag, für den gibt es auch Benutzeroberflächen mit denen sich FFmpeg verwenden lässt. Dabei ist man dann allerdings auf die Befehle beschränkt die der Entwickler des Programms implementiert hat. Dabei gibt es hier mehr für Windows, für Mac ist die Auswahl etwas dürftig.

Am bekanntesten für Mac ist hier ffworks (Nachfolger von iFFmpeg), was aber kostenpflichtig ist: https://www.ffworks.net
Adapter gäbe es noch: https://macroplant.com/adapter
Bei Datura hat sich entwicklungsmäßig leider seit Jahren nichts mehr getan: http://datura.sourceforge.net
Bei ffmpegX ist auch seit Jahren Stillstand: https://www.ffmpegx.com
Adapter gäbe es noch: https://macroplant.com/adapter



Das war nun ein sehr kleiner Einblick in FFmpeg. Ich kann nur dazu raten mal selbst damit zu experimentieren, man wird begeistert sein, was sich damit so alles machen lässt. Das Internet hält viele Befehle für so ziemlich jede Anwendungsmöglichkeit bereit. Falls man bei einem kniffligen Problem den passenden Befehl nicht findet oder sonstige Fragen hat, kann ich die FFmpeg-user-Mailingliste empfehlen: https://ffmpeg.org/mailman/listinfo/ffmpeg-user
Da FFmpeg ein Kommandozeilenprogramm ist, lässt es sich auch für eigene Skripte oder Finder/Automator-Aktionen verwenden.

Viel Spaß!
Benutzeravatar
mama
Beiträge: 1673
Registriert: Di 8. Feb 2022, 10:48

#2

Beitrag von mama »

🙏🏻
Antworten