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

Dra*_*ake 68 video repair mp4 m4v

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

我已经在我的 PC 上下载了视频文件(大约 36MB),我正在尝试打开和修复它。你能给我建议一种方法吗?

FFMPEG 信息

正如评论中所建议的,我尝试使用此命令检查 FFMPEG 对我说的关于该文件的内容

ffmpeg.exe -i VID_20120425_144739.m4v -c:v copy -c:a copy out.mp4 2> log.txt
Run Code Online (Sandbox Code Playgroud)

结果如下:

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
Run Code Online (Sandbox Code Playgroud)

最新的两行显示为红色。

spa*_*owt 66

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

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

如何安装 untrunc

对于编译,您需要安装 Linux(最好是 Ubuntu)和使用命令行的基本能力。如果有,您也可以跳过这部分并untrunc通过 Docker运行(请参阅下面的答案)。

这是要做的:

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

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

  2. 从 GitHub 存储库中获取 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
Run Code Online (Sandbox Code Playgroud)

然后它应该流失并希望产生一个名为的可播放文件 broken-video_fixed.m4v

这样你就完成了!

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

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

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

  • 谢谢@Alex 我已经更新了链接。有趣的是,github 上的自述文件就是基于这个答案! (3认同)
  • 会给出一个基于Windows的解决方案。<http://superuser.com/questions/938185/recover-incomplete-video-files> 因为我的 Linux 发行版无法访问互联网。 (2认同)
  • FWIW 这并没有为我生成任何可播放的视频 - 但是通过 wine 运行 [recover_mp4_to_h264](http://slydiman.me/eng/mmedia/recover_mp4.htm) 效果很好。 (2认同)

Sim*_*ity 9

如果其他人偶然发现了这一点,我也尝试过 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 重新编码后(那里有一些错误),我意识到,音频的一部分消失了。在日志中(很高兴视频修复实用程序有一些),在给定时间后没有进一步提及音频。我会照原样...

  • DROPBOX 网址已死。找到替代方案:**http://nagasoft.cn/download/videorepair1.5.zip** (4认同)
  • @T.Todua,感谢通知。我已经用您提供的链接替换了 dropbox-link。 (2认同)

小智 9

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

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

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

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

这对我来说是最快的!


fre*_*eek 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();
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

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