Transcoding mit FFmpeg und SoX

Mit FFmpeg und SoX können wir sämtliche Audioformate verarbeiten, die uns auf der DVD und Blu-ray begegnen. Außerdem lässt sich per Pipe jeder beliebige Encoder anbinden, der den Stdin-Kanal als Quelle nutzen kann. Ein Beispiel dafür ist Nero-AAC.

Ganz wichtig: Dieses Kapitel ist Spielwiese. Es sieht soweit alles ganz gut aus, aber ich habe keine Ahnung, ob das schon die Ideallösung ist oder irgendwo doch noch ein größeres Problem lauert. An Themen fehlt auf jeden Fall noch die Dynamikkompression. Auch der Stereo-Downmix lässt sich über SoX genauer steuern als über FFmpeg. Das könnte sich also noch ändern. Wer Tipps, Tricks, Vorschläge, Hinweise hat: immer gerne!

Übrigens: Ich habe eac3to ganz bewusst zum reinen Ripper degradiert, um endlich mal intensiver in FFmpeg und SoX einzusteigen. Mag sein, dass das Audiotranscoding über eac3to manchmal bequemer wäre, aber das hier ist das Audiokapitel für richtige Männer! :-P

Lautstärke normalisieren

Damit die transcodierte Tonspur nicht zu leise wird, müssen wir sie vor dem Encoding normalisieren, d.h. die Lautstärke auf 100% anheben. Besonders wichtig ist das, wenn wir 5.1 Kanäle auf Stereo heruntermischen.

Da FFmpeg keine eigene Funktion zum Normalisieren mitbringt, lassen wir das SoX erledigen. Wenn wir eine übliche Multikanal-Tonspur haben und die ursprüngliche Kanalanzahl beibehalten, könnte das so aussehen:

ffmpeg -i "D:\Quelle-5.1ch.dts" -f sox - | sox -p --null stat

Für den Downmix auf Stereo fügen wir die FFmpeg-Option -ac hinzu, die die Zahl der Zielkanäle angibt:

ffmpeg -i "D:\Quelle-5.1ch.dts" -ac 2 -f sox - | sox -p --null stat

SoX analysiert jetzt den Pegel der Tonspur. Je nach Filmlänge und Rechenleistung kann das ein paar Minuten dauern. Zum Schluss gibt SoX eine Reihe von Informationen aus, darunter auch den Wert zum Spitzenpegel.

Volume adjustment: 1.991

Wichtig sind nur Werte, die von 1,0 abweichen. Ermittelt SoX 1.000 als Multiplikator, ist die Tonspur schon normalisiert und wir brauchen nichts anzupassen. Die 1.991 im Beispiel bedeutet, dass wir den ursprünglichen Lautstärkepegel mit 1,991 multiplizieren müssen, um den höchstmöglichen Wert und damit eine normalisierte Tonspur zu erhalten. Nun ist FFmpeg etwas eigenwillig, was die Lautstärkewerte angeht. Die unveränderte Quelldatei hat immer den Pegel 256. Also rechnen wir:

FFmpeg-Pegel = 256 * SoX-Multiplikator = 256 * 1,991 = 509,696 ≈ 509

Das Ergebnis ist der normalisierte Pegelwert, den wir FFmpeg fürs Encoding mitgeben. Um übersteuerten Ton zu vermeiden, runden wir das Ergebnis immer ab.

Transcoding

Mit der angepassten Lautstärke können wir nun die Tonspur transcodieren. Der FFmpeg-Befehl dafür sieht so aus:

ffmpeg -i <Quelldatei> [-ac <Zielkanäle>] [-vol <Lautstärke>] -acodec <Encoder> [-aq <Qualität>] <Zieldatei>

Mit der Option -ac steuern wir die Anzahl der Zielkanäle. Besonders interessant ist -ac 2 für den Downmix auf Stereo. Wenn wir die ursprüngliche Kanalanzahl beibehalten, lassen wir die Option weg.

Fürs Anpassen der Lautstärke auf den normalisierten Pegel ist die Option -vol zuständig.

Den Encoder wählen wir mit -acodec und die Qualitätsstufe mit -aq. Wie die beiden Optionen genau funktionieren, sehen wir uns an ein paar Beispielen an.

Fürs Vorbis-Encoding setzen wir -acodec libvorbis. Für die Qualität gilt die normale Vorbis-Skala von -2.0 bis 10.0. Ein typisches normalisiertes Transcoding von 6-Kanal-DTS nach 6-Kanal-Vorbis könnte also so aussehen:

ffmpeg -i "D:\Quelle-5.1ch.dts" -vol 509 -acodec libvorbis -aq 3.0 "D:\Ziel-5.1ch.ogg"

Beim MP3-Encoding mit LAME müssen wir beachten, dass wir zu Stereo gezwungen sind, denn MP3 ist nicht multikanalfähig. LAME aktivieren wir per -acodec libmp3lame, die Qualitätsskala reicht von 0 (höchste Qualität) bis 9 (niedrigste Qualität).

ffmpeg -i "D:\Quelle-5.1ch.dts" -ac 2 -vol 509 -acodec libmp3lame -aq 4 "D:\Ziel-5.1ch.mp3"

Fürs FLAC-Encoding setzen wir -acodec flac. FLAC nutzt zum Einstellen der Kompressionsstufe nicht die generische Qualitätsoption -aq, sondern -compression_level. Dafür gibt es wie beim normalen FLAC-Encoder neun Stufen von 0 bis 8, die jeweils mehr Rechenzeit benötigen und besser komprimieren.

ffmpeg -i "D:\Quelle-5.1ch.dts" -vol 509 -acodec flac -compression_level 8 "D:\Ziel-5.1ch.flac"

Damit kommen wir zu den Formaten, für die wir externe Encoder benötigen. Einer davon ist Nero-AAC. Als Codec setzen wir in FFmpeg -acodec pcm_f32le, was unkomprimierten 32 bit Fließkomma entspricht. Das dient dazu, dass auf dem Weg von FFmpeg zum Encoder möglichst keine Qualität verloren geht. Mit dem, was man normalerweise als Bittiefe einer Tonspur bezeichnet, hat das nichts zu tun.

Nero-AAC definiert die Qualität über die Option -q. Der gültige Bereich liegt zwischen 0.0 (niedrig) und 1.0 (hoch).

ffmpeg -i "D:\Quelle-5.1ch.dts" -vol 509 -acodec pcm_f32le -f wav - | neroaacenc -if - -of "D:\Ziel-5.1ch.m4a" -ignorelength -q 0.3

Unser zweiter möglicher AAC-Encoder ist Apple-AAC über Qaac. Auch hier müssen wir genauso wie bei Nero-AAC den externen Encoder an FFmpeg anbinden. Noch fehlt mir mit Qaac die Erfahrung, um fundierte Empfehlungen für die Qualitätseinstellung zu geben. Ich gehe davon aus, dass der Encoder ähnlich effizient arbeitet wie Nero-AAC oder Vorbis.

Qaac kennt zwei VBR-Verfahren. Echtes VBR (--tvbr) ist nur mit dem AAC-Profil Low Complexity (LC) möglich. Mögliche Werte für die Qualität reichen von 0 bis 127. Ein sinnvolles Qualitätsniveau könnte um 50 liegen, was auf grob 250 kbit/s bei 6 Kanälen und 100 kbit/s bei Stereo hinausläuft.

ffmpeg -i "D:\Quelle-5.1ch.dts" -vol 509 -acodec pcm_f32le -f wav - | qaac - -o "D:\Ziel-5.1ch.m4a" --tvbr 50

Eingeschränktes VBR (--cvbr) funktioniert sowohl mit HE- als auch mit LC-AAC. Die Qualität geben wir als Zielbitrate an. Für das folgende HE-AAC-Beispiel mit 6 Kanälen habe ich 160 kbit/s gewählt, da HE-AAC auf starke Kompression abzielt.

ffmpeg -i "D:\Quelle-5.1ch.dts" -vol 509 -acodec pcm_f32le -f wav - | qaac - -o "D:\Ziel-5.1ch.m4a" --cvbr 160 --he

Kommentare