Ripara ora
- Trascina il file
- La riparazione avviene in locale
- Scarica il risultato
Quasi ogni MP3 che finisce nel silenzio è rotto nella struttura, non cancellato. L'audio vive in una successione di frame audio MPEG autonomi, ciascuno annunciato da una sincronia di frame di 11 bit: il byte 0xFF seguito da un byte i cui tre bit superiori sono tutti a uno (maschera 0xE0). Il lettore si aggancia alla prima sincronia, legge l'header di 4 byte, salta della lunghezza di frame che calcola e ripete. Rompi quella successione — un tag ID3 corrotto con una lunghezza errata, dati spuri attaccati all'inizio, una manciata di frame alterati da un settore difettoso — e il decoder perde il filo e segnala il file come non supportato o danneggiato. Trascina il file qui sopra e lo strumento ricostruisce la catena nel tuo browser: elimina un tag ID3 iniziale e qualsiasi dato spurio, risincronizza sul primo frame autentico, salta i frame che non riesce a verificare e riscrive quelli sopravvissuti come un MP3 pulito e riproducibile — senza che nulla lasci mai il tuo dispositivo.
Perché un MP3 si rifiuta di suonare quando l'audio è quasi intatto
Un MP3 non è un unico blocco — è una sequenza di piccoli frame audio MPEG, ciascuno di circa 26 ms di suono. Ogni frame inizia con un header di 4 byte: il byte 0 è 0xFF, e i tre bit superiori del byte 1 completano la sincronia di frame di 11 bit (0xFFE…). Il resto dell'header racchiude la versione MPEG (MPEG-1, MPEG-2 o MPEG-2.5), il layer (quasi sempre Layer III), un indice di bitrate, un indice di frequenza di campionamento e un bit di padding. A partire dal bitrate e dalla frequenza di campionamento il decoder calcola la lunghezza in byte del frame — per il Layer III è floor(144 × bitrate ÷ sample_rate) + padding — e la usa per saltare direttamente alla sincronia successiva. Certe combinazioni di bit sono illegali secondo la specifica: una versione riservata, un layer riservato, un indice di bitrate pari a 0 (free) o 15 (bad), o un indice di frequenza di campionamento pari a 3. Se l'header su cui il decoder atterra decodifica in una di queste, non è un confine di frame reale e il flusso si blocca.
Due cose fanno deragliare quel salto più spesso di altre. La prima è un tag ID3v2 rotto proprio all'inizio. Un tag ID3v2 comincia con i byte ASCII ID3 (0x49 0x44 0x33), un header di 10 byte e una dimensione syncsafe di 28 bit distribuita su quattro byte (ciascuno contribuisce solo con i suoi 7 bit inferiori). Se quella dimensione è errata — spesso perché una copertina incorporata troppo grande o troncata ha corrotto il tag — il lettore o salta oltre l'inizio dell'audio reale, oppure tenta di decodificare il tag come suono. La seconda è la spazzatura iniziale: un download parziale, una pagina di errore HTTP salvata per sbaglio con nome .mp3, o un errore di ordine dei byte che antepone dati prima della prima sincronia. I file senza alcun tag ID3 non sono altro che una "pura sincronia di frame audio MPEG" — un segnale debole che alcuni lettori non riconoscono nemmeno come un MP3.
Ecco perché i sintomi sono così vari. ffmpeg segnala Failed to find two consecutive MPEG audio frames o Header missing; mpg123 stampa Illegal Audio-MPEG-Header 0x00000000 e avverte di un Frankenstein stream quando i parametri del frame cambiano a metà file; un elemento <audio> del browser lancia DEMUXER_ERROR_COULD_NOT_OPEN. Descrivono tutti la stessa cosa: la catena dei frame è rotta, non che la musica sia sparita.
Come la risincronizzazione dei frame nel browser ricostruisce un file riproducibile
La riparazione è una risincronizzazione strutturale, e viene eseguita come puro TypeScript nella tua scheda. Per prima cosa misura un eventuale tag ID3v2 iniziale a partire da quella dimensione syncsafe (più un footer di 10 byte quando il bit di footer è attivo) e lo supera. Poi scorre il file in avanti alla ricerca di un pattern di byte che si interpreti come un header reale — 0xFF, i bit di sincronia 0xE0, una versione e un layer non riservati, e un indice di bitrate e di frequenza di campionamento entrambi entro i limiti. È fondamentale ricordare che un singolo 0xFF 0xEx può comparire per caso all'interno dei dati audio, quindi un candidato viene accettato solo quando la lunghezza di frame che calcola posiziona il lettore esattamente su un'altra sincronia valida (o sulla fine del file). Questa conferma a due frame è ciò che scarta i falsi positivi invece di scrivere rumore nell'output.
Da lì avanza frame per frame, copiando ogni frame confermato tale e quale nell'output. I byte precedenti al primo frame valido vengono conteggiati come spazzatura iniziale e scartati; un tratto che non si riesce a interpretare a metà file viene trattato come una regione di frame corrotti e saltato, così che il lettore possa riagganciare la catena alla sincronia pulita successiva. Poiché ogni frame conservato viene copiato byte per byte, non c'è ricodifica né perdita di qualità — l'audio sopravvissuto è esattamente quello che hai registrato. Lo strumento riferisce ciò che ha fatto: frame trovati rispetto a frame conservati, quanti byte di spazzatura iniziale ha rimosso, e una classe di danno pari a clean (un successo pulito) o resynced (un risultato parziale, in cui sono stati scartati dati spuri o frame corrotti).
Vale la pena conoscere due dettagli. Molti MP3 contengono un header Xing/Info (o VBRI) all'interno del primo frame; memorizza il conteggio totale dei frame e una tabella di seek per i file a bitrate variabile. Quell'header è di per sé un frame MPEG valido, quindi la risincronizzazione lo conserva quando sopravvive — e quando non sopravvive, i lettori ripiegano sulla stima della durata a partire dal bitrate (ffmpeg avverte letteralmente Estimating duration from bitrate, this may be inaccurate). Un tag ID3v1 finale — i 128 byte fissi che iniziano con TAG alla fine del file — non è un frame, quindi viene semplicemente scartato dalla coda invece di confondere il decoder. Nulla di tutto ciò tocca la rete: puoi aprire la scheda Rete e verificare che non esca nemmeno un byte del file.
Quando davvero non c'è riparazione possibile
La risincronizzazione aiuta solo quando da qualche parte nel file sopravvivono frame MPEG reali. Se la scansione non trova alcun frame decodificabile, lo strumento si ferma e lo dice con onestà (un risultato no-frames) invece di consegnarti un file vuoto che finge di funzionare. Quell'esito di solito significa che i byte non sono affatto audio MPEG: un file AAC/.m4a, WMA o Opus rinominato in .mp3, oppure una pagina web salvata o uno spezzone di download con estensione audio. Non ci sono header di frame 0xFFE a cui agganciarsi, e nessuna risincronizzazione può inventarli.
Non può nemmeno recuperare audio che è stato sovrascritto o restituito come zeri da un disco difettoso o da una scheda danneggiata — quei frame non sono sul disco, quindi recupera prima i byte grezzi a livello di archiviazione e poi ripara il file. Le tracce protette da DRM (il vecchio .m4p di Apple o l'AAC protetto) non sono MP3 e hanno bisogno delle loro chiavi per essere decodificate; questo strumento non le tocca. E laddove una regione corrotta ha dovuto essere scartata, in quel punto può rimanere un breve vuoto o un clic — la riparazione copia i frame validi senza perdita, ma non sintetizza i millisecondi mancanti. Ciò che recuperi in modo affidabile è ogni frame che era intatto, in ordine, in un contenitore che un lettore aprirà davvero.
Cosa può e cosa non può riparare
Può riparare
- MP3 con un tag ID3v2 rotto o sovradimensionato (dimensione syncsafe errata, copertina incorporata corrotta) che fa saltare il lettore oltre l'audio o dentro di esso
- Spazzatura iniziale prima del primo frame — un download parziale, una pagina di errore HTTP salvata come .mp3, o un errore di prefisso — scartata affinché la riproduzione inizi dal primo frame reale
- Perdita di sincronia dei frame a metà file: lo strumento risincronizza sull'header 0xFF 0xEx valido successivo e prosegue
- Frame corrotti isolati dovuti a settori difettosi, saltati affinché i frame sopravvissuti suonino comunque
- Flussi MPEG nudi senza tag ID3 che un lettore non riconosce come MP3
- Spazzatura finale o un tag ID3v1 di 128 byte isolato dopo l'ultimo frame audio
Non può riparare
- File senza alcun frame MPEG decodificabile — non c'è nulla da risincronizzare (segnalato come un risultato 'no-frames')
- File che non sono MP3 con un nome .mp3 (AAC/.m4a, WMA, Opus o una pagina web salvata) — nessun header di frame 0xFFE da trovare
- Audio sovrascritto o restituito come zeri da un disco difettoso — recupera prima i byte grezzi e poi ripara
- Tracce protette da DRM (.m4p / AAC protetto) senza le loro chiavi — non sono MP3 e non possono essere decodificate
- L'audio esatto all'interno di un frame che ha dovuto essere scartato — può rimanere un breve vuoto o clic dove è stata rimossa una regione (nessuna ricodifica lo riporta indietro)
Se una riparazione fallisce, ti diciamo perché (dati mancanti rispetto a struttura danneggiata), e non ti viene mai addebitato nulla per una riparazione fallita.