假设我开始一项需要花费数小时的 FFmpeg 工作:
$ ffmpeg -i large.mp4 out.mp4
有什么方法可以预览吗完成的部分out.mp4 而其余部分尚未编码?
尝试此方法会报错“未找到 moov atom”。如果要我推测原因,那是因为播放要求在文件开头有更新且正确的标头信息,而 FFmpeg 在编码文件时不会费心去做这件事;它会等到编码完全完成。
答案1
简而言之,不行。MP4 文件必须先完成编码才能观看。正如您正确指出的那样,为了开始播放,播放器需要解析原子moov
,其中包含有关要播放的内容的重要信息。有关说明,您可以查看QuickTime 文件格式规范,这成为了 MPEG-4 第 14 部分(简称 MP4 格式)的基础。
只有在媒体轨道完全编码后才能写入此原子。 ffmpeg 并不是“懒得”写入它 — 您只需等到所有数据都存在,即可获得所需的所有信息。
然后,原子被写入容器的末尾。为了更快地播放,您可以将此原子移动到文件的开头(例如,使用qt-faststart
或使用 ffmpeg 选项-movflags +faststart
)。当然,这也只能在编码完成后才能完成。
尽管如此,碎片化的 MP4 仍可以预览到某个特定点,正如 Gyan 所建议的那样,通过添加以下选项:
-movflags +frag_keyframe+separate_moof+omit_tfhd_offset+empty_moov
您还可以切换到分段编码方法,例如使用segment
复用器。这些会创建部分剪辑,长度最多为预定义长度,这意味着您可以开始预览现有片段。然后,您可以使用流复制将这些片段重新合并为一个文件。