如何打开和修复m4v或mp4的视频文件?


59

昨天我用手机拍摄了一个场景但突然应用程序崩溃了,当我尝试打开生成的m4v时,它说它已损坏。

我已经在我的电脑上下载了视频文件(大约36MB),我正在尝试打开并修复它。你能建议我这样做吗?

FFMPEG信息

正如评论中所建议的,我尝试用这个命令检查FFMPEG对我说的那个文件

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

这是结果:

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

最新的两行显示为红色。


我的操作系统是Windows 7,但如有必要,我可以使用基于Linux的发行版准备虚拟机。
德雷克

@slhck感谢您的帮助,我做了您的建议并更新了问题。
德雷克

7
啊,这就是我的预期。MOOV原子是访问MP4 / M4V容器内的原始视频流所需的一段数据。网上有很多“视频修复”工具,但我不相信大多数工具。你当然可以给他们一个机会 - 只是不支付任何费用。看起来很有希望的是Untrunk,它似乎是针对这个确切的问题编码的(即缺少MOOV原子)。或AtomicParsley。祝好运!
slhck

1
如何使用AtomicParsley修复损坏的mp4?
chovy 2016年

Answers:


60

可以使用Untrunc修复损坏的mp4或m4v文件。

对于此方法,您需要来自同一设备的另一个损坏的视频文件。

如何安装 untrunc

对于编译,您需要Linux安装(理想情况下为Ubuntu)以及使用命令行的基本功能。您也可以跳过此部分并untrunc通过Docker 运行(请参阅下面的答案),如果有的话。

这是做什么的:

  1. 使用以下命令安装一些先决条件库:

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

  2. 从GitHub repo获取Untrunc的源代码(选择一种方法):

    • wget https://github.com/ponchio/untrunc/archive/master.zip && unzip master.zip && cd untrunc-master
    • 要么 git clone https://github.com/ponchio/untrunc.git && cd untrunc
  3. 使用此命令编译源代码(所有一行):

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

    (您可以尝试跳过此步骤并使用现成的可执行文件,但它对我不起作用)

  4. 然后你可以实际修复视频。您需要损坏的视频和示例工作视频。

如何修复视频

找到另一个工作视频,理想情况下来自同一台摄像机,最好至少与破碎的视频一样长; 如果可能的话也是同样的决议(我相信这可能会有所帮助,但并不重要)。

在解压缩和编译Untrunc的文件夹中运行此命令,但用/path/to/...2个视频文件替换这些位:

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

然后它应该流失,并希望产生一个可调用的文件 broken-video_fixed.m4v

就是你做完了!

VLC Media Player现在应该能够播放该文件。然而,它可能会报告错误的长度信息(Untrunc尝试猜测/解决这个问题,但并不总是正确的)。要解决此问题,请尝试通过其他程序重新编码视频。

[感谢slhck对试用Untrunc的建议的评论。]

[非常感谢Federico Ponchio首先对Untrunc进行编码,以解决这个问题。]


很酷,谢谢你在这里提供完整的说明!
slhck 2013年

3
谢谢@Alex我已经更新了链接。有趣的是github上的自述文件基于这个答案!
sparrowt 2015年

1
会给出一个基于Windows的解决方案。< superuser.com/questions/938185/recover-incomplete-video-files >因为我在我的Linux发行版中没有互联网访问权限。
RogUE 2015年

2
FWIW这并没有为我制作任何可播放的视频 - 但通过wine 运行recover_mp4_to_h264运作良好。
编译器

1
Untrunc为我工作,但我必须将两个视频文件放在名为的隐藏.untrunc文件夹的子目录中untrunc-master。然后,运行:./ untrunc goodfile.mp4 badfile.mp4 2gb文件花了大约3分钟,我只需重新同步音频。其他一切都很好。
user8547 2016年

8

如果其他人偶然发现了这个问题,我也尝试过sparrowt讨论的应用程序,但它对我不起作用(请参阅我在开发人员资源库中创建的一些错误报告)。也许这是因为它不是mp4文件而是MOV文件......

对我有帮助的是这篇文章:http//muzso.hu/2012/11/14/how-to-fix-a-broken-mp4-mov-video-ffmpeg-reports-moov-atom-not-found

它们链接到一个名为“高清视频修复工具”的程序(http://grauonline.de/cmsimple2_6/en/?Solu​​tions:HD_Video_Repair_Utility),这比Treasured便宜得多(http://aeroquartet.com/movierepair/repair) 。他们甚至指出,它的早期版本(版本1.5)没有任何成本(http://nagasoft.cn/download/videorepair1.5.zip)!

我尝试使用1.5版本修复文件并使其部分工作。用ffmpeg重新编码后(我遇到了一些错误),我意识到,音频的一部分已经消失了。在日志中(很高兴视频修复实用程序有一些),在给定时间后没有进一步提及音频。我会把它当作原样......


3
DROPBOX网址已经死了。找到替代方案: nagasoft.cn/download/videorepair1.5.zip
T.Todua 2017年

2
@ T.Todua,谢谢你的通知。我已经通过您提供的链接替换了Dropbox-link。
SimonSimCity 2017年

7

@sparrowt您当前的说明在我最近的Ubuntu 16.10安装上不起作用。编译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();

untrunc存储库中所述,您可能需要单独下载libav,而不是使用Ubuntu存储库中的版本。以下代码对我有用:

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

这创建了一个名为broken-video_fixed.mp4的文件,对我有用。非常感谢你发起这个帖子。


1
谢谢!在untrunc编译行中,我有一些错误沿着“未定义引用`BZ2_bzDecompressInit'”,我不得不添加-lbz2
Andrew Smart

它无法处理大文件。放弃吧。
Ken Sharp

你的libav是否包含h264dec.h?因为track.cpp试图包含它而我无法在任何地方找到它:/
x29a

2017年10月10日,使用commit github.com/ponchio/untrunc/commit / ... 添加了该依赖项。我相信现在你必须下载libav-12.2而不是libav-0.8.7
freeseek

最后得到这个在Ubuntu 14.04.5 LTS上工作。必须运行sudo apt-get install yasmsudo apt-get install libbz2-dev并且,要克服对'clock_gettime'的未定义引用,请添加-lrtg++命令行的末尾(请参阅stackoverflow.com/a/2418175/550712)。它转换了大约2/3的视频。
Mark Berry于19年

7

您可以安装docker(适用于所有主要操作系统)并运行:

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

语法适用于Linux或macOS下的Bash。在这里,GOOD-reference-file.MP4并且BAD-corrupt-file.md5必须都在您当前的目录中,并且该目录将被挂载到/volDocker容器中。

阅读其他评论以获得更深入的解释。

这对我来说是最快的!


感谢@slhck,Dockerfile如果有人想在你的计算机上执行它之前想看看它会运行的话,可以在这里找到:github.com/synctree/docker-untrunc现在Dockerfile在实际的untrunc存储库中还有一个- 我没有测试过或者没有比较过他们详细,但在这里提到完整性:github.com/ponchio/untrunc/blob/master/Dockerfile
sparrowt

2

如果untrunc不支持文件中的编解码器,您可以尝试使用十六进制编辑器修复它:

  1. 得到另一个格式相同的文件,我得到一个更大的文件,但可能任何长度都可以
  2. 在十六进制编辑器中打开两个文件
  3. 用“破坏”文件中的mdat部分替换“ok”文件中的mdat部分,没有标题(即只复制'mdat'之后的字节)
  4. 它可能已经像那样工作,如果没有,'mdat'之前的4个字节指定了mdat部分的大小,当前值将是旧的大小(“ok”文件mdat节大小),用新的大小替换它(“打破“文件mdat部分大小”

我最终编写了一个简单的程序来执行它:https//github.com/golimarrrr/fix-3gp

程序和手动使用十六进制编辑器都应该创建相同的固定文件


-3

您是否尝试使用VLC播放器打开文件?它通常非常适合修复损坏的文件。


8
我认为这可能适用于可以将索引构建到内存中的AVI文件,但是在ffmpeg处理期间发生“未找到moov atom”的错误的MP4文件在VLC中不起作用。
太阳

2
VLC无法播放,在我的情况下(.mov文件)
rogerdpack 2016年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.