Post Mortem Lautheitssprünge im Releasing

Alle Talks, die an Tag 1 bis 17:26 an die Minions zum Encoding gegeben wurden, haben die richtige Lautheit. Um 18:27 wurde der nächste Talk zum Encoding gegeben. Ab diesem Zeitpunkt sind alle Talks mit der falschen Lautheit gerechnet und released worden.

Am Tag 1 gegen 18 Uhr wurde masterme aus der Releasing-Kette entfernt. Dies geschah mit voller Absicht, da alle Recordings bereits die korrekte Lautheit enthielten und nicht nochmal gelevelt werden sollten. Das Projekt wurde daher mit deaktiviertem master_me angelegt, in Unkenntnis des abweichenden Prozesses für den Congress in Teilen des Teams wurde es aber wieder aktiviert.

Die Lautheit aller Talks sah dann plötzlich so aus:

Intro: + 6 LU zu laut

Talk: -6 LU zu leise

Outro: ±0 LU

Die Nachricht über dieses merkwürdige Verhalten erhielten wir Mitte Tag 2 und konnte im Laufe des Congresses nicht mehr aufgeklärt werden.

ffmpeg-Filter amix

Grundlegende Ursache für dieses Verhalten ist der ffmpeg-Filter 'amix'. 'amix' ist in diversen Tracker-Profilen seit 2018, dem 35c3 im Einsatz. Seit dieser Zeit werden damit Intro und Outro mit dem Talk gemixt. Es wird aus Intro, Stille in der Länge des Talks und Outro eine 2. Quelle generiert, die mit dem Talk zusammengemischt wird. Auf diese Weise können Intro und Outro mit dem Talk vorne und hinten verblendet werden.

Das eigentliche Problem daran ist, das 'amix' ein tontechnisch unübliches Default-Verhalten hat, dass seit der ersten Veröffentlichung des Filters aber bereits im Code enthalten ist. Es geht dabei um den Parameter 'normalize'. Dieser ist zwar so erst seit ca. 5 Jahren im Code, er ist aber schon seit 8 Jahren als Parameter im Code angelegt und hieß damals noch 'sum'. Davor gab es den Parameter nicht, aber das Mischen von mehreren Signalen wurde auf die Art und Weise getätigt, die nun im Prinzip mit eingeschaltetem Parameter 'normalize' abläuft. Das erklärt vielleicht auch, warum der Parameter default '1', also an ist und nicht, wie eher zu erwarten, deaktiviert ist.

ffmpeg beschreibt den Parameter in seinem Manual so:“normalize: Always scale inputs instead of only doing summation of samples. Beware of heavy clipping if inputs are not normalized prior or after filtering by this filter if this option is disabled. By default is enabled.”

Der für unser Problem entscheidende Code in 'amix' liest sich folgendermaßen.Zeile 281 definiert scale_norm und ergibt bei 2 Quellen (Intro-Outro-Gebilde und Talk) den Wert 2:

s->scale_norm[i] = s->weight_sum / FFABS(s->weights[i]);

Zeilen 233 - 236 widerum nutzen diesen Wert, um daraus bei eingeschaltetem 'normalize' die Gewichtung der Einzelsignale für die Mischung von jeweils 0,5 festzulegen:

if (!s->normalize)
s->input_scale[i] = FFABS(s->weights[i]);
else
s->input_scale[i] = 1.0f / s->scale_norm[i] * FFSIGN(s->weights[i]);

-6 LU bei den Talks

Das Gewicht von 0,5 wird für jede Quelle angewandt. Dieses Gewicht/Faktor entspricht exakt -6 dB, gleichbedeutend mit -6 LU. So erklärt sich, warum die Talks keine -16 bis -18 LUFS sind, sondern zwischen -22 und -24 LUFS liegen.

±0 LU im Outro

Der Audio-Strom aus Intro, Stille und Outro ist etwas länger als der Talk selber, nämlich genau um die Länge des Outros. (Den Talks wird hinten keine Stille in Länge des Outros angehängt.) Somit hat 'aimx' nur noch eine Quelle und die Gewichtung wird ignoriert. Deswegen haben die Outros die korrekte Lautheit.

+6 LU im Intro

Die Intros sind sämtlich schon im gerenderten Zustand zu laut. Sie basieren alle auf demselben Ursprungsfile mit folgenden Messwerten:

Integrated loudness:
I: -6.2 LUFS
Threshold: -18.4 LUFS

Im nächtlichen, übermüdeten Zustand wurde der Threshold für die Integrated Lautheit gehalten und so kam dieses File in die Massenproduktion. Diese an sich 12 LU zu lauten Intros wurden dann durch das 'amix'-Verhalten auf +6 LU zu viel herunter gepegelt.

Fazit

Was lernen wir jetzt daraus?

Im Encoding-Profil muss explizit für jeden 'amix'-Filter der Parameter 'normalize=0' gesetzt werden. (Dies gilt ausschließlich für Veranstaltungen, bei denen die Eingangssignale gesichert technisch ok sind und bei denen das automatische Leveling in der Releasing-Kette ausgeschaltet ist.)

Intro und Outro müssen vom Audio-Department geprüft werden.

Jede Änderung im Encoding-Profil oder die Lautheit beinflussenden Projektparametern muss vom Audio-Department erneut geprüft werden.

Ausführlichere Dokumentation/Kommentierung des Codes im Encoding-Profil. (Das den Pegel absenkende Verhalten scheint anfangs (2018) durchaus aufgefallen und bekannt gewesen zu sein. So findet sich in einigen Profilen nämlich ein nachlaufender volume-Filter mit den Einstellungen volume=1.8 bzw. volume=1.9. Akustisch scheint das also aufgefallen und nahezu ausgeglichen worden zu sein. Jedoch findet sich keine Kommentierung, warum dieser Filter so eingesetzt wurde.)

Bestenfalls könnte man entsprechende Prüfungen mit einem Leer-Release verbinden, bei dem die Eingangssignale Intro, Outro und “Ersatzsignale Talk” sowie “Ersatzsignale Translator” enthalten sind. Die Ersatzsignale sollten technisch eindeutig und nachvollziehbar sein und eventuelle Probleme wie Pegelabweichungen, Spurtausch, Mono-Stereo-Fehler und Phasenlage sichtbar machen.