LW IT Solutions
« Przegląd bloga /Music Production / Odtwarzanie bez przerw: wyprzedzenie i dopełnienie w...
Ten artykuł w innych językach:

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

Odtwarzanie bez przerw: wyprzedzenie i dopełnienie w MP3, AAC, Opus i FLAC, pomiar
Spis treści
  1. Jak wyglądał pomiar
  2. Co dodają kodery
  3. Styk: 37,57 ms ciszy tam, gdzie jej nie powinno być
  4. AAC trzyma przerwę, dopóki nie dojdzie czas trwania
  5. Z muzyką zamiast tonu sinusoidalnego
  6. Co to znaczy dla własnych wydawnictw
  7. Zakres i granice
  8. Pytania i odpowiedzi
  9. Źródła

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.

Diagram z dwóch części. Po lewej poziome słupki ciszy na styku dwóch osobno zakodowanych połówek: FLAC, MP3, Opus i Vorbis przy uwzględnionych polach są na poziomie 0,02 ms, AAC na 20,16 ms; przy pominiętych polach MP3 rośnie do 37,57 ms, a AAC do 43,38 ms. Po prawej trzy wycinki przebiegu po 60 milisekund: w MP3 z uwzględnionymi polami ton przechodzi przez styk, a w MP3 bez ramki Info oraz w AAC z uwzględnionym tylko początkiem widać odcinek bez wychyleń. Poniżej cztery wielkości
Cisza na styku dwóch osobno zakodowanych połówek, dla każdego formatu z uwzględnionymi polami i bez nich, oraz przebieg w tym samym miejscu.

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_editlist pomija listę montażową, advanced_editlist odwzorowuje ją w indeksie; przy obu wyłączonych zmieniany jest tylko początek.
Lukas Wójcik

Lukas Wójcik

Systems architect and technology enthusiast specializing in scalable tracking solutions, GMP Stack (GA4 & GTM), and robust backend architectures. Advocate for clean code and privacy-first design.

Get in Touch

Briefly describe your project or inquiry for a tailored response. This site is protected by reCAPTCHA.

Napisanie komentarza

Doświadczenia z innymi programami DAW i wtyczkami, odmienne wyniki pomiarów oraz pytania są tu mile widziane.

Adres e-mail nie jest publikowany. Pola obowiązkowe oznaczono gwiazdką.

Artykuły i kategorie

CCTV

Śledź tę kategorię przez RSS

Cloud & AI

Wszystkie artykuły w tej kategorii (17) Śledź tę kategorię przez RSS

Data Privacy

Wszystkie artykuły w tej kategorii (18) Śledź tę kategorię przez RSS

Digital Analytics

Wszystkie artykuły w tej kategorii (58) Śledź tę kategorię przez RSS

Digital Marketing

Wszystkie artykuły w tej kategorii (37) Śledź tę kategorię przez RSS

IT & Networks

Wszystkie artykuły w tej kategorii (18) Śledź tę kategorię przez RSS

Music Production

Wszystkie artykuły w tej kategorii (17) Śledź tę kategorię przez RSS

Raspberry Pi

Śledź tę kategorię przez RSS

SaaS & Internet Earning

Śledź tę kategorię przez RSS

Smart Home

Wszystkie artykuły w tej kategorii (18) Śledź tę kategorię przez RSS

Tworzenie stron internetowych

Wszystkie artykuły w tej kategorii (11) Śledź tę kategorię przez RSS

Wtyczki i triki WordPress

Wszystkie artykuły w tej kategorii (13) Śledź tę kategorię przez RSS