创建能够容忍编码过程中突发故障的 MP4 文件

创建能够容忍编码过程中突发故障的 MP4 文件

我正在尝试创建一个 mp4 文件,即使编码器中的所有位未存入磁盘,该文件也可以在当前状态下播放。这可能是由于在网络文件系统上存储文件失败,或者执行编码的机器突然出现故障(例如断电)。我正在使用 ffmpeg 直接从实时视频源读取并创建 mp4 文件。但是,我注意到,如果发生中断并且 ffmpeg 无法在最后正确关闭文件,那么我尝试过的任何播放器都无法播放该文件。

模拟失败的方法是将文件存储在本地,然后将其 rsync 到新文件并尝试播放。这样,文件在特定时间点的当前状态可用于模拟文件在编码中断时的状态。另一种更简单的方法是直接尝试播放正在编码的文件。这两种方法都无法成功播放文件。

我尝试使用-movflags +faststart选项(我也尝试不使用+),因为此选项将 moov 原子移动到视频的开头;没有它,文件在编码完成之前无法播放。当我尝试此选项时,我注意到视频文件不是以小块的形式写入磁盘,而是开始以 256kB 的块进行更新。但是,除非 ffmpeg 正确终止写入,否则视频仍然无法播放。进一步的研究表明,此选项要求视频文件已经完成录制。

运行时ffmpeg -h full我还看到有一个isml选项应该用来“创建流畅的实时流媒体”,但这也无济于事。

如果录制因故障中断,我怎样才能真正让视频容忍不完整的录制并继续播放?

答案1

这是不可能的常规的MP4 作为元数据是播放文件所必需的,并且在构建文件时元数据会保存在内存中。处理完所有媒体后,元数据将最终确定并写入磁盘。这样做的目的faststart是将这些元数据写入文件的头部而不是尾部。但写入仍然发生在操作结束时。

然而,支离破碎即使 ffmpeg 中途被终止,MP4 仍然可用 -最多的书面媒体将可供查看。

ffmpeg -i input <encoding parameters> -movflags +frag_keyframe+separate_moof+omit_tfhd_offset+empty_moov out.mp4

大多数现代播放器都支持碎片化 MP4,但有些可能无法在搜索栏上正确显示时长或进度状态。

您可以通过重新混合将碎片化的 MP4 转换为常规 MP4。

ffmpeg -i fragmented.mp4 -c copy -map 0 regular.mp4

相关内容