Come aprire e riparare un file video m4v o mp4?


59

Ieri stavo filmando una scena con il mio telefono, ma all'improvviso l'applicazione si è bloccata e quando provo ad aprire l'm4v generato si dice che è danneggiato.

Ho scaricato i file video (circa 36 MB) sul mio PC e sto provando ad aprirlo e ripararlo. Puoi suggerirmi un modo per farlo?

Informazioni FFMPEG

Come suggerito nei commenti, provo a controllare cosa mi dice FFMPEG su quel file con questo comando

ffmpeg.exe -i VID_20120425_144739.m4v -c:v copy -c:a copy out.mp4 2> log.txt

Ecco il risultato:

ffmpeg version N-40126-ga4b58fd Copyright (c) 2000-2012 the FFmpeg developers
  built on Apr 26 2012 03:29:50 with gcc 4.6.3
  configuration: --enable-gpl --enable-version3 --disable-w32threads --enable-runtime-cpudetect --enable-avisynth --enable-bzlib --enable-frei0r --enable-libass --enable-libcelt --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libfreetype --enable-libgsm --enable-libmp3lame --enable-libnut --enable-libopenjpeg --enable-librtmp --enable-libschroedinger --enable-libspeex --enable-libtheora --enable-libutvideo --enable-libvo-aacenc --enable-libvo-amrwbenc --enable-libvorbis --enable-libvpx --enable-libx264 --enable-libxavs --enable-libxvid --enable-zlib
  libavutil      51. 47.100 / 51. 47.100
  libavcodec     54. 15.100 / 54. 15.100
  libavformat    54.  3.100 / 54.  3.100
  libavdevice    53.  4.100 / 53.  4.100
  libavfilter     2. 72.100 /  2. 72.100
  libswscale      2.  1.100 /  2.  1.100
  libswresample   0. 11.100 /  0. 11.100
  libpostproc    52.  0.100 / 52.  0.100
[mov,mp4,m4a,3gp,3g2,mj2 @ 003fc940] moov atom not found
VID_20120425_144739.m4v: Invalid data found when processing input

Le ultime due righe sono visualizzate in rosso.


Il mio sistema operativo è Windows 7 ma, se necessario, posso preparare una macchina virtuale con distribuzione basata su Linux.
Drake,

@slhck Grazie per l'aiuto, ho fatto quello che mi hai suggerito e aggiornato la domanda.
Drake,

7
Ah, è quello che mi aspettavo. L'atomo MOOV è un dato necessario per accedere ai flussi video non elaborati all'interno del contenitore MP4 / M4V. Ci sono molti strumenti di "riparazione video" online, ma non mi fiderei di loro. Puoi sicuramente dare loro una possibilità, ma non pagare nulla. Ciò che sembra promettente è Untrunk , che sembra essere codificato per questo esatto problema (vale a dire un atomo MOOV mancante). O AtomicParsley . In bocca al lupo!
slhck,

1
Come posso riparare un mp4 rotto con AtomicParsley?
amorevole

Risposte:


60

È possibile riparare il file mp4 o m4v rotto usando Untrunc .

Per questo metodo è necessario un altro file video dallo stesso dispositivo che non sia rotto.

Come installare untrunc

Per la compilazione è necessaria un'installazione Linux (idealmente Ubuntu) e la capacità di base di utilizzare una riga di comando. Puoi anche saltare questa parte ed eseguire untrunctramite Docker (vedi la risposta sotto ), se ce l'hai.

Questo è cosa fare:

  1. Installa alcune librerie prerequisiti con questo comando:

    sudo apt-get install libavformat-dev libavcodec-dev libavutil-dev

  2. Ottieni il codice sorgente per Untrunc dal repository GitHub (scegli un metodo):

    • wget https://github.com/ponchio/untrunc/archive/master.zip && unzip master.zip && cd untrunc-master
    • o git clone https://github.com/ponchio/untrunc.git && cd untrunc
  3. Compilare il codice sorgente usando questo comando (tutta una riga):

    g++ -o untrunc file.cpp main.cpp track.cpp atom.cpp mp4.cpp -L/usr/local/lib -lavformat -lavcodec -lavutil

    (puoi provare a saltare questo passaggio e utilizzare l'eseguibile pronto, ma non ha funzionato per me)

  4. Quindi puoi effettivamente riparare il video. Sono necessari sia il video rotto che un esempio di video funzionante.

Come riparare il video

Trova un altro video funzionante, idealmente dalla stessa fotocamera e preferibilmente almeno finché quello rotto; anche la stessa risoluzione, se possibile (credo che ciò possa aiutare, sebbene non sia essenziale).

Esegui questo comando nella cartella in cui hai decompresso e compilato Untrunc ma sostituisci i /path/to/...bit con i tuoi 2 file video:

./untrunc /path/to/working-video.m4v /path/to/broken-video.m4v

Quindi dovrebbe sfornare e, si spera, produrre un file riproducibile chiamato broken-video_fixed.m4v

Ecco fatto!

VLC Media Player dovrebbe ora essere in grado di riprodurre il file. Tuttavia, potrebbero essere riportate informazioni sulla lunghezza errate (Untrunc tenta di indovinarlo / risolverlo, ma non sempre lo fa nel modo giusto). Per risolvere questo problema prova a ricodificare il video attraverso un altro programma.

[Grazie al commento di Slhck per il suggerimento di provare Untrunc.]

[Mille grazie a Federico Ponchio per aver codificato Untrunc in primo luogo, per risolvere esattamente questo problema.]


Bene, grazie per aver fornito le istruzioni complete qui!
Slhck,

3
Grazie @Alex ho aggiornato il link. Divertentemente il Readme su github si basa su questa risposta!
Sparrowt

1
Darebbe una soluzione basata su Windows. < superuser.com/questions/938185/recover-incomplete-video-files > poiché non ho accesso a Internet nelle mie distribuzioni di Linux.
RogUE,

2
FWIW questo non ha prodotto alcun video riproducibile per me, ma l'esecuzione di recover_mp4_to_h264 tramite wine ha funzionato bene.
Il compilatore

1
Untrunc ha funzionato per me, ma ho dovuto mettere entrambi i file video nella sottodirectory della cartella nascosta .untrunc denominata untrunc-master. Quindi, esegui: ./untrunc goodfile.mp4 badfile.mp4 Ci sono voluti circa 3 minuti per un file da 2 GB e ho dovuto solo risincronizzare l'audio. Tutto il resto andava bene.
user8547

8

Se qualcun altro si imbatte in questo, ho anche provato l'app di cui parlava Sparrowt, ma non ha funzionato per me (vedi alcune segnalazioni di bug che ho creato nel repository degli sviluppatori). Forse questo perché non era un file mp4 ma un file MOV ...

Ciò che mi ha aiutato è stato questo post: http://muzso.hu/2012/11/14/how-to-fix-a-broken-mp4-mov-video-ffmpeg-reports-moov-atom-not-found

Collegano a un programma chiamato "HD Video Repair Utility" ( http://grauonline.de/cmsimple2_6/en/?Solutions:HD_Video_Repair_Utility ), che è molto più economico di Treasured ( http://aeroquartet.com/movierepair/repair ) . Hanno anche sottolineato che esisteva una versione precedente (versione 1.5) che non costava nulla ( http://nagasoft.cn/download/videorepair1.5.zip )!

Ho provato a riparare il file usando la versione 1.5 e l'ho parzialmente funzionato. Dopo aver ricodificato con ffmpeg (ho riscontrato alcuni errori lì), mi sono reso conto che una parte dell'audio era sparita. Nei registri (volentieri l'utilità di riparazione video ne ha alcuni), non è stato più menzionato l'audio dopo un determinato tempo. Lo prenderò così com'è ...


3
L'URL di DROPBOX è morto. trovato alternativa: nagasoft.cn/download/videorepair1.5.zip
T.Todua

2
@ T.Todua, grazie per la notifica. Ho sostituito il link dropbox con il link che hai fornito.
SimonSimCity

8

È possibile installare docker(disponibile per tutti i principali sistemi operativi) ed eseguire:

docker run -v $(pwd):/vol -it synctree/untrunc /vol/GOOD-reference-file.MP4 /vol/BAD-corrupt-file.mdt

La sintassi è per Bash su Linux o macOS. Qui, GOOD-reference-file.MP4e BAD-corrupt-file.md5devono trovarsi entrambi nella directory corrente e la directory verrà montata /volnel contenitore Docker.

Leggi gli altri commenti in giro per una spiegazione più approfondita.

Questo è stato il più veloce per me!


Grazie @slhck, il Dockerfileè disponibile qui se qualcuno vuole vedere che cosa questo verrà eseguito prima di eseguirlo sul proprio computer: github.com/synctree/docker-untrunc C'è anche una Dockerfilenel reale untruncrepository ora - non ho ancora testato uno o di rispetto nel dettaglio ma menzionalo qui per completezza: github.com/ponchio/untrunc/blob/master/Dockerfile
sparrowt

7

@sparrowt Le tue istruzioni attuali non hanno funzionato sulla mia recente installazione di Ubuntu 16.10. Ho avuto il seguente errore durante la compilazione di Untrunc:

track.cpp: In member function ‘int Codec::getLength(unsigned char*, int)’:
track.cpp:204:40: error: ‘avcodec_alloc_frame’ was not declared in this scope
   AVFrame *frame = avcodec_alloc_frame();

Come spiegato nel repository Untrunc , potrebbe essere necessario scaricare libav separatamente anziché utilizzare la versione nel repository Ubuntu. Il seguente codice ha funzionato per me:

sudo apt-get install unzip yasm g++ zlib1g-dev libbz2-dev
cd /tmp/
wget https://github.com/ponchio/untrunc/archive/master.zip
unzip master.zip
cd untrunc-master
wget http://libav.org/releases/libav-12.2.tar.xz
tar xvf libav-12.2.tar.xz
cd libav-12.2
./configure
make
cd ..
g++ -o untrunc file.cpp main.cpp track.cpp atom.cpp mp4.cpp -I./libav-12.2 -L./libav-12.2/libavformat -lavformat -L./libav-12.2/libavcodec -lavcodec -L./libav-12.2/libavresample -lavresample -L./libav-12.2/libavutil -lavutil -lpthread -lz -lbz2
./untrunc /path/to/working-video.mp4 /path/to/broken-video.mp4

Questo ha creato un file chiamato broken-video_fixed.mp4 che ha funzionato per me. Grazie mille per aver iniziato questa discussione.


1
Grazie! Sulla riga di compilazione non tronca ho avuto alcuni errori lungo le linee di "riferimento indefinito a` BZ2_bzDecompressInit '", ho dovuto aggiungere -lbz2
Andrew Smart

Non può gestire file di grandi dimensioni. Si arrende e basta.
Ken Sharp,

Il tuo libav containt a h264dec.h? perché track.cppsta cercando di includerlo e non riesco a trovarlo da nessuna parte: /
x29a

Tale dipendenza è stata aggiunta con commit github.com/ponchio/untrunc/commit/… il 10 ottobre 2017. Credo che ora devi scaricare libav-12.2 anziché libav-0.8.7
freeseek il

Finalmente questo ha funzionato su Ubuntu 14.04.5 LTS. Dovuto eseguire sudo apt-get install yasm, sudo apt-get install libbz2-deve, per superare un riferimento definito per 'clock_gettime', aggiungere -lrtalla fine della g++linea di comando (vedi stackoverflow.com/a/2418175/550712 ). Ha convertito circa 2/3 del mio video.
Mark Berry,

2

Nel caso in cui untrunc non supporti il ​​codec all'interno del tuo file, puoi provare a risolverlo con un editor esadecimale:

  1. ottenere un altro file con lo stesso formato, ne ho uno più grande ma probabilmente funzionerà qualsiasi lunghezza
  2. aprire entrambi i file in un editor esadecimale
  3. sostituire la mdatsezione nel file "ok" con la mdatsezione nel file "rotto", senza l'intestazione (cioè copiare solo i byte dopo 'mdat')
  4. probabilmente funzionerebbe già in questo modo, in caso contrario, i 4 byte prima di 'mdat' specificano la dimensione della mdatsezione, il valore corrente sarà la dimensione precedente ( mdatdimensione della sezione del file "ok" ), sostituirla con la nuova dimensione (" rotto " mdatdimensione della sezione del file )

Ho finito per scrivere un semplice programma per farlo: https://github.com/golimarrrr/fix-3gp

Sia il programma che manualmente usando l'editor esadecimale dovrebbero creare lo stesso file fisso


-3

Hai provato ad aprire il file con VLC Player ? Di solito è abbastanza bravo a riparare file danneggiati.


8
Penso che questo possa valere per i file AVI in cui l'indice può essere incorporato in memoria, ma un file MP4 con un errore di "moov atom non trovato" durante l'elaborazione di ffmpeg non riproduce nulla in VLC.
Dom

2
Anche VLC non riesce a riprodurlo, nel mio caso (file .mov)
rogerdpack,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.