How to open and repair an m4v or mp4 video file?
Yesterday I was filming a scene with my phone but suddenly the application crashed and when I try to open the m4v generated it says that is corrupted.
I have downloaded the video files (around 36MB) on my PC and I am trying to open and repair it. Can you suggest me a way to do it?
FFMPEG info
As suggested in comments I try check what FFMPEG says me about that file with this command
ffmpeg.exe -i VID_20120425_144739.m4v -c:v copy -c:a copy out.mp4 2> log.txt
Here it is the result:
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
Latest two lines are displayed in red.
Solution 1:
It is possible to repair the broken mp4 or m4v file using Untrunc.
For this method you need another video file from the same device which isn't broken.
How to install untrunc
For compilation you need a Linux installation (ideally Ubuntu) and basic ability to use a command line. You can also skip this part and run untrunc
via Docker (see the answer below), if you have that.
This is what to do:
-
Install some pre-requisite libraries with this command:
sudo apt-get install libavformat-dev libavcodec-dev libavutil-dev
-
Get the source code for Untrunc from the GitHub repo (choose one method):
wget https://github.com/ponchio/untrunc/archive/master.zip && unzip master.zip && cd untrunc-master
- or
git clone https://github.com/ponchio/untrunc.git && cd untrunc
-
Compile the source code using this command (all one line):
g++ -o untrunc file.cpp main.cpp track.cpp atom.cpp mp4.cpp -L/usr/local/lib -lavformat -lavcodec -lavutil
(you can try skipping this step and using the ready-provided executable, but it didn't work for me)
Then you can actually fix the video. You need both the broken video & an example working video.
How to fix the video
Find another working video, ideally from the same camera and preferably at least as long as the broken one; also the same resolution if possible (I believe this may help though is not essential).
Run this command in the folder where you have unzipped and compiled Untrunc but replace the /path/to/...
bits with your 2 video files:
./untrunc /path/to/working-video.m4v /path/to/broken-video.m4v
Then it should churn away and hopefully produce a playable file called broken-video_fixed.m4v
That's it you're done!
VLC Media Player should now be able to play the file. However it may be reporting the wrong length information (Untrunc tries to guess/work this out, but doesn't always get it right). To fix this try re-encoding the video through another program.
[Thanks to slhck's comment for the suggestion to try Untrunc.]
[Many thanks to Federico Ponchio for coding Untrunc in the first place, to solve this exact problem.]
Solution 2:
If someone else stumbles on this, I also tried the app sparrowt was talking about, but it didn't work for me (see some bug-reports I created in the developers repository). Maybe this was because it wasn't a mp4 file but a MOV file ...
What helped for me was this post: http://muzso.hu/2012/11/14/how-to-fix-a-broken-mp4-mov-video-ffmpeg-reports-moov-atom-not-found
They link to a program called "HD Video Repair Utility" (http://grauonline.de/cmsimple2_6/en/?Solutions:HD_Video_Repair_Utility), which is far cheaper than Treasured (http://aeroquartet.com/movierepair/repair). They even pointed out, that there was an earlier version of it (version 1.5) that didn't cost anything (http://nagasoft.cn/download/videorepair1.5.zip)!
I tried repairing the file using the version 1.5 and got it partly working. After re-encoding with ffmpeg (got some errors there), I realized, that a part of the audio was gone. In the logs (gladly the Video Repair Utility has some), there was no further mentioning of audio after a given time. I'll take it as-is ...
Solution 3:
You can install docker
(available for all major operating systems) and run:
docker run -v $(pwd):/vol -it synctree/untrunc /vol/GOOD-reference-file.MP4 /vol/BAD-corrupt-file.mdt
The syntax is for Bash under Linux or macOS. Here, GOOD-reference-file.MP4
and BAD-corrupt-file.md5
must both be in your current directory, and the directory will be mounted to /vol
in the Docker container.
Read the other comments around for more in-depth explanation.
This was the quickest for me!
Solution 4:
@sparrowt Your current instructions did not work on my recent Ubuntu 16.10 installation. I got the following error while compilining 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();
As explained in the untrunc repository, you might need to download libav separately rather than using the version in the Ubuntu repository. The following code worked for 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
This created a file called broken-video_fixed.mp4 that worked for me. Thank you so much for initiating this thread.
Solution 5:
In case untrunc doesn't support the codec inside your file, you can try to fix it with an hex editor:
- get another file with the same format, I got a bigger one but probably any length will work
- open both files in an hex editor
- replace the
mdat
section in the "ok" file with themdat
section in the "broken" file, without the header (i.e. copy only the bytes after 'mdat') - it would probably already work like that, if not, the 4 bytes before 'mdat' specify the size of the
mdat
section, the current value will be the old size ("ok" filemdat
section size), replace it with the new size ("broken" filemdat
section size)
I ended up coding a simple program to do it: https://github.com/golimarrrr/fix-3gp
Both the program and by hand using the hex editor should create the same fixed file