我们可以使用下一个方法在Windows上轻松修复损坏的mp4文件(例如,如果我们正在录制视频,但没有正确停止)
REM 1) any good mp4 file with the same resolution and bitrate to generate the header files:
recover_mp4.exe good.mp4 --analyze
REM 2) recover streams from the corrupted file, for example:
recover_mp4.exe bad.mp4 recovered.h264 recovered.aac
REM 3) join audio and video with ffmpeg:
ffmpeg.exe -r 30 -i recovered.h264 -i recovered.aac -bsf:a aac_adtstoasc -c:v copy -c:a copy recovered.mp4
REM delete temp files:
del *.h264
del *.aac
del *.hdr
所以我们需要一些类似的好(未损坏的)mp4文件和下一个工具:
是否可以在Android应用程序中实现类似的功能? 我知道有ffmpeg库可用于android(https://github.com/WritingMinds/ffmpeg-android-java),它工作正常
但遗憾的是 recover_mp4 不适用于Android
Mb已经有类似的恢复工具可用于Android?
答案 0 :(得分:0)
所以你认真地询问如何在android上实现“修复”工具。
基本上,您的问题非常广泛,因为视频修复始终针对具体案例和破坏类型。
我不知道任何跨平台或仅限android的mp4 / mov恢复工具,所以如果你正在全力以赴,最好从调查如何完成这样的修复开始,并在java或C ++中重现它(使用android NDK)。
调查如何完成这项工作的一个很好的起点可能是一些现有的开源项目(如果你能找到任何:-()。
答案 1 :(得分:0)
“是否有可能在Android应用程序中实现类似的东西?”
是的,可能。这些工具只是移动字节并更新数据偏移(位置)的任何变化。 Android / Java具有用于处理字节的API。这就是您所需要的,还需要了解您正在修改的材料。
请参阅:
MP4格式规范:通过website(特别是跟踪,媒体和示例原子)。
MP4格式规范:通过PDF file。与上述网站相同的信息,供离线访问。
要更新的MP4原子:This Answer解释了很多关于编辑偏移的内容。它正在讨论audio
轨道,但同样的原子名称也存在于video
轨道中。
下载免费的 Hex编辑器并打开small mp4(可以右键单击保存此链接)进行练习。找到这些原子STCO
,STSS
,STSZ
等的偏移量,并知道它们的值是什么意思。换句话说,熟悉MP4格式的结构,然后更容易修复丢失或不正确的数据。
关于你的笔记:
<强>(1)强>
REM 1)具有相同分辨率和比特率的任何好的mp4文件 生成头文件:
您需要来自类似MP4文件的 SPS (序列参数设置)和 PPS (图片参数设置),以便稍后设置MPEG解码器(即:试图播放编辑/恢复的MP4文件的媒体播放器。)
<强>(2)强>
REM 2)从中恢复流(h264视频和AAC / MP3音频) 损坏的文件,例如:
取决于腐败类型。 MP4有2个部分。首先是moov
原子是元数据,说明A / V帧开始的位置和它们的大小等。其次是mdat
原子,它保存实际的帧数而不是它们自己的标题(例如:如果使用AAC声音,那么每个AAC帧都删除所有AAC的ADTS头,只留下主AAC数据。
如果缺少旧的(损坏的)MP4标头(文件没有moov
),则无法轻松重新创建标头。现在,您必须了解H264和AAC以及MP3,以便在遇到它们时识别格式字节(分析并重新创建标题条目,因此可能使用现有的“类似”文件来检查预期的典型设置)。 ..
<强>(3)强>
REM 3)使用ffmpeg:
加入音频和视频
或者只是使用Android / Java代码将字节复制并粘贴到一个[byte]数组中并保存为输出文件。