Comment ouvrir et réparer un fichier vidéo m4v ou mp4?

59

Hier, j'étais en train de filmer une scène avec mon téléphone mais soudainement l'application s'est effondrée et lorsque j'essaie d'ouvrir le fichier m4v généré, il indique que celle-ci est corrompue.

J'ai téléchargé les fichiers vidéo (environ 36 Mo) sur mon PC et j'essaie de l'ouvrir et de le réparer. Pouvez-vous me suggérer un moyen de le faire?

FFMPEG info

Comme suggéré dans les commentaires, j'essaie de vérifier ce que FFMPEG me dit à propos de ce fichier avec cette commande

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

Ici c'est le résultat:

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

Les deux dernières lignes sont affichées en rouge.

Canard
la source
Mon système d'exploitation est Windows 7, mais si nécessaire, je peux préparer une machine virtuelle avec une distribution basée sur Linux.
Drake
@slhck Merci pour l'aide, j'ai fait ce que vous avez suggéré et mis à jour la question.
Drake
7
Ah, c'est ce à quoi je m'attendais. L'atome MOOV est un élément de données nécessaire pour accéder aux flux vidéo bruts au sein du conteneur MP4 / M4V. Il existe de nombreux outils de "réparation vidéo" en ligne, mais je ne ferais pas confiance à la plupart d'entre eux. Vous pouvez certainement tenter leur chance, mais ne payez rien. Ce qui semble prometteur est Untrunk , qui semble être codé pour ce problème précis (à savoir un atome de MOOV manquant). Ou AtomicParsley . Bonne chance!
Slhck
1
Comment réparer un MP4 cassé avec AtomicParsley?
Chovy

Réponses:

60

Il est possible de réparer le fichier MP4 ou M4V endommagé à l’aide de Untrunc .

Pour cette méthode, vous avez besoin d'un autre fichier vidéo du même périphérique qui n'est pas endommagé.

Comment installer untrunc

Pour la compilation, vous avez besoin d’une installation Linux (idéalement Ubuntu) et d’une capacité de base à utiliser une ligne de commande. Vous pouvez également ignorer cette partie et exécuter untruncvia Docker (voir la réponse ci-dessous ), si vous en avez un.

Voici ce qu'il faut faire:

  1. Installez certaines bibliothèques pré-requises avec cette commande:

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

  2. Obtenez le code source de Untrunc à partir du référentiel GitHub (choisissez une méthode):

    • wget https://github.com/ponchio/untrunc/archive/master.zip && unzip master.zip && cd untrunc-master
    • ou git clone https://github.com/ponchio/untrunc.git && cd untrunc
  3. Compilez le code source en utilisant cette commande (une seule ligne):

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

    (vous pouvez essayer de sauter cette étape et d'utiliser l'exécutable prêt à l'emploi, mais cela n'a pas fonctionné pour moi)

  4. Ensuite, vous pouvez réellement réparer la vidéo. Vous avez besoin à la fois de la vidéo cassée et d'un exemple de vidéo de travail.

Comment réparer la vidéo

Trouvez une autre vidéo de travail, idéalement à partir de la même caméra et de préférence au moins aussi longue que celle qui est cassée; également la même résolution si possible (je crois que cela peut aider mais n’est pas indispensable).

Exécutez cette commande dans le dossier où vous avez décompressé et compilé Untrunc mais remplacez les /path/to/...bits par vos 2 fichiers vidéo:

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

Ensuite, il devrait abandonner et produire, espérons-le, un fichier lisible appelé broken-video_fixed.m4v

Ça y est tu es fait!

VLC Media Player devrait maintenant pouvoir lire le fichier. Cependant, il se peut qu’il signale des informations de longueur erronée (Untrunc essaie de deviner / résoudre ce problème, mais ne le fait pas toujours correctement). Pour résoudre ce problème, essayez de ré-encoder la vidéo via un autre programme.

[Merci au commentaire de slhck pour la suggestion d'essayer Untrunc.]

[Merci beaucoup à Federico Ponchio pour avoir codé Untrunc en premier lieu, pour résoudre ce problème précis.]

Sparrowt
la source
Cool, merci d'avoir fourni les instructions complètes ici!
Slhck
3
Merci @ Alex j'ai mis à jour le lien. Curieusement, le Readme sur github est basé sur cette réponse!
Sparrowt
1
Donnerait une solution basée sur Windows. < superuser.com/questions/938185/recover-incomplete-video-files > car je n'ai pas accès à Internet dans mes distributions Linux.
RogUE
2
FWIW, cela ne m'a pas donné de vidéo jouable, mais exécuter recover_mp4_to_h264 via wine a bien fonctionné.
Le compilateur
1
Untrunc a fonctionné pour moi, mais je devais mettre les deux fichiers vidéo dans le sous-répertoire du dossier caché .untrunc nommé untrunc-master. Ensuite, lancez: ./untrunc goodfile.mp4 badfile.mp4 Il a fallu environ 3 minutes pour un fichier de 2 Go et je n’avais qu’à resynchroniser l’audio. Tout le reste était bien.
user8547
8

Si quelqu'un d'autre tombe sur cette question, j'ai également essayé l'application dont Sparrow parlait, mais cela n'a pas fonctionné pour moi (voir les rapports de bugs que j'ai créés dans le référentiel de développeurs). Peut-être était-ce dû au fait qu'il ne s'agissait pas d'un fichier mp4 mais d'un fichier MOV ...

Ce qui m'a aidé est ce post: http://muzso.hu/2012/11/14/how-to-fix-a-broken-mp4-mov-video-ffmpeg-reports-moov-atom-not-found

Ils renvoient à un programme appelé "HD Video Repair Utility" ( http://grauonline.de/cmsimple2_6/en/?Solutions:HD_Video_Repair_Utility ), qui est beaucoup moins cher que Treasured ( http://aeroquartet.com/movierepair/repair ) . Ils ont même fait remarquer qu’il existait une version antérieure (version 1.5) qui ne coûtait rien ( http://nagasoft.cn/download/videorepair1.5.zip )!

J'ai essayé de réparer le fichier en utilisant la version 1.5 et je l'ai fait fonctionner partiellement. Après avoir ré-encodé avec ffmpeg (j'ai eu quelques erreurs), je me suis rendu compte qu'une partie de l'audio avait disparu. Dans les journaux (volontiers, l'utilitaire de réparation vidéo en contient), il n'y avait plus aucune mention de l'audio après un moment donné. Je vais le prendre tel quel ...

SimonSimCity
la source
3
L'URL de la liste déroulante est morte. alternative trouvée: nagasoft.cn/download/videorepair1.5.zip
T.Todua
2
@ T.Todua, merci d'avoir averti. J'ai remplacé le lien dropbox par le lien que vous avez fourni.
SimonSimCity
8

Vous pouvez installer docker(disponible pour tous les principaux systèmes d'exploitation) et exécuter:

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

La syntaxe est pour Bash sous Linux ou macOS. Ici, GOOD-reference-file.MP4et BAD-corrupt-file.md5doit être dans votre répertoire actuel, et le répertoire sera monté /voldans le conteneur Docker.

Lisez les autres commentaires pour plus d'explications.

C'était le plus rapide pour moi!

abourget
la source
Merci @slhck, le Dockerfileest disponible ici si quelqu'un veut voir ce qu'il va exécuter avant de l'exécuter sur votre ordinateur: github.com/synctree/docker-untrunc Il y a aussi un Dockerfiledans le untruncréférentiel actuel - je n'ai pas testé ni comparé en détail, mais mentionnez-le pour plus de précision
sparrowt le
7

@sparrowt Vos instructions actuelles ne fonctionnaient pas sur ma récente installation de Ubuntu 16.10. J'ai eu l'erreur suivante en compilant 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();

Comme expliqué dans le référentiel Untrunc , vous devrez peut-être télécharger libav séparément plutôt que d'utiliser la version du référentiel Ubuntu. Le code suivant a fonctionné pour moi:

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

Cela a créé un fichier appelé broken-video_fixed.mp4 qui a fonctionné pour moi. Merci beaucoup d'avoir lancé ce fil.

freeseek
la source
1
Je vous remercie! Sur la ligne de compilation non tronquée, j'ai eu quelques erreurs dans le sens de "référence indéfinie à` BZ2_bzDecompressInit '", il a fallu ajouter -lbz2
Andrew Smart
Il ne peut pas gérer de gros fichiers. Abandonne juste.
Ken Sharp
Votre libav contient-il h264dec.h? car track.cppessaie de l'inclure et je ne peux pas le trouver n'importe où: /
x29a
Cette dépendance a été ajoutée à commit le 10 octobre 2017 avec github.com/ponchio/untrunc/commit/… . Je pense que vous devez maintenant télécharger libav-12.2 plutôt que libav-0.8.7
freeseek
Enfin, cela a fonctionné sur Ubuntu 14.04.5 LTS. Nous avons dû courir sudo apt-get install yasm, sudo apt-get install libbz2-devet, pour surmonter une référence non définie à « clock_gettime », ajouter -lrtà la fin de la g++ligne de commande (voir stackoverflow.com/a/2418175/550712 ). Il converti environ les 2/3 de ma vidéo.
Mark Berry
2

Si untrunc ne prend pas en charge le codec dans votre fichier, vous pouvez essayer de le réparer avec un éditeur hexadécimal:

  1. obtenir un autre fichier avec le même format, j'en ai un plus gros mais probablement n'importe quelle longueur fonctionnera
  2. ouvrir les deux fichiers dans un éditeur hexadécimal
  3. remplace la mdatsection dans le fichier "ok" par la mdatsection dans le fichier "cassé", sans l'en-tête (c.-à-d. ne copie que les octets après "mdat")
  4. cela fonctionnerait probablement déjà comme cela, sinon les 4 octets précédant 'mdat' spécifient la taille de la mdatsection, la valeur actuelle sera l'ancienne taille ("ok" mdattaille de la section du fichier ), remplacez-la par la nouvelle taille (" "cassé" mdatsection de fichier )

J'ai fini par coder un programme simple pour le faire: https://github.com/golimarrrr/fix-3gp

Le programme et manuellement à l’aide de l’éditeur hexadécimal doivent créer le même fichier fixe

Golimar
la source
-3

Avez-vous essayé d'ouvrir le fichier avec VLC Player ? Il est généralement très efficace pour réparer les fichiers endommagés.

Carlos Manta
la source
8
Je pense que cela peut s’appliquer aux fichiers AVI où l’index peut être intégré à la mémoire, mais un fichier MP4 qui contient une erreur «atome de Moov introuvable» lors du traitement de ffmpeg ne lit rien dans VLC.
Dim
2
VLC ne parvient pas à jouer aussi bien, dans mon cas (fichier .mov)
rogerdpack