如何中断长时间运行的FFmpeg编码任务并在系统重启后恢复进度
FFmpeg VP9编码可中断恢复方案
目前FFmpeg没有原生支持直接断点保存/恢复VP9编码状态的功能,因为VP9编码过程中涉及大量帧参考、熵编码状态等临时上下文数据,没有内置的序列化存储机制。你提到的分片编码后拼接是现有条件下最稳定可用的实现方式,以下是优化后的实现方法,可降低分片、合并的额外操作成本:
分片编码实现步骤
- 第一步先获取源视频总时长,执行命令:
ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 输入视频路径
命令返回值为视频总时长,单位为秒。 - 第二步根据可接受的最小中断粒度设置分片长度,比如10分钟对应600秒,无需提前拆分源视频,直接调用FFmpeg分段编码即可:
ffmpeg -i 输入视频路径 -c:v libvpx-vp9 -crf 30 -b:v 0 -g 240 -f segment -segment_time 600 -reset_timestamps 1 输出分片目录/分片_%03d.webm
参数说明:-g 240是按24fps帧率设置关键帧间隔为10秒,保证分片边界为关键帧,避免后续拼接出现花屏;-reset_timestamps 1让每个分片的时间戳从0开始,避免拼接时出现时间轴错误。 - 第三步如果编码中断,重启后仅需要统计已经生成的分片数量,计算出已处理的总时长,添加
-ss参数跳过已编码部分即可续跑,比如已经完成3个600秒的分片,对应已处理1800秒,续跑命令为:ffmpeg -ss 1800 -i 输入视频路径 -c:v libvpx-vp9 -crf 30 -b:v 0 -g 240 -f segment -segment_time 600 -reset_timestamps 1 -start_number 3 输出分片目录/分片_%03d.webm
其中-start_number 3指定生成的分片序号从3开始,避免覆盖已完成的分片。 - 第四步所有分片编码完成后,先生成分片列表文件,再执行无损拼接:
生成列表命令:for f in 输出分片目录/分片_*.webm; do echo "file '$f'" >> 分片列表.txt; done
拼接命令:ffmpeg -f concat -safe 0 -i 分片列表.txt -c copy 最终输出.webm
优化说明
- 分片长度可自由调整,分片越短中断后损失的编码进度越少,但对应的拼接耗时会略有上升,长视频建议选择300~1200秒的分片长度即可。
- 多核性能有富余的情况下,可以同时启动多个FFmpeg进程分别编码不同时间段的分片,进一步压缩总耗时。
- 整个流程无需提前拆分源文件,所有操作都直接基于原视频执行,不会产生额外的中间分片源文件占用存储空间。
内容的提问来源于stack exchange,提问作者simon
相关产品推荐
相关产品推荐

