如何使用ffmpeg直接保存录制视频的最后60秒内容?
FFmpeg 保留录制内容最后60秒的实现方案
已完成录制的本地文件场景
你当前使用的命令已经可以直接实现需求,无需提前分段录制再合并裁剪:
ffmpeg -sseof 60 -i "\PATH\TO\VIDEO" -c copy "\PATH\TO\OUTPUT"
参数说明:
-sseof 60:表示从输入文件的末尾位置向前偏移60秒,作为内容读取的起始点-c copy:直接复制音视频流无需重新编码,处理速度极快,全程仅读取原文件最后60秒的内容输出,不会生成任何中间文件
正在录制的实时流/直播流场景
如果需要边录制边只保留最新的60秒内容,不存储全量录制数据,可以使用环形切片方案:
ffmpeg -i [输入流地址/采集设备路径] -f segment -segment_time 1 -segment_wrap 60 -c copy seg_%03d.mp4
参数说明:
- 每1秒生成一个切片文件,
segment_wrap 60表示最多保留60个切片,满了之后从最早的切片开始循环覆盖,磁盘上始终只存在最近60秒的内容 - 需要导出最后60秒的完整视频时,只需要将当前存在的60个切片按顺序合并即可
注意事项
- 使用
-c copy流复制模式时,要求输入视频的关键帧间隔≤10秒,否则截取的开头可能出现数秒无画面的问题(流复制只能从关键帧位置开始裁剪)。如果对时间精度要求很高,可以移除-c copy参数转码输出,时间精度可以达到帧级别,仅处理速度会有所下降。 - 如果是正在写入的未完成录制文件,需要等录制进程正常退出、文件索引写入完成后再运行截取命令,避免因文件元数据不完整导致截取失败。
内容的提问来源于stack exchange,提问作者Marc Khoury
相关产品推荐
相关产品推荐

