web-dev-qa-db-fra.com

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

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, essayez 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.

53
Drake

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

Pour cette méthode, vous avez besoin de:

  • un autre fichier vidéo qui n'est pas cassé

  • une installation linux (j'ai utilisé Ubuntu 12.04) et la capacité de base d'utiliser une ligne de commande.

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. Téléchargez le code source de Untrunc à partir du dépôt github:

    wget https://github.com/ponchio/untrunc/archive/master.Zip

  3. Décompressez le code source:

    unzip master.Zip

  4. Allez dans le répertoire où ça a été décompressé:

    cd untrunc-master

  5. 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)

  6. 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.

    Idéalement, la vidéo devrait provenir de la même caméra et avoir la même résolution (la mienne l'était, mais cela pourrait fonctionner sans). De plus, s’il est au moins aussi long que celui brisé (de préférence à peu près le même), cela peut aider.

    Exécutez cette commande dans le dossier où vous avez décompressé et compilé Untrunc, mais remplacez les bits/path/to/... 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.]

54
sparrowt

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- a trouvé

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/réparation ). 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 ...

7
SimonSimCity

@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épertoire 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.

6
freeseek

Si vous avez une distribution Ubuntu récente, vous pouvez installer docker et exécuter:

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

Lisez les autres commentaires pour plus d'explications.

C'était le plus rapide pour moi!

3
abourget

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 section mdat dans le fichier "ok" par la section mdat dans le fichier "cassé", sans l'en-tête (c.-à-d. copier uniquement les octets après "mdat")
  4. cela fonctionnerait probablement déjà comme ça, sinon les 4 octets précédant 'mdat' spécifient la taille de la section mdat, la valeur actuelle sera l'ancienne taille (fichier "ok" mdat section), remplacez-la par la nouvelle taille (fichier "cassé" taille de la section mdat)

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

0
golimar