Odtwarzanie bez przerw: wyprzedzenie i dopełnienie w MP3, AAC, Opus i FLAC, pomiar

Spis treści
Album bez przerw, DJ-set, zapis koncertu: przejście z utworu w utwór ma płynąć dalej. To, że często nie płynie, rzadko wynika z cięcia, a niemal zawsze z kodera. Formaty stratne pracują blokami i potrzebują rozbiegu, dodają więc przed muzyką i po niej próbki, których nikt nie nagrał.
Czy powstanie z tego słyszalna przerwa, rozstrzyga się dwukrotnie: przy kodowaniu, gdzie liczby trafiają do pliku albo nie, oraz przy odtwarzaniu, gdzie odtwarzacz te liczby uwzględnia albo pomija. Pomiar rozdziela oba kroki i podaje dla nich wartości.

Jak wyglądał pomiar
- Wyprzedzenie: trzy sekundy ciszy z pojedynczym impulsem dokładnie przy jednej sekundzie, zakodowane, znów zdekodowane, a potem odszukanie, gdzie impuls teraz leży. Przesunięcie to wyprzedzenie dodane przez cały łańcuch.
- Styk: ton 441 Hz przy 44,1 kHz, czyli dokładnie 100 próbek na okres, podzielony na dwie połowy po dwie sekundy. Obie połowy zostały zakodowane osobno, zdekodowane i złożone. Mierzone były: najdłuższy ciąg cichych próbek w oknie 100 ms wokół styku, największy skok między dwiema próbkami oraz poziom w oknie 20 ms.
- Muzyka: to samo na 32-sekundowym utworze z tej samej pracowni co pomiar do artykułu true peak po kodowaniu, również przepołowionym.
- Dwa tryby: raz tak, jak robi to ffmpeg, czyli z uwzględnieniem pól z pliku, a raz tak, jak dostałby to odtwarzacz je pomijający. Dla MP3 ten sam plik został zapisany ponownie bez ramki Info, dla MP4 odczytany z
-ignore_editlist 1. - Formaty: FLAC jako kontrola, MP3 przy 320 i 192 kbit/s oraz VBR V0 przez libmp3lame, AAC przy 256 kbit/s przez własny koder ffmpeg, Opus przy 128 i 256 kbit/s przez libopus, Ogg Vorbis przy 192 kbit/s. Wszystko w ffmpeg 7.1.5 na Raspberry Pi 4.
Co dodają kodery
| Format | Przesunięcie z polami | Przesunięcie bez pól | Co deklaruje plik |
|---|---|---|---|
| FLAC | 0 | nie dotyczy | liczba próbek w nagłówku |
| MP3 320 kbit/s | 0 | 1105 (25,06 ms) | ramka Info: 576 wyprzedzenia, 756 dopełnienia |
| MP3 192 kbit/s | 0 | 1105 (25,06 ms) | ramka Info: 576 wyprzedzenia, 756 dopełnienia |
| MP3 VBR V0 | 0 | 1105 (25,06 ms) | ramka Xing: 576 wyprzedzenia, 756 dopełnienia |
| AAC 256 kbit/s | 0 | 1024 (23,22 ms) | lista montażowa: start 1024, czas 3,000 s |
| Opus 128 i 256 kbit/s | 0 | nie dotyczy | pre-skip 312 przy 48 kHz (6,5 ms) |
| Ogg Vorbis 192 kbit/s | 0 | nie dotyczy | pozycje granule stron |
Pliki MP3 niosły ten sam wpis niezależnie od przepływności: 576 próbek wyprzedzenia i 756 dopełnienia. Bez tej ramki zmierzone przesunięcie wyniosło 1105 próbek, a plik okazał się o 1332 próbki dłuższy od oryginału. Różnica między 576 a 1105 pochodzi od dekodera: techniczne FAQ LAME odnotowuje, że każdy testowany dekoder wnosi opóźnienie 528 próbek. 576 i 528 dają 1104, zmierzono 1105; ta jedna próbka pozostała niewyjaśniona.
W AAC początek opisuje lista montażowa ścieżki, tutaj z przesunięciem startu o 1024 próbki. Na końcu zostało 820 próbek więcej niż w oryginale. Opus dekoduje zawsze przy 48 kHz, więc przesunięcie liczone było w czasie; według RFC 7845 pre-skip stoi w nagłówku i w tych plikach wynosi 312 próbek, czyli 6,5 ms. FLAC podaje w nagłówku dokładną liczbę próbek, a Ogg Vorbis niesie długość w pozycjach granule, więc w obu nic nie dochodzi.
Styk: 37,57 ms ciszy tam, gdzie jej nie powinno być
Ton ciągły, przecięty w środku i znów złożony, pokazuje szkodę najwyraźniej. Kolumna „przerwa” podaje najdłuższy ciąg cichych próbek na styku, a poziom odnosi się do tego samego miejsca w sygnale nieprzeciętym:
| Format | Przerwa z polami | Poziom z polami | Przerwa bez pól | Poziom bez pól |
|---|---|---|---|---|
| FLAC (kontrola) | 0,02 ms | 0,00 dB | nie dotyczy | nie dotyczy |
| 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 | nie dotyczy | nie dotyczy |
| Ogg Vorbis 192 kbit/s | 0,02 ms | 0,04 dB | nie dotyczy | nie dotyczy |
Te 0,02 ms to pojedyncza próbka, czyli granica tego pomiaru: w miejscu przejścia przez zero ton na moment schodzi poniżej progu. MP3, Opus i Vorbis łączą się więc bez przerwy, dopóki pola są uwzględniane. Ten sam ton odtworzony bez ramki Info zostawia na styku 37,57 ms ciszy, a poziom spada o 85 dB. To już nie drobiazg, to pauza.
AAC trzyma przerwę, dopóki nie dojdzie czas trwania
Wartość 20,16 ms w wierszu AAC odstaje, bo tam pola przecież uwzględniono. Próba kontrolna w trzech stopniach pokazuje, skąd to się bierze:
| Stopień | Przerwa na styku | Długość jednej połowy |
|---|---|---|
| żadne pole nieuwzględnione | 43,38 ms | 90 112 próbek |
| uwzględniony tylko początek listy montażowej | 20,16 ms | 89 088 próbek |
| uwzględniony początek i czas trwania | 0,02 ms | 88 200 próbek |
Dwie sekundy przy 44,1 kHz to 88 200 próbek. Lista montażowa opisuje jedno i drugie: przesunięcie startu oraz czas trwania ścieżki; kto zastosuje tylko przesunięcie, przytnie czysto początek i zachowa dopełnienie jako ciszę. Dokładnie to opisuje dokumentacja ffmpeg przy przełączniku advanced_editlist: gdy oba przełączniki są wyłączone, zmieniany jest tylko początek indeksu, aby odwzorować początkowy czas oczekiwania albo znacznik startu z listy montażowej. Gdy dochodzi czas trwania, przerwa znika całkowicie.
Z muzyką zamiast tonu sinusoidalnego
| Format | Przerwa z polami | Poziom z polami | Przerwa bez pól |
|---|---|---|---|
| FLAC (kontrola) | 0,32 ms | 0,00 dB | nie dotyczy |
| 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 | nie dotyczy |
| Ogg Vorbis 192 kbit/s | 0,29 ms | 0,04 dB | nie dotyczy |
Przy muzyce próg ciszy zadziała na moment także w kontroli, bo w sygnale i tak są ciche miejsca; wartości należy więc czytać względem FLAC z 0,32 ms. Obraz pozostaje ten sam: MP3 z uwzględnionymi polami, Opus i Vorbis są na poziomie kontroli, MP3 bez pól wyrywa dziurę 39,21 ms, a w AAC zostaje dobre 20 ms.
Co to znaczy dla własnych wydawnictw
Publikacja ciągłego zapisu pozostawia trzy możliwości. Najpewniejsza to nie dzielić wcale i dostarczyć jeden plik. Druga to format, który sam zna dokładną długość: FLAC do archiwum, Opus albo Vorbis do dostarczenia. Trzecia to MP3 albo AAC z kompletnymi polami, a wtedy wszystko zależy od odtwarzacza.
Praktycznie oznacza to: cięcie przed kodowaniem, nigdy po nim. Każdy plik dostaje ramkę Info albo pełną listę montażową, a przed wysyłką zaglądnięcie do pliku pokazuje, czy pola naprawdę tam są. Do tego służy sprawdzenie odtwarzania bez przerw: czyta nagłówek pliku, podaje wartości i wylicza, jak długa byłaby przerwa u odtwarzacza pomijającego te pola. Co jeszcze należy do plików, opisuje poradnik o metadanych wydawnictwa.
Zakres i granice
- Kodowanie odbyło się koderami, które niesie ffmpeg. Sam program LAME, koder Apple i inne implementacje wpisują do ramki inne wartości; rząd wielkości pozostaje, dokładne liczby niekoniecznie.
- Rolę odtwarzacza pełnił ffmpeg. Jak z tymi polami obchodzi się konkretny program albo konkretny telefon, ten pomiar nie sprawdza.
- Te 0,02 ms w tabelach to pojedyncza próbka, czyli rozdzielczość metody, a nie zmierzona wada.
- Opus jest zawsze dekodowany przy 48 kHz. Wartości obowiązują więc w czasie, a nie w próbkach pliku źródłowego.
- Różnica między 1104 próbkami z 576 i 528 a zmierzonymi 1105 jest odnotowana, lecz niewyjaśniona.
Pytania i odpowiedzi
Dlaczego do pomiaru styku wybrano ton o częstotliwości dokładnie 441 Hz?
Bo jeden okres ma wtedy dokładnie 100 próbek, a dwusekundowa połowa zawiera dokładnie 882 pełne okresy. Druga połowa zaczyna się więc w tej samej fazie, w której kończy się pierwsza, a sygnał nieprzecięty biegnie bez skoku. Każda przerwa i każdy skok na styku pochodzą zatem z łańcucha kodera i dekodera, a nie z cięcia.
Czy przerwa o długości nieco ponad 20 ms w AAC to wartość stała?
Nie, zależy od długości utworu. Koder AAC pracuje blokami po 1024 próbki, dodaje z przodu 1024 próbki wyprzedzenia i dopełnia ostatni blok ciszą. Odtwarzacz uwzględniający tylko przesunięcie startu odtwarza właśnie to dopełnienie jako ciszę, a wynosi ono, zależnie od długości, od 0 do 1023 próbek, czyli przy 44,1 kHz od 0 do nieco ponad 23 ms.
Liczby z artykułu da się w ten sposób przeliczyć:
- Ton sinusoidalny, połowy po dwie sekundy: 88 200 plus 1024 próbki wyprzedzenia daje 89 224; po zaokrągleniu w górę do 88 pełnych bloków to 90 112 próbek, dokładnie wartość z tabeli. Dopełnienie wynosi 888 próbek, czyli 20,14 ms; zmierzono 20,16 ms, o jedną próbkę więcej, jak zdarza się to na granicy rozdzielczości także w innych wierszach.
- Impuls, trzy sekundy: 132 300 plus 1024 daje 133 324; po zaokrągleniu w górę do 131 bloków to 134 144. Po odjęciu wyprzedzenia i oryginału zostaje 820 próbek, dokładnie nadwyżka, którą artykuł podaje na końcu.
- Muzyka, 32-sekundowy utwór przepołowiony: 705 600 plus 1024 daje 706 624; po zaokrągleniu w górę do 691 bloków to 707 584. Dopełnienie wynosi 960 próbek, czyli 21,77 ms, dokładnie wartość zmierzoną.
Inny utwór może więc połączyć się niemal bez przerwy albo stracić prawie 23,2 ms, zależnie od tego, ilu próbek brakuje mu do następnego pełnego bloku. Pewność daje dopiero pełna lista montażowa.
Dlaczego dla Opus, Vorbis i FLAC nie ma pomiaru bez pól?
Bo nie da się tam wytworzyć pliku bez tych pól, nie naruszając formatu. W MP3 ramka Info jest dodatkiem kodera; plik bez niej pozostaje poprawnym plikiem MP3 i właśnie tak zapisano go ponownie do pomiaru. W Opus natomiast pre-skip jest według RFC 7845 stałą częścią nagłówka i należy go odjąć od pozycji granule, a w Vorbis długość niosą pozycje granule. FLAC w ogóle nie dodaje próbek, więc nie ma niczego, co odtwarzacz mógłby pominąć.
Odtwarzacz, który w ogóle poprawnie czyta te formaty, ma więc te informacje siłą rzeczy przed sobą. Nie wyklucza to błędu, ale byłby to błąd odtwarzacza, a nie brakujące pole w pliku.
Czy ramka Info pliku MP3 może zginąć jeszcze po zakodowaniu?
Tak, wszędzie tam, gdzie plik zapisuje na nowo narzędzie, które tej ramki nie zna albo jej nie przenosi. Pomiar wykorzystał właśnie to: na potrzeby trybu bez pól ten sam plik MP3 zapisano ponownie bez ramki Info, a dźwięk pozostał niezmieniony. Programy, które dzielą lub łączą pliki bez ponownego kodowania, oraz narzędzia do przepakowywania są więc miejscami, w których kompletna ramka może zniknąć albo dostać błędne wartości.
Dlatego kontrola pliku powinna stać na końcu łańcucha, bezpośrednio przed wysyłką, a nie zaraz za koderem. Czy platforma po wysłaniu sama koduje plik na nowo, nie da się sprawdzić z zewnątrz; wtedy decyduje jej własny koder.
Źródła
- RFC 7845: Ogg Encapsulation for the Opus Audio Codec: pre-skip jako 16 bitów w nagłówku, liczony przy 48 kHz, do odjęcia od pozycji granule; ostatnia strona może zawierać mniej dźwięku, niż dałby ostatni pakiet.
- RFC 9639: Free Lossless Audio Codec (FLAC): STREAMINFO z częstotliwością próbkowania, kanałami, głębią bitową i łączną liczbą próbek, gdzie 0 oznacza nieznaną.
- LAME: techniczne FAQ: kodery i dekodery dodają próbki, każdy testowany dekoder 528; LAME zapisuje dopełnienie w danych dodatkowych pierwszej ramki, czyli w tagu INFO.
- ffmpeg: Formats Documentation:
ignore_editlistpomija listę montażową,advanced_editlistodwzorowuje ją w indeksie; przy obu wyłączonych zmieniany jest tylko początek.