我有一个 mp4 文件似乎不知为何损坏了:
$ file HDV_1042.MP4
HDV_1042.MP4: data
$ mediainfo HDV_1042.MP4
General
Complete name : HDV_1042.MP4
File size : 1.72 GiB
$ ffprobe HDV_1042.MP4
avprobe version 0.8.6-4:0.8.6-0ubuntu0.12.04.1, Copyright (c) 2007-2013 the Libav developers
built on Apr 2 2013 17:02:36 with gcc 4.6.3
HDV_1042.MP4: Invalid data found when processing input
$ AtomicParsley HDV_1042.MP4 -T 1
AtomicParsley error: bad mpeg4 file (ftyp atom missing or alignment error).
我尝试使用来自同一相机的工作文件通过“untrunc”进行恢复,但没有成功:
$ ./untrunc HDV_1041.MP4 HDV_1042.MP4 Reading: HDV_1041.MP4
Composition time offset atom found. Out of order samples possible.
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'HDV_1041.MP4':
Metadata:
major_brand : avc1
minor_version : 0
compatible_brands: avc1isom
creation_time : 1947-10-13 12:23:13
Duration: 00:21:20.25, start: 0.000000, bitrate: 12131 kb/s
Stream #0.0(eng): Video: h264 (Main), yuv420p, 1280x720, 11988 kb/s, 59.94 fps, 59.94 tbr, 90k tbn, 180k tbc
Metadata:
creation_time : 1947-10-13 12:23:13
Stream #0.1(eng): Audio: aac, 48000 Hz, stereo, s16, 128 kb/s
Metadata:
creation_time : 1947-10-13 12:23:13
Failed to parse atoms in truncated file
还尝试了 ffmpeg/avconv,但没有成功:
$ avconv -f h264 -i HDV_1042.MP4 -c:a copy -c:v copy HDV_1042.mp4
avconv version 0.8.6-4:0.8.6-0ubuntu0.12.04.1, Copyright (c) 2000-2013 the Libav developers
built on Apr 2 2013 17:02:36 with gcc 4.6.3
[h264 @ 0x1359ac0] non-existing PPS referenced
[h264 @ 0x1359ac0] non-existing PPS 0 referenced
[h264 @ 0x1359ac0] decode_slice_header error
[h264 @ 0x1359ac0] non-existing PPS 1 referenced
[h264 @ 0x1359ac0] decode_slice_header error
[h264 @ 0x1359ac0] no frame!
[h264 @ 0x134f9e0] Estimating duration from bitrate, this may be inaccurate
Input #0, h264, from 'HDV_1042.MP4':
Duration: N/A, bitrate: N/A
Stream #0.0: Video: h264, 25 fps, 25 tbr, 1200k tbn, 2400k tbc
Output #0, mp4, to 'HDV_1042.mp4':
Output file #0 does not contain any stream
以下是来自同一相机的工作文件示例:
$ mediainfo HDV_1041.MP4
General
Complete name : HDV_1041.MP4
Format : MPEG-4
Format profile : JVT
Codec ID : avc1
File size : 1.81 GiB
Duration : 21mn 20s
Overall bit rate : 12.1 Mbps
Writing library : SEC
Video
ID : 1
Format : AVC
Format/Info : Advanced Video Codec
Format profile : [email protected]
Format settings, CABAC : Yes
Format settings, ReFrames : 4 frames
Codec ID : avc1
Codec ID/Info : Advanced Video Coding
Duration : 21mn 20s
Bit rate mode : Variable
Bit rate : 12.0 Mbps
Width : 1 280 pixels
Height : 720 pixels
Display aspect ratio : 16:9
Frame rate mode : Variable
Frame rate : 59.940 fps
Minimum frame rate : 59.920 fps
Maximum frame rate : 59.960 fps
Color space : YUV
Chroma subsampling : 4:2:0
Bit depth : 8 bits
Scan type : Progressive
Bits/(Pixel*Frame) : 0.217
Stream size : 1.79 GiB (99%)
Title : HMX-H300
Language : English
Audio
ID : 2
Format : AAC
Format/Info : Advanced Audio Codec
Format profile : LC
Codec ID : 40
Duration : 21mn 20s
Bit rate mode : Constant
Bit rate : 128 Kbps
Channel(s) : 2 channels
Channel positions : Front: L R
Sampling rate : 48.0 KHz
Compression mode : Lossy
Stream size : 19.5 MiB (1%)
Title : HMX-H300
Language : English
答案1
我有视频修复工具 1.9.0.0到目前为止,我已经设法修复了大多数损坏的 MP4 文件。至少你可以尝试一下,因为试用版将修复一半的文件,这样你就可以看看它是否有效。缺点是它不是免费的,偶尔使用的话有点贵
答案2
你可以尝试这个:
对于需要恢复 MP4 AVC 的用户,这里有一个替代方法: 大型下载。
此实用程序可从未完成的无(或空)标头的 MP4/MOV 文件中恢复 H.264/AVC 流。如果在录制过程中损坏摄像机或类似情况,您可能会得到未完成的文件。此实用程序已使用 GoPro 录制的文件进行了测试,但它也可能适用于其他摄像机。
Usage:
recover_mp4_to_h264 in_good_similar.mp4 --avcc
recover_mp4_to_h264 in_corrupted.mp4 out_video.h264 [out_audio.aac | out_audio.wav | out_audio.mp3] [<recorder>]
recover_mp4_to_h264 in_corrupted.mp4 out_video.h264 [--aac | --pcm | --mp3] [<recorder>]
Supported recorders:
Default is Ambarella (used in GoPro, etc.)
Specify --eos in case of Canon EOS
Specify --apple in case of some Apple software encoder
Specify --htc in case of HTC smartphone
Specify --motorola in case of Motorola smartphone
Specify --samsung in case of Samsung camcorder
步骤 1:使用任何具有相同分辨率和比特率的优质先前文件来生成 AVC 配置记录;例如,
recover_mp4_to_h264.exe GOPR0346.MP4 --avcc
注意:它将在当前目录中创建文件“avcc.hdr”。
步骤 2:从损坏的文件中恢复 H.264 流;例如,
recover_mp4_to_h264.exe GOPR0347.MP4 GOPR0347.h264 GOPR0347.aac
注意:文件“avcc.hdr”必须存在。注意:--pcm
如果要恢复由 Canon EOS 写入的 MOV 文件,请指定或 WAV 文件名。
步骤 3:使用任何其他实用程序(例如 Yamb 或 FFmpeg)从 H.264 流(GOPR0347.h264)重新创建 MP4/MOV 文件。注意 MP4 不支持 PCM 声音;在这种情况下,您必须创建 MOV:
ffmpeg.exe -r 30 -i recovered.h264 -i recovered.wav -vcodec copy -acodec copy result.mov
答案3
回复评论:“似乎有许多商业工具声称能够修复。使用免费工具似乎也可以修复,例如使用十六进制编辑器。我尝试在 Linux 上使用‘wxhexeditor’将工作文件中的缺失数据添加到非工作文件中,然后使用‘xxd -r’转换为二进制文件,但无法播放‘修复’文件。显然需要技能和对 mp4 文件结构的理解。:-)”
使用十六进制编辑器修复损坏的 MOV/MP4 视频
使用十六进制编辑器+少量的知识有时可以帮助您修复无法播放的 MP4(或 MOV)视频。
原子和偏移量
有效的 MP4/MOV 视频至少由以下三个原子(部分)组成:
- ftyp:(通常如果人们谈论修复标题,他们指的是这个原子。
- mdat:这是实际的视频和音频数据
- moov:您可以将其视为文件的“索引”。由于视频数据是压缩的,并且视频的不同部分会产生不同的压缩率,因此会保留索引以跟踪视频数据块。
这些就是我所说的“根”原子,原子本身可以由几个子原子或分支组成。但一般来说,您需要检查这三个根原子是否存在。
每个原子前面都有一个 4 字节大小 + 标记,例如
x x x x f t y p
。因此,如果我们找到一个原子的开头,我们可以使用大小来确定下一个原子应该从哪里开始。如果它不从该位置开始,我们就有问题了。类似的东西可能已经解释了为什么文件无法播放。
通常第一个原子是文件偏移量 4 处的 ftyp。前面的四个字节(大端字节序)是原子的大小,我更喜欢使用十六进制编辑器,它可以自动进行十六进制 > 十进制转换(实际上很多编辑器都会这样做)。因此,00 00 00 1C
我们得到了 28。因此,在偏移量 4 + 28 处,我们应该找到下一个原子,我们似乎确实找到了:
然后我们可以应用相同的逻辑来找到下一个原子的位置。因此每次我们只需将原子的偏移量 + 原子的大小 = 下一个原子的偏移量。
检查损坏的文件(MP4 或 MOV)
这个特定文件意外地没有以 ftyp 原子开头。所以我们可以做的是在文件中搜索小写字符串“ftyp”:
我们可以应用第一段中的信息,发现我们找到了下一个原子 (moov)。如果我们计算 moov 原子的大小,我们会发现一个自由原子,如果我们再次计算该原子的大小,我们会发现一个 mdat 原子。在这个原子的末尾我们发现了零,所以看起来我们所有的值都会导致一个完整的文件:
如果我们将所有数据从偏移量 ftyp - 4 复制到 mdat 的末尾,我们最终可能会得到一个可播放的文件。
挖掘原子
基本上,如果我检查此文件,我会得到以下布局:
- 0000 - 零块
- mdat - 一个 mdat 原子(文件 2使用 untrunc)
- 0000——更多零
- ....-“随机”数据
- ....
- ftyp-(文件 1)
- 移动 - (文件 1)
- 自由的 - (文件 1)
- mdat - (文件 1)
文件 1:ftyp、moov、free、mdat 原子产生可播放的文件。只需选择整个块并将其复制到新文件中,然后使用 .mov 扩展名保存该文件。
文件 2:可以使用 Untrunc 并使用第一个“恢复”的视频作为参考(Untrunc 需要来自同一相机的工作参考文件)使孤立的 mdat 原子可播放。为此,我们选择 mdat 原子并将其导出到我们使用 .mov 扩展名保存的新文件中。Untrunc 语法是untrunc goodfile brokenfile
不可否认的是,并不是每个损坏的 MP4 视频都可以通过这种方式修复,但它可能会给你提供指导,让你了解使用十六进制编辑器可以实现哪些功能。
我还根据这个损坏的 MOV 文件制作了视频指南: https://youtu.be/-4X-zpotg2M
答案4
我自己也见过和使用过很多工具,最近我一直在使用一些常见的免费工具,它们比付费工具好用得多。如果你的视频仍然没有修复,你也可以尝试以下工具:https://www.datarepairtools.com/blog/video-repair/
此工具有免费版和付费版。您可以根据自己的喜好使用。稍后再感谢我...