FFmpeg: Diese nützlichen Funktionen erleichtern den Alltag

  Marcel Patrick G.   Lesezeit: 6 Minuten  🗪 1 Kommentar

Muss es immer eine komplexe GUI sein, um mal eben schnell den Audiostream vom Videostream zu trennen, ersetzen oder andere Dinge zu erledigen?.

ffmpeg: diese nützlichen funktionen erleichtern den alltag

Der ein oder andere FFmpeg-Anwender hat sich vielleicht schon folgende Fragen gestellt:

  1. Wie bekommt man nur den kurzen Audio-Part vom Videostream extrahiert?
  2. Was muss man machen, um nur den Videostream zu erhalten?
  3. Wieso ist dieses Video mit Audio so groß, geht das nicht etwas kleiner?
  4. Warum ist in diesem Subtitle ein Tipp-Fehler, der gehört korrigiert, aber wie bekomme ich diesen?

Bei jeder Fragestellung wird immer zuallererst die Suchmaschine um Rat gefragt. Dann wühlt man sich durch Unmengen an Suchergebnissen und bekommt nicht wirklich das Ergebnis, was man sich erhoffte. In diesem Artikel soll dagegen Abhilfe geschaffen werden.

Folgende ffmpeg-Befehle können auch einfach als Funktionen in der aliases-Datei definiert werden, dann braucht man nicht mehr die extrem lange Befehlszeile schreiben, sondern nutzt seinen persönlichen Kurzbefehl. Am Ende folgt ein Beispiel für ein Alias für die BASH-Shell, damit die Kreativität ein wenig angeregt wird.

Bevor es losgeht, ist dieser ffmpeg Befehl auch eine kleine Hilfe. Zeige alle verfügbaren Codecs an:

ffmpeg -codecs 2>&1 | less -S

Filter alle verfügbaren Codecs für mp3:

ffmpeg -codecs 2>&1 | grep -i 'mp3'

Um wie bei Ersten beschrieben muss folgender Command im Terminal eingegeben werden. Hinweise: Zeit-Format -> 00:00:00.000 entspricht hh:mm:ss.ms -ss "Start-Position" -t "Duration/Dauer" -vn Ignore Videostream -c:a Audio-Codec

ffmpeg -ss 00:00:00.000 -i DATEINAME -vn -c:a mp3 -t 00:00:00.000 -f mp3 OUTPUTNAME.mp3

Zu Zweitens sollte man folgenden Command verwenden, dann hat man einen Stumm-Film. Hinweise: -c:v Video-Codec -an Ignore Audiostream

ffmpeg -i DATEINAME -c:v copy -an OUTPUTNAME

Bei Drittens muss man eine kleine Berechnung anstellen, die nicht besonders schwer ist. Die Formel lautet "( Filesize in Kilo-Bits / Duration ) - Audio Qualität in Kilo-Bits". Beispiel: Um von der aktuellen Datei ein paar Informationen zu erhalten "Duration" kann folgender Command genutzt werden.

ffmpeg -i DATEINAME

Duration ausgelesen von der Datei: 1 Stunde = 60 60 = 3600s (Umgerechnet in Sekunden) Erwartete Dateigröße: 100 Megabyte ~= 10248100 kilobits (kbit/s) 2 Gigabyte ~= 102410248 2 kilobits (kbit/s)
Audio-Qualität (kbit/s): 320, 192, 128 oder 64 Formel-Einsetzen: ( 819200 / 3600 ) - 192 = 35,5555 ~ 36

ffmpeg -i DATEINAME -c:v copy -b:v 36k -c:a copy -b:a 192k OUTPUTNAME

Jetzt folgt Viertens die Subtitles/Untertitel extrahieren, sofern diese als Stream hinterlegt wurden.

ffmpeg -i DATEINAME

...Ausschnitt von der Ausgabe - Anfang... Stream #0:4(ger): Subtitle: Metadata: title : de_Full BPS-eng : 36 DURATION-eng : ... NUMBER_OF_FRAMES-eng: ... NUMBER_OF_BYTES-eng: ... _STATISTICS_WRITING_APP-eng: mkvmerge v51.0.0 ... 64-bit _STATISTICS_WRITING_DATE_UTC-eng: ... _STATISTICS_TAGS-eng: BPS DURATION NUMBER_OF_FRAMES NUMBER_OF_BYTES Stream #0:5(eng): Subtitle: Metadata: title : en_Full BPS-eng : 36 DURATION-eng : ... NUMBER_OF_FRAMES-eng: ... NUMBER_OF_BYTES-eng: ... _STATISTICS_WRITING_APP-eng: mkvmerge v51.0.0 ... 64-bit _STATISTICS_WRITING_DATE_UTC-eng: ... _STATISTICS_TAGS-eng: BPS DURATION NUMBER_OF_FRAMES NUMBER_OF_BYTES ...Ausschnitt von der Ausgabe - Ende...

Möchte man jetzt nur den Subtitle ger (-map 0:4) oder eng (-map 0:5) haben, dann sollte folgender Befehl genutzt werden.

ffmpeg -i DATEINAME -map 0:4 -f srt OUTPUTNAME.srt

Möchte man den modifizierten Subtitle wieder hinzufügen, dann folgt dieser Befehl.

ffmpeg -i DATEINAME -vf subtitles=OUTPUTNAME.srt OUTPUTNAME

Zum Schluss der versprochene Alias für die Bash-Shell. Zuallererst sollte man in folgender Datei "~/.bashrc" schauen, ob folgender Text enthalten ist. Falls nicht vorhanden, dann einfach am Ende der Datei hinzufügen.

...Ausschnitt von ~/.bashrc - Anfang... if [ -f ~/.bash_aliases ]; then . ~/.bash_aliases fi ...Ausschnitt von ~/.bashrc - Ende...

Dann folgende Datei "~/.bash_aliases" anlegen oder falls vorhanden, dann einfach Editieren.

gedit ~/.bash_aliases & ODER nano ~/.bash_aliases ODER vim ~/.bash_aliases

...Auschnitt ~/.bash_aliases - Anfang... GetSubtile() { local inputFilename=$1 local streamNumber=$2 local outputFilename=$3

ffmpeg -i "${inputFilename}" -map "${streamNumber}" -f srt "${outputFilename}"

} ...Auschnitt ~/.bash_aliases - Ende...

Dann statt einen neuen Terminal zu öffnen einfach folgenden Befehl eingeben "source ~/.bashrc" und sofort den neuen Alias ausprobieren mit "GetSubtile DATEINAME 0:5 OUTPUTNAME.srt".

Fazit: Eine alltägliche Aufgabe muss nicht immer mit einer schönen GUI bewältigt werden, sondern kann auch schnell über einen commandline-tool laufen. Dazu sei gesagt, es kommt auf den Rechner an, wie gut die Hardware-Konfiguration ist, je nachdem läuft das eine oder andere besser auf dem System.

P.S.: Als kleiner Tipp am Rande sei noch gesagt, dass die Konvertierung beschleunigt werden kann, wenn die GPU genutzt wird statt die CPU. Dies sorgt nochmals für eine kleine Zeitersparnis. Sofern eine NVidia-Grafikkarte verbaut ist, dann einfach nach entsprechenden Video-Codecs suchen.

ffmpeg -codecs 2>&1 | grep nvenc

Quellen:
Linux-Manpage-Command:
man ffmpeg (Deutsch/Englisch, je nachdem welche Systemsprache installiert wurde)

Quellen:
https://linux.die.net/man/1/ffmpeg (Englisch)

Bild:
https://miro.medium.com/v2/resize:fit:1100/format:webp/1*X0SULozK3WsQR_ZbBhwk-A.png

Tags

ffmpeg, video, audio, bash

kamome
Geschrieben von kamome am 6. Oktober 2023 um 16:42

Danke, besonders das mit den Untertiteln fand ich hilfreich! Beim Einpflegen des Artikels sind viele Code-Ausschitte nicht als solche gekennzeichnet und Markierungsangaben für die Editoren noch erhalten – das macht die Teile schwer lesbar. Nach Korrektur könnt Ihr diesen Kommentar gerne auf das erste Lob kürzen.