Lückenlos abspielen: Vorlauf und Nachlauf von MP3, AAC, Opus und FLAC gemessen

Inhalt
Ein Album ohne Pausen, ein DJ-Mix, ein Livemitschnitt: Der Übergang von einem Titel zum nächsten soll durchlaufen. Dass er es oft nicht tut, liegt selten am Schnitt und fast immer am Encoder. Verlustbehaftete Verfahren arbeiten blockweise und brauchen einen Anlauf; sie fügen deshalb vor der Musik und hinter ihr Abtastwerte ein, die niemand aufgenommen hat.
Ob daraus eine hörbare Lücke wird, entscheidet sich zweimal: beim Kodieren, wo die Zahlen in der Datei vermerkt werden oder eben nicht, und beim Abspielen, wo ein Abspieler diese Zahlen beachtet oder übergeht. Die Messung nimmt beide Schritte auseinander und beziffert sie.

So wurde gemessen
- Vorlauf: drei Sekunden Stille mit einem einzelnen Impuls genau bei einer Sekunde, kodiert, wieder dekodiert, und dann gesucht, wo der Impuls jetzt liegt. Die Verschiebung ist der Vorlauf, den die Kette hinzugefügt hat.
- Stoß: ein Ton von 441 Hz bei 44,1 kHz, also genau 100 Abtastwerte je Schwingung, geteilt in zwei Hälften von je zwei Sekunden. Beide Hälften wurden getrennt kodiert, wieder dekodiert und aneinandergesetzt. Gemessen wurden die längste Folge stiller Abtastwerte in einem Fenster von 100 ms um den Stoß, der größte Sprung zwischen zwei Abtastwerten und der Pegel in einem Fenster von 20 ms.
- Musik: dasselbe mit einem Stück von 32 Sekunden aus derselben Werkstatt wie die Messung zu True Peak nach dem Encoding, ebenfalls halbiert.
- Zwei Betriebsarten: einmal so, wie ffmpeg es macht, nämlich mit beachteten Angaben aus der Datei, und einmal so, wie ein Abspieler ohne Rücksicht darauf es bekäme. Für MP3 wurde dafür dieselbe Datei ohne Info-Rahmen neu geschrieben, für MP4 mit
-ignore_editlist 1gelesen. - Verfahren: FLAC als Kontrolle, MP3 mit 320 und 192 kbit/s sowie VBR V0 über libmp3lame, AAC mit 256 kbit/s über den eigenen Encoder von ffmpeg, Opus mit 128 und 256 kbit/s über libopus, Ogg Vorbis mit 192 kbit/s. Alles mit ffmpeg 7.1.5 auf einem Raspberry Pi 4.
Was die Encoder anfügen
| Verfahren | Verschiebung mit Angaben | Verschiebung ohne Angaben | Angabe in der Datei |
|---|---|---|---|
| FLAC | 0 | entfällt | Zahl der Abtastwerte im Kopf |
| MP3 320 kbit/s | 0 | 1105 (25,06 ms) | Info-Rahmen: 576 Vorlauf, 756 Nachlauf |
| MP3 192 kbit/s | 0 | 1105 (25,06 ms) | Info-Rahmen: 576 Vorlauf, 756 Nachlauf |
| MP3 VBR V0 | 0 | 1105 (25,06 ms) | Xing-Rahmen: 576 Vorlauf, 756 Nachlauf |
| AAC 256 kbit/s | 0 | 1024 (23,22 ms) | Schnittliste: Start 1024, Dauer 3,000 s |
| Opus 128 und 256 kbit/s | 0 | entfällt | Vorlauf 312 bei 48 kHz (6,5 ms) |
| Ogg Vorbis 192 kbit/s | 0 | entfällt | Granule-Positionen der Seiten |
Die MP3-Dateien trugen unabhängig von der Bitrate denselben Eintrag: 576 Abtastwerte Vorlauf und 756 Nachlauf. Gemessen wurde ohne diesen Rahmen eine Verschiebung von 1105 Abtastwerten, und die Datei war am Ende 1332 Abtastwerte länger als das Original. Die Differenz zwischen 576 und 1105 stammt vom Decoder: Das technische FAQ von LAME hält fest, dass jeder getestete Decoder eine Verzögerung von 528 Abtastwerten einbringt. 576 und 528 ergeben 1104, gemessen wurden 1105; dieser eine Abtastwert blieb unaufgeklärt.
Bei AAC steht der Anfang in der Schnittliste der Spur, hier mit einem Startversatz von 1024 Abtastwerten. Am Ende blieben 820 Abtastwerte mehr übrig als im Original. Opus dekodiert immer mit 48 kHz, weshalb die Verschiebung hier in Zeit gerechnet wurde; der Vorlauf steht laut RFC 7845 im Kopf und beträgt in diesen Dateien 312 Abtastwerte, also 6,5 ms. FLAC nennt im Kopf die genaue Zahl der Abtastwerte, und Ogg Vorbis trägt die Länge in den Granule-Positionen, sodass bei beiden nichts hinzukommt.
Der Stoß: 37,57 ms Stille, wo keine sein soll
Ein durchgehender Ton, in der Mitte geteilt und wieder zusammengesetzt, zeigt den Schaden am deutlichsten. Die Spalte „Lücke“ nennt die längste Folge stiller Abtastwerte am Stoß, der Pegel bezieht sich auf dieselbe Stelle im ungeteilten Signal:
| Verfahren | Lücke mit Angaben | Pegel mit Angaben | Lücke ohne Angaben | Pegel ohne Angaben |
|---|---|---|---|---|
| FLAC (Kontrolle) | 0,02 ms | 0,00 dB | entfällt | entfällt |
| MP3 320 kbit/s | 0,02 ms | 0,00 dB | 37,57 ms | −85,08 dB |
| MP3 192 kbit/s | 0,02 ms | −0,26 dB | 37,57 ms | −78,32 dB |
| AAC 256 kbit/s | 20,16 ms | −3,02 dB | 43,38 ms | −61,43 dB |
| Opus 128 kbit/s | 0,02 ms | −0,02 dB | entfällt | entfällt |
| Ogg Vorbis 192 kbit/s | 0,02 ms | 0,04 dB | entfällt | entfällt |
Die 0,02 ms sind ein einzelner Abtastwert und damit die Grenze dieser Messung: Dort, wo der Ton den Nulldurchgang hat, unterschreitet er kurz die Schwelle. MP3, Opus und Vorbis schließen also lückenlos an, solange die Angaben beachtet werden. Wird derselbe Ton ohne Info-Rahmen abgespielt, stehen 37,57 ms Stille im Stoß, und der Pegel fällt um 85 dB. Das ist keine Feinheit mehr, das ist eine Pause.
AAC bleibt auch mit Angaben stehen, bis die Dauer dazukommt
Der Wert von 20,16 ms in der Zeile AAC fällt aus der Reihe, denn dort wurden die Angaben ja beachtet. Die Gegenprobe in drei Stufen zeigt, woran es liegt:
| Stufe | Lücke am Stoß | Länge je Hälfte |
|---|---|---|
| keine Angabe beachtet | 43,38 ms | 90.112 Abtastwerte |
| nur der Anfang der Schnittliste beachtet | 20,16 ms | 89.088 Abtastwerte |
| Anfang und Dauer beachtet | 0,02 ms | 88.200 Abtastwerte |
Zwei Sekunden bei 44,1 kHz sind 88.200 Abtastwerte. Die Schnittliste beschreibt beides, den Startversatz und die Dauer der Spur; wer nur den Startversatz anwendet, schneidet den Anfang sauber ab und behält den Nachlauf als Stille. Genau das beschreibt auch die Dokumentation von ffmpeg für den Schalter advanced_editlist: Sind beide Schalter abgeschaltet, wird nur der Anfang des Index geändert, um die anfängliche Verweilzeit oder den Startzeitpunkt aus der Schnittliste abzubilden. Sobald die Dauer mitgeht, verschwindet die Lücke restlos.
Mit Musik statt Sinuston
| Verfahren | Lücke mit Angaben | Pegel mit Angaben | Lücke ohne Angaben |
|---|---|---|---|
| FLAC (Kontrolle) | 0,32 ms | 0,00 dB | entfällt |
| MP3 320 kbit/s | 0,16 ms | 0,00 dB | 39,21 ms |
| AAC 256 kbit/s | 21,77 ms | −0,94 dB | 26,08 ms |
| Opus 128 kbit/s | 0,25 ms | −0,10 dB | entfällt |
| Ogg Vorbis 192 kbit/s | 0,29 ms | 0,04 dB | entfällt |
Bei Musik schlägt die Schwelle für Stille auch bei der Kontrolle kurz an, weil im Signal ohnehin leise Stellen vorkommen; die Werte sind deshalb gegen FLAC mit 0,32 ms zu lesen. Das Bild bleibt dasselbe: MP3 mit beachteten Angaben, Opus und Vorbis liegen auf dem Niveau der Kontrolle, MP3 ohne Angaben reißt 39,21 ms Loch, und AAC behält seine gut 20 ms.
Was das für eigene Veröffentlichungen heißt
Wer einen durchgehenden Mitschnitt veröffentlicht, hat drei Möglichkeiten. Die sicherste ist, gar nicht zu teilen und eine Datei zu liefern. Die zweite ist ein Format, das die Länge von sich aus genau kennt: FLAC für das Archiv, Opus oder Vorbis für die Auslieferung. Die dritte ist MP3 oder AAC mit vollständigen Angaben, und dann hängt es am Abspieler.
Praktisch heißt das: Geschnitten wird vor dem Kodieren, nie danach. Jede Datei bekommt ihren Info-Rahmen beziehungsweise ihre vollständige Schnittliste, und vor dem Hochladen prüft ein Blick in die Datei, ob die Felder wirklich da sind. Genau dafür liest der Lückenlos-Prüfer den Kopf einer Datei aus und nennt die Werte; er rechnet auch aus, wie lang die Lücke bei einem Abspieler würde, der die Felder übergeht. Was sonst noch in die Dateien gehört, steht im Tutorial zu den Release-Metadaten.
Einordnung und Grenzen
- Kodiert wurde mit den Encodern, die ffmpeg mitbringt. Das LAME-Programm selbst, der Encoder von Apple und andere Umsetzungen schreiben andere Werte in den Rahmen; die Größenordnung bleibt, die Zahlen nicht unbedingt.
- Als Abspieler diente ffmpeg. Wie ein bestimmtes Programm oder ein bestimmtes Handy mit den Angaben umgeht, prüft diese Messung nicht.
- Die 0,02 ms in den Tabellen sind ein einzelner Abtastwert und damit die Auflösung des Verfahrens, nicht ein gemessener Mangel.
- Opus wird immer mit 48 kHz dekodiert. Die Werte gelten deshalb in Zeit, nicht in Abtastwerten der Quelldatei.
- Die Differenz zwischen den 1104 Abtastwerten aus 576 und 528 und den gemessenen 1105 ist notiert, aber nicht aufgeklärt.
Fragen und Antworten
Warum wurde für den Stoß ein Ton von genau 441 Hz gewählt?
Weil eine Schwingung dann genau 100 Abtastwerte lang ist und eine Hälfte von zwei Sekunden genau 882 ganze Schwingungen enthält. Die zweite Hälfte beginnt deshalb in derselben Phase, in der die erste endet, und das ungeteilte Signal läuft ohne Sprung durch. Jede Lücke und jeder Sprung am Stoß stammt damit aus der Kette aus Encoder und Decoder, nicht aus dem Schnitt.
Sind die gut 20 ms Lücke bei AAC ein fester Wert?
Nein, sie hängen von der Länge des Titels ab. Der AAC-Encoder arbeitet in Blöcken von 1024 Abtastwerten, setzt 1024 Abtastwerte Vorlauf davor und füllt den letzten Block mit Stille auf. Ein Abspieler, der nur den Startversatz beachtet, gibt genau diese Füllung als Stille wieder, und sie liegt je nach Länge zwischen 0 und 1023 Abtastwerten, bei 44,1 kHz also zwischen 0 und gut 23 ms.
Die Zahlen aus dem Artikel lassen sich damit nachrechnen:
- Sinuston, Hälften von zwei Sekunden: 88.200 plus 1024 Vorlauf ergibt 89.224, aufgerundet auf 88 volle Blöcke sind das 90.112 Abtastwerte, genau der Wert aus der Tabelle. Die Füllung beträgt 888 Abtastwerte oder 20,14 ms; gemessen wurden 20,16 ms, ein Abtastwert mehr, wie er an der Auflösungsgrenze auch sonst auftritt.
- Impuls, drei Sekunden: 132.300 plus 1024 ergibt 133.324, aufgerundet auf 131 Blöcke sind das 134.144. Nach Abzug von Vorlauf und Original bleiben 820 Abtastwerte, genau der Überschuss, den der Artikel am Ende nennt.
- Musik, das Stück von 32 Sekunden halbiert: 705.600 plus 1024 ergibt 706.624, aufgerundet auf 691 Blöcke sind das 707.584. Die Füllung beträgt 960 Abtastwerte oder 21,77 ms, genau der gemessene Wert.
Ein anderer Titel kann also fast lückenlos anschließen oder beinahe 23,2 ms verlieren, je nachdem, wie viele Abtastwerte ihm zum nächsten vollen Block fehlen. Verlässlich ist erst die vollständige Schnittliste.
Warum gibt es für Opus, Vorbis und FLAC keine Messung ohne Angaben?
Weil sich dort keine Datei ohne diese Angaben herstellen lässt, ohne das Format zu verletzen. Bei MP3 ist der Info-Rahmen eine Zugabe des Encoders; eine Datei ohne ihn bleibt eine gültige MP3-Datei, und genau so wurde sie für die Messung neu geschrieben. Bei Opus dagegen gehört der Vorlauf nach RFC 7845 fest in den Kopf und ist von der Granule-Position abzuziehen, bei Vorbis tragen die Granule-Positionen die Länge. FLAC fügt überhaupt keine Abtastwerte hinzu, es gibt also nichts, was ein Abspieler übergehen könnte.
Ein Abspieler, der diese Formate überhaupt korrekt liest, hat die Angaben also zwangsläufig vor sich. Ausgeschlossen ist ein Fehler damit nicht, aber er wäre ein Fehler des Abspielers, keine fehlende Angabe in der Datei.
Kann der Info-Rahmen einer MP3-Datei nach dem Kodieren noch verloren gehen?
Ja, überall dort, wo ein Werkzeug die Datei neu schreibt, das den Rahmen nicht kennt oder nicht übernimmt. Die Messung hat genau das genutzt: Für die Betriebsart ohne Angaben wurde dieselbe MP3-Datei ohne Info-Rahmen neu geschrieben, der Ton blieb unverändert. Schnittprogramme, die ohne Neukodierung trennen oder zusammenfügen, und Werkzeuge zum Umverpacken sind deshalb die Stellen, an denen ein vollständiger Rahmen verschwinden oder falsche Werte bekommen kann.
Daher gehört der Blick in die Datei an das Ende der Kette, unmittelbar vor das Hochladen, und nicht direkt hinter den Encoder. Ob eine Plattform die Datei nach dem Hochladen selbst neu kodiert, lässt sich von außen nicht prüfen; dann entscheidet ihr eigener Encoder.
Quellen
- RFC 7845: Ogg Encapsulation for the Opus Audio Codec: Pre-Skip als 16 Bit im Kopf, gezählt bei 48 kHz, abzuziehen von der Granule-Position; die letzte Seite darf weniger Ton enthalten, als das letzte Paket liefern würde.
- RFC 9639: Free Lossless Audio Codec (FLAC): STREAMINFO mit Abtastrate, Kanälen, Bit-Tiefe und der Gesamtzahl der Abtastwerte, wobei 0 für unbekannt steht.
- LAME: technisches FAQ: Encoder und Decoder fügen Abtastwerte hinzu, jeder getestete Decoder 528; LAME schreibt die Füllung in die Zusatzdaten des ersten Rahmens, den INFO-Tag.
- ffmpeg: Formats Documentation:
ignore_editlistübergeht die Schnittliste,advanced_editlistbildet sie im Index ab; ohne beide wird nur der Anfang angepasst.