使用ffmpeg录制MP4时突然断电

4
现在我使用C语言和ffmpeg实现了一个将实时音视频多路复用到MP4文件的程序,一切都运行良好,但当在重复使用过程中突然停电时,录制的MP4文件会损坏,VLC无法播放此文件。 我认为原因是没有调用写尾部函数av_write_trailer,导致索引和时间戳信息丢失,我使用araxis merge工具比较了成功调用av_write_trailer函数的文件和未调用av_write_trailer的损坏文件,发现两个不同点: 1. 损坏的文件头框数量值不正确 2. 损坏的文件没有文件结束标志。
现在我希望在重新开机后,我的程序可以自动修复损坏的文件,在Google上没有找到有效的方法。我的想法是在正常录制过程中,每秒钟保存一个缺失两个信息的损坏文件:框数和文件结束标志,并将其保存到本地文件中。在写入MP4文件完整性后,删除此文件。如果断电损坏,则在下次通电时,读取文件并将相应的信息写入对应位置的损坏文件中。但现在的问题是我不知道如何保存框数和文件结束标志,这样做是否可行?如果可行,我该怎么做?期待您的回复!

2
如果你预计会有电力中断或崩溃,请不要录制为mp4格式。请录制为能够经受这些事件的格式(比如flv),然后在最后转换为mp4格式。 - szatmary
1个回答

2

MP4文件损坏的主要原因是文件的头部或尾部没有正确编写,从而导致整个文件变成无用数据。因此,没有任何媒体播放器能够播放损坏的MP4文件。 所以, 首先,在播放文件之前必须修复损坏的文件。 有一些应用程序和技巧可以用来修复并恢复数据 以下是链接:

http://grauonline.de/cms2/?page_id=5(Windows / Mac)(付费 :( )

https://github.com/ponchio/untrunc(基于Linux的操作系统)(当然,免费!)

第二,使用HEX编辑器手动修复损坏的文件。

这个黑客技巧的逻辑: 这个黑客技巧需要一个损坏的MP4文件和一个好的视频文件,两个视频都是从同一台相机拍摄的。而且好的视频文件的大小应该大于损坏的MP4文件。

在任何HEX编辑器中打开两个视频文件。从好的视频文件中复制尾部部分到损坏的视频文件中并保存!完成!

注意:始终备份视频文件。

请按照以下链接获取详细信息:

http://janit.iki.fi/repair-corrupted-mp4-video/

https://www.lfs.net/forum/thread/45156-Repair-a-corrupt-mp4-file%3F

http://hackaday.com/2015/04/02/manual-data-recovery-with-a-hex-editor/

http://www.hexview.org/hex-repair-corrupt-file.html

第三,尽管MP4文件有许多优点,但这种错误是不可预测且难以处理的。 因此,使用像MPG和AV_CODEC_ID_MPEG1VIDEO/AV_CODEC_ID_MPEG2VIDEO(FFMPEG)这样的格式可能有助于避免这种错误。所提到的MPG格式不需要任何头部/尾部。如果发生突然停电,MPG文件可以播放到目前为止存储的所有帧。
注意:还有其他具有类似特性的格式和编解码器可用。

1
看起来Federico Ponchio让他的untrunc对所有人开放了(包括非Linux用户;-)):http://untrunc.it/ - Roman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接