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.

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

Intro: + 12 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→scalenorm[i] = s→weightsum / FFABS(s→weights[i]);

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

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