Ripara ora
- Trascina il file
- La riparazione avviene in locale
- Scarica il risultato
I telefoni Android — Pixel, Samsung, Xiaomi, OnePlus e tutti gli altri — registrano video attraverso le API MediaRecorder e MediaMuxer della piattaforma, che scrivono un .mp4 standard nel contenitore ISO base-media. L'immagine e l'audio confluiscono in un box mdat mentre riprendi, ma l'atomo moov — l'indice che mappa ogni fotogramma — viene scritto solo quando l'app chiama MediaMuxer.stop() alla fine. Se l'app non arriva mai a quella chiamata, ti resta un file pieno di dati HEVC o H.264 validi ma senza indice, e qualsiasi lettore lo rifiuta. Trascina il file qui sopra e lo strumento verifica esattamente questo, nel tuo browser, e ricostruisce il contenitore quando il materiale è recuperabile.
Perché Android lascia un .mp4 non finalizzato
Lo stack multimediale di Android è esplicito su quando una registrazione diventa riproducibile. Durante la cattura, MediaRecorder (o un'app di fotocamera che usa direttamente MediaCodec + MediaMuxer) continua ad aggiungere campioni codificati all'mdat. L'atomo moov — dimensioni dei campioni, offset dei frammenti (chunk), tabelle di sincronizzazione e i set di parametri del codec — viene assemblato in memoria e scritto in fondo al file solo quando vengono eseguiti stop() e release(). Se salti quel passaggio, i byte sul disco sono un MP4 senza testa: fotogrammi reali, senza mappa.
A provocarlo sono tre interruzioni. L'app Fotocamera si è chiusa di colpo o è stata terminata dal sistema. Un bug, oppure il "killer" delle risorse basse di Android (low-memory killer) che recupera un'app in secondo o primo piano sotto pressione di memoria, termina il processo prima di stop(), così nulla scrive l'indice. Lo spazio di archiviazione si è riempito durante la registrazione. Il 4K in HEVC scrive molto rapidamente; quando l'archiviazione interna o la scheda SD arriva a zero byte liberi, la scrittura del muxer fallisce a metà e il file resta troncato senza moov. Il telefono si è spento. Una batteria scarica o un riavvio forzato durante la cattura salta la finalizzazione allo stesso modo.
Il codec all'interno è HEVC/H.265 (quello predefinito per le modalità ad alta risoluzione sulla maggior parte degli Android moderni, scelto per la sua efficienza) oppure H.264/AVC (l'alternativa per compatibilità). Il comportamento del contenitore è identico in entrambi i casi, ed è per questo che la via di riparazione è la stessa qualunque sia il codec.
Cosa si può ricostruire e cosa no
Poiché i dati dei fotogrammi sopravvivono nell'mdat, la soluzione è ricostruire l'indice che MediaMuxer.stop() non ha mai scritto. Lo strumento analizza il flusso sopravvissuto, recupera i limiti e la sincronizzazione di ogni fotogramma e rifà le tabelle dei campioni affinché un lettore possa decodificare dall'inizio, trasformando un file senza testa in un normale MP4 navigabile. Quando il file è anche rimasto troncato per un disco pieno, recupera i fotogrammi che sono stati scritti per intero prima del taglio e chiude attorno a essi un contenitore riproducibile, così un clip che ha catturato l'80% di una ripresa restituisce quell'80% invece di fallire per intero. Tutto questo viene eseguito nel tuo browser mentre il file viene letto dall'archiviazione.
Il limite onesto è che i fotogrammi scritti dopo l'interruzione non esistono: un disco pieno ferma la scrittura, un blocco ferma il codificatore, e nessuno strumento può inventare byte che non sono mai stati memorizzati. Quando resta solo la copia troncata, recuperarla è la scelta giusta; ma se il file originale è ancora sul telefono e basta ricopiarlo in modo pulito, fallo prima, perché una copia buona batte qualsiasi riparazione.
Perché aiuta un clip dallo stesso telefono e dalla stessa app
Ricostruire l'indice è più affidabile quando lo strumento conosce la configurazione esatta del codec che il file danneggiato ha omesso. Un clip integro dallo stesso telefono, registrato dalla stessa app nella stessa modalità, fornisce proprio questo: i set di parametri di HEVC (VPS/SPS/PPS) o gli SPS/PPS di H.264, oltre alla risoluzione e alla frequenza dei fotogrammi, in modo che la ricostruzione riproduca l'originale invece di approssimarlo.
In pratica: registra qualche secondo di prova con la stessa app di fotocamera e le stesse impostazioni di qualità, e tienilo a portata di mano. Fai in modo che il codec corrisponda (un riferimento HEVC per un clip HEVC, H.264 per H.264) e ti verrà chiesto solo se la riparazione ne ha bisogno. Un campione da un altro telefono o da un'altra app di solito non combacia, perché i set di parametri sono diversi.
Cosa può e cosa non può riparare
Può riparare
- Una registrazione che l'app Fotocamera o un'app video non ha mai finalizzato perché si è chiusa o è stata terminata dal sistema prima di MediaMuxer.stop() (manca il moov)
- Clip interrotti quando l'archiviazione interna o la scheda SD si è riempita durante la registrazione
- Registrazioni interrotte da una batteria scarica o da un riavvio forzato durante la cattura
- File .mp4 HEVC e H.264 che non si aprono in Google Foto, la Galleria, VLC o un editor pur contenendo fotogrammi reali
Non può riparare
- Il materiale successivo all'interruzione: quei fotogrammi non sono mai stati scritti nell'archiviazione
- Un file che risulta di 0 byte o quasi tutto zeri dopo una copia fallita o una scheda SD difettosa
- Contenuti protetti da DRM o cifrati
- Un clip HEVC danneggiato senza un riferimento HEVC equivalente dallo stesso telefono e dalla stessa app
Se una riparazione fallisce, ti diciamo perché (dati mancanti rispetto a struttura danneggiata), e non ti viene mai addebitato nulla per una riparazione fallita.