Audiospuren in MP4 Dateien managen mit LossLessCut

Ich habe zu diesem Thema schon einmal einen Artikel mit dem Kommandozeilen Tool ffmpeg geschrieben “Audiospuren aus Videodateien entfernen und hinzufügen – ffmpeg” , aber für mal eben schnell gibt es schon lange eine schöne GUI basierte Variante mit dem super Tool LossLessCut, das für Linux, Windows und Mac verfügbar ist.

Am Ende des Artikels gibt es noch mehr Verweise auf ffmpeg und Audio/ Videomanipulation hier auf diesem Blog.

In aller Kürze: LossLessCut ist ein Tool mit dem Videodateien bearbeitet werden können, ohne dass Video oder Audio neu berechnet werden müssen. Es werden also lediglich vorhandene Spuren bearbeitet bzw geschnitten und dann wird das Ergebnis innerhalb von Sekunden gespeichert.

Zusätzlich kann mit LossLessCut auch der Video Container wie z.B. MP4 oder MKV bearbeitet werden, so dass Audio oder Videospuren herausgenommen oder hinzugefügt werden können.

Praktische Beispiele:

  • Du hast zweimal das selbe Video, nur einmal in deutsch und einmal in englisch. Aber du hättest gerne nur EIN Video, das beide Sprachen beinhaltet. Also zweisprachig, die du dann z.B. in VLC mit dem Shortcut “b” umschalten kannst.
  • Du hast ein Video, dessen Audioqualität komplett unterirdisch ist (viel viel viiiiiieel zu leise, Störungen, Rauschen) und würdest gerne das Audio mit deinen tollen Tools bearbeiten und es danach wieder mit dem Video zusammen führen.

Einfacher als mit LossLessCut geht es nun wirklich nicht mehr.

Und so geht es am Beispiel des zweisprachigen Videos (Screenshots weiter unten) :

  1. Screenshot 1: Video in LossLessCut reinladen
  2. oben links auf Tracks z.B. Tracks (2/2) klicken.
  3. Dann öffnet sich eine Übersicht mit allen Audio und Videospuren, die in diesem Container enthalten sind.
  4. Screenshot 2: Indem du auf die Symbole (1) klickst, bestimmst du, ob sie mit exportiert werden sollen (grün) oder nicht mit in den neuen Container kopiert werden sollen (rot)
  5. Wenn du darunter auf “Include more tracks from other file” (2) klickst, dann kannst du eine weitere Videodatei auswählen, die dann mit in diese Übersicht kommt.
  6. Screenshot 3: Die Spuren des neuen Videos (1) werden dann aufgelistet. Mit einem Klick auf das Videosymbol links (2) deaktivierst du die reine Videospur
  7. Und mit Klick auf das X Symbol (3) rechts oben schließt du diese Übersicht und die Einstellungen werden übernommen.
  8. Screenshot 4: Kurz oben links (1) prüfen, ob jetzt auch 3 Tracks im Container und dann unten rechts (2) auf “Export” klicken.
  9. Screenshot 5: Es öffnet sich dann das Export Fenster mit diversen Exporteinstellungen (1) und wohin die zu exportierende Datei gespeichert werden soll und dann kannst du Export (2) klicken.
  10. Je nach Größe der Datei und Schnelligkeit deines Datenträgers dauert der Export zwischen ein paar Sekunden und ein paar Sekunden mehr.

So können aus 2 Videos mit der Länge von 1.3GB , als insgesamt 2.6GB ein Video mit 1.5GB gemacht werden. Also eine Ersparnis von 1.1GB.

Und beim Anschauen kann dann einfach mal schnell (bei VLC mit b) zwischen den Sprachen hin und her geschaltet werden.

Viel Spaß !

Screenshot 1

Screenshot 2

Screenshot 3

Screenshot 4

Screenshot 5

Mehr zu diesen Themen

ffmpeg

Views: 44

Audio in Video normalisieren mit ffmpeg

Manchmal ist das Audio in einem Video relativ leise und eigentlich ist da noch richtig Luft nach oben es lauter zu machen. Ein schöner und sehr eleganter Weg ist es mit ffmpeg die Normalisierungsfunktion zu nutzen, ohne das Video selbst erneut zu encoden. Das Audio muss natürlich neu encoded werden.

Zuerst muss ermittelt werden welches der lauteste Peak (lauteste Stelle) im gesamten Audio ist

Lautstärkenermittlung – Highest Peak

ffmpeg -i Videodatei.mp4 -af "volumedetect" -vn -sn -dn -f null /dev/null

Dann steht in der Ausgabe irgendwo relativ weit oben so etwas:

[Parsed_volumedetect_0 @ 0x00000000000] mean_volume: -29.1 dB
[Parsed_volumedetect_0 @ 0x00000000000] max_volume: -3.6 dB

Das “max_volume mit -3.6 dB” ist das Interessante für uns. Das maximale Level in der digitalen Welt ist 0dB . Alles was darüber “gedrückt” wird, wird sehr hässlich verzerrt. Das sollte unbedingt vermieden werden!!

Lautstärkenlimit beachten!

Und vielleicht ein kleiner Sicherheitsabstand wäre auch noch ganz gut, denn beim Umwandeln über D/A (Digital/Analog) Wandler passieren auch je nach Qualität manchmal merkwürdige Dinge. Stichwort Truepeak bzw True Inter-Sample Peak Level.
Also als Empfehlung wäre hier einen Puffer von 0,5 dB bis 1 dB einzuhalten.

In unserem Beispiel von “max_volume mit -3.6 dB” nehmen wir mal einen Puffer von 1 dB, das würde dann heissen, dass wir das max_volume um 2.6dB erhöhen: -3.6+2.6= -1dB Ziellautstärke

Lautstärkenanhebung

Der Befehl dazu lautet (Ziel Audioformat: AAC)
ffmpeg -i Videodatei.mp4 -af "volume=2.6dB" -c:v copy -c:a aac -b:a 192k VideodateiErgebnis.mp4

Alias und Function

Und in der Shell Bash ist das natürlich schöner mit einem kurzen Alias aufzurufen. Aber ein Alias ist nur ein anderer Name für ein bestehender Name. Also könnte ich dem Programm Ulrike den Namen Peter geben und egal, welchen Namen ich jetzt eingebe Ulrike oder Peter, das selbe Programm wird ausgeführt.

Da sich hier aber Aufrufparameter, wie Videodatei und die 2.6dB handelt, reicht ein Alias nicht. Dafür gibt es in der Bash die Function. Hier können dann auch die Aufrufparameter abgefragt werden.

Diese Functions weiter unten gelten immer nur für die aktuelle Session. Sobald das Fenster geschlossen oder die Bash beendet wird, ist auch die Function gelöscht. Soll die Function für immer bleiben, muss sie in der Datei .~bashrc im eigenen Homeverzeichnis definiert werden.

Lautstärke herausfinden

Der Aufruf sieht so aus myMaxvol Videodatei.mp4

myMaxvol() { ffmpeg -i "$1" -af "volumedetect" -vn -sn -dn -f null /dev/null; }

Lautstärke anheben

Der Aufruf sieht so aus: myGainvol Videodatei.mp4 2.6

myGainvol() { ffmpeg -i "$1" -af "volume=""$2""dB" -c:v copy -c:a aac -b:a 192k output.mp4 && mv output.mp4 "$1" ; }

Erklärung was hier passiert: Es wird als Parameter Videodatei.mp4 und 2.6 als Lautstärkenanhebung mitgegeben. Das Ergebnis wird in eine Datei namens output.mp4 geschrieben. Wenn die Lautstärkenanhebung erfolgreich war, dann wird die Datei output.mp4 umbenannt in die Videodatei.mp4, die damit natürlich überschrieben wird.

Wenn die Aktion schief läuft, dann liegt da eine Datei output.mp4 herum und noch die originale Datei Videodatei.mp4.

Bash Script

Vielleicht bastle ich noch ein kleine Bash Script, das automatisch die Lautstärke ermittelt, dann auch automatisch die Anhebung ermittelt und danach gleich die Lautstärkenanhebung durchführt. Und dann das ganze noch auf ein ganzes Verzeichnis anwendet.

Schaumermal.

Weitere hyperblog Artikel zum Thema

bash

Views: 53

Lernvideos sinnvoll organisieren

Es gibt, oder es gab, ich weiss es ehrlich nicht genau, daher schreib ich mal in der Gegenwartsform, das Kommandozeilenprogramm youtube-dl oder andere Varianten wie yt-dlp oder ähnliche, mit denen es einfach möglich ist Videos herunter zu laden, um nicht von einer funktionierenden Internetleitung abhängig zu sein. Wer in Deutschland lebt, weiss, was ich meine.

Vor allem bei Lernmaterial ist das super, wenn es offline verfügbar ist und immer wieder angeschaut werden kann, ohne wieder und wieder durch das Streaming CO2 zu erzeugen.

Viele dieser Lernvideos haben Kapitelmarken und auch Untertitel in verschiedenen Sprachen, die natürlich auch im offline Modus sehr hilfreich sind. Und nicht nur als Kapitel, sondern eventuell auch zur Zerteilung in einzelne Videoclips, so dass bei einer Suche direkt auf den entsprechenden Clip zugegriffen werden kann.

Wenn also ein Video legal runtergeladen werden darf, dann helfen folgende Parameter und folgender Workflow bei den entsprechenden Programmen, die ich jetzt einfach mal unter dem Programmnamen DLPGRM zusammenfasse

Verfügbare Formate auslesen

Um erst mal zu sehen, in welchen VIDEO und AUDIO Formaten die Quelle vorliegt, gibt es folgenden Befehl, mit dem eine Tabelle ausgegeben wird.

DLPGRM -F URL-Link

Am Anfang der Tabelle steht in jeder Zeile eine ID und rechts daneben jede Menge weiterer Parameter. Wichtig ist, sich hier die IDs für das gewünschte VIDEO und AUDIO Format zu notieren, denn das wird für den nächsten Schritt gebraucht.

Hinweis: Wenn es einfach nur ein Redebeitrag ist, ohne dass Dinge gezeigt werden, die wichtig sind, wäre es unter Umständen sogar sinnvoll, das als Audiodatei (weiter unten) zu speichern, oder wenigstens als Video mit einer sehr geringen Auflösung. Wenn die Lernvideos nur auf dem Smartphone gespeichert werden sollen, dann sind hohe Auflösungen eh meist sinnlos. Da kann dann schon mal 256×144, 426×240 oder 640×360 genommen werden. Das spart CO2 und zuletzt auch eine Menge Festplattenplatz.

Lernvideo mit Kapitelinformationen speichern

Ist also die ID Nummer für VIDEO und AUDIO ausgesucht, dann kann mit folgendem Befehl das Lernvideo gespeichert werden. Gleichzeitig werden die Kapitel und deutsche & englische Untertitel mit rein gepackt und als Datei kommt eine MP4 Datei heraus, die auf allen Endgeräten abspielbar ist.

DLPGRM -f VIDEO+AUDIO --merge-output mp4 --embed-chapters --sub-langs "de,en" --embed-subs --write-auto-subs --embed-metadata URL-LINK

Soll das Lernvideo als reine Audio Datei, z.B. mp3 gespeichert werden, dann geht das auch mit

DLPGRM -x --audio-format mp3 URL-LINK

Kapitel nachträglich auslesen

Die Kapitel können nachträglich aus der Videodatei mit ffmpeg ausgelesen werden. Genauer gesagt mit dem Tool ffprobe. Dazu muss einfach nur der Befehl

ffprobe -show_chapters VIDEODATEI

eingegeben werden und als Ergebnis kommt eine Textausgabe der Kapitel heraus. Allerdings im sehr ausführlichen ffmpeg Format, aus dem dann die entsprechenden Informationen entnommen werden können. Dieses Format sieht z.B. so aus

[CHAPTER] 
id=0
time_base=1/1000
start=0
start_time=0.000000
end=60000
end_time=60.000000
TAG:title=Einleitung
[/CHAPTER]
[CHAPTER]
id=1
time_base=1/1000
start=60000
start_time=60.000000
end=95000
end_time=95.000000
TAG:title=Kanäle / Tracks umschalten
[/CHAPTER]
[CHAPTER]
id=2
time_base=1/1000
start=95000
start_time=95.000000
end=177000
end_time=177.000000
TAG:title=Parameter ändern (Volume, Pan, Send Effekte/Kanäle) und resetten
[/CHAPTER]
[CHAPTER]
id=3
time_base=1/1000

Kapitel als einzelne Videos speichern

Soll das Lernvideo nun aber in einzelne kleinere und leichter auffindbare Dateien aufgeteilt werden, so würde das auch mit dem Programm gehen, allerdings gibt es da den einen oder anderen unschönen Seiteneffekt, der durch sogenannte fehlende Keyframes (ein komplettes Vollbild) an der richtigen Stelle entsteht, so dass es manchmal beim Beginn der Kapitel aussieht, als würde jemand mit Wasserfarben durchs Bild wischen, oder aber das Lernvideo muss komplett neu codiert werden. Und das kann ganz schön lange dauern.

Es gibt da einen kleinen Trick, der nicht nur schneller, sondern auch Resourcen schonender ist. Das Programm LossLessCut kann diverse Videoformate einfach zerteilen, ohne dass irgendwas neu berechnet werden muss. Und es bietet eine einfache und praktische Lösung zu dem Keyframe Problem an. Nämlich schaut es, wo das Kapitel beginnt und dann “spult” es so lange zurück, bis es das letzte Keyframe findet und legt den Anfang des Kapitels dorthin.

Dabei handelt es sich dann meist um eine Wiederholung maximal 1-3 Sekunden zum vorherigen Kapitel aber dafür mit einem klaren Bild.

Also wird das Lernvideo in LossLessCut reingeladen und dann wird zuerst gefragt, ob die Segmente oder Chapters auch importiert werden sollen. Auf diese Frage mit Ja antworten. Danach kann gleich rechts unten auf den Export Knopf gedrückt werden und diese Einstellungen sollten übernommen werden.
Wichtig sind: Separate files, mp4, Cut mode=Keyframe cut, preserve all MP4/MOV metadata

Und nach 3 Sekunden liegen alle Kapitel als einzelne Videoclips vor.

Viel Spaß bei der Organisation eurer Lernvideos, die ihr jetzt noch viel effizienter ablegen könnt.

Views: 3

Audiospuren aus Videodateien entfernen und hinzufügen – ffmpeg

Ich stand vor dem Problem, eine bearbeitete Audiodatei mit der ursprünglichen Audiospur einer Videodatei (mp4) auszutauschen. Da ich nur die Audiodatei verändert hatte, wollte ich nicht das Video neu kodieren und so Gefahr laufen, die Qualität zu verändern, oder unnötig die Videodatei zu vergrößern.

Im Prinzip ist es ganz einfach (unter Linux): ffmpeg

Update: Es gibt eine einfachere Variante die Audiodateien auszutauschen mit dem Tool LossLessCut https://github.com/mifi/lossless-cut das noch wesentlich mehr Optionen bietet.

Was ist drin

Um den Inhalt einer Videodatei zu verändern, sollte erst geschaut werden, was da überhaupt drin ist. Das erledigt der Befehl:

ffprobe INPUTVIDEO.mp4

ffprobe ist ein Analyseproramm und bei ffmpeg standardmäßig mit dabei.

Entfernen

Das Entfernen einer oder mehrerer Audiospuren funktioniert mit folgendem Befehl

ffmpeg -i InputVideo.mp4 -map 0 -map -0:a:0 -codec copy OutputVideo_EINS.mp4
  • -map 0 wählt alle (Video/Audio) Spuren aus
  • -0:a:0 wählt aus allen Spuren die Audiospur Nummer 1 (Zählweise ab 0) aus
  • -codec copy definiert, dass keine Neukodierung stattfindet

Will man alle Audiospuren aus dem Video entfernen, so gilt abgekürzt

  • -0:a wählt alle Audiospuren aus

Zur Auswahl stehen nicht nur a (Audiospuren), sondern auch v (Videospuren), s (Sub-/Untertitel), d (Datenspuren).

Hinzufügen

Das Hinzufügen einer oder mehrerer Audiospuren (zum vorherigen Beispiel) funktioniert mit folgendem Befehl

ffmpeg -i OutputVideo_EINS.mp4 -i Audiospur.m4a -codec copy -shortest OutputVideo_ZWEI.mp4
  • -i steuert, was in die Datei aufgenommen werden soll. Hier 1 Video- und 1 Audiospur
  • -codec copy definiert, dass keine Neukodierung stattfindet
  • -shortest kürzt alles auf die Länge der Datei mit der kürzesten Dauer

Zweite Spur hinzufügen

Wenn eine zweite Spur hinzugefügt werden muss, dann sollte darauf geachtet werden, dass die zweite Spur genau gleich lang ist, wie die erste Spur!

ffmpeg -i INPUTVIDEO.mp4 -i INPUTAUDIO.aac -map 0 -map 1 -metadata:s:a:1 title="MEIN TITEL DER AUDIOSPUR" -codec copy OUTPUTVIDEO.mp4

Extrahieren

Das Extrahieren einer Audiospur im Originalformat funktioniert folgendermaßen

ffprobe Name_der_Video_Datei

Als Ausgabe erhält man eine lange Ausgabe und zum Schluss findet man so etwas in dieser Art

Input #0, matroska,webm, from 'MeinVideo.webm':
Metadata:
ENCODER : Lavf58.20.100
Duration: 03:59:10.04, start: -0.007000, bitrate: 2285 kb/s
Stream #0:0(eng): Video: vp9 (Profile 0), yuv420p(tv, bt709), 3840x2160, SAR 1:1 DAR 16:9, 59.94 fps, 59.94 tbr, 1k tbn, 1k tbc (default)
Metadata:
DURATION : 03:59:10.019000000
Stream #0:1(eng): Audio: opus, 48000 Hz, stereo, fltp (default)
Metadata:
DURATION : 03:59:10.041000000

In diesem Falle handelt es sich bei Stream #0:1 Audio: opus um ein Ogg Vorbis Audio, das man in ein .ogg oder .oga abspeichern kann mit folgendem Befehl

ffmpeg -i MeinVideo.webm -map 0:a:0 -c copy MeinAudio.oga

In diesem Fall wird einfach die Audiodatei ohne ein neues konvertieren aus der Videodatei herauskopiert und liegt dann als MeinAudio.oga im Dateisystem.

Extrahieren und Konvertieren

Das Extrahieren und Konvertieren einer Audiospur in ein anderes Audioformat z.B. WAV geht sogar noch einfacher

ffmpeg -i MeinVideo.webm MeinAudio.wav

Bei komprimierten Audioformaten müssen natürlich noch ein paar mehr Parameter zur Steuerung der Qualität angegeben werden.

Views: 38