You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

FFmpeg -sseof参数无法按预期截取Mac实时桌面录制最后30秒

解决实时桌面录制仅保留最后30秒的问题

首先,你遇到的问题根源很明确:-sseof 参数是基于输入流的总时长来倒推截取位置的,但avfoundation的实时桌面流是没有固定总时长的(它是持续输出的直播流),所以ffmpeg会报错 "Cannot use -sseof, duration of 1 not known",导致这个参数完全失效,最终保存了从启动录制到停止的完整视频。

替代方案:用Segment Muxer实现环形缓冲录制

要实现“仅保留内存/磁盘中最后30秒内容”的需求,我们可以利用ffmpeg的segment多路复用器,它可以把实时流分割成固定时长的片段,并且自动覆盖旧的片段,只保留最新的一段(或几段)。具体命令如下:

ffmpeg -rtbufsize 300M -f avfoundation -i '1' -c:v libx264 -preset ultrafast -tune zerolatency -crf 25 \
-f segment -segment_time 30 -segment_wrap 1 -segment_format mkv ~/Desktop/temp_last30.mkv

参数说明:

  • -f segment:指定输出为分段格式
  • -segment_time 30:每个片段的时长为30秒
  • -segment_wrap 1:只保留1个片段,新生成的片段会直接覆盖旧的
  • -segment_format mkv:指定片段格式为mkv(和你原来的输出格式一致)

当你需要停止录制时,直接按Ctrl+C中断ffmpeg进程,此时~/Desktop/temp_last30.mkv就是最后30秒的录制内容。如果需要更规范的文件名,中断后可以手动重命名:

mv ~/Desktop/temp_last30.mkv ~/Desktop/output.mkv

进阶优化:保留最近两个30秒片段(避免中断时的片段截断)

如果担心中断时刚好在片段切换的节点,导致最后一个片段时长不足30秒,可以设置segment_wrap=2,这样会保留最近的两个30秒片段,中断后把两个片段合并即可:

# 录制命令
ffmpeg -rtbufsize 300M -f avfoundation -i '1' -c:v libx264 -preset ultrafast -tune zerolatency -crf 25 \
-f segment -segment_time 30 -segment_wrap 2 -segment_format mkv ~/Desktop/last30_%d.mkv

# 中断后合并两个片段(自动识别存在的文件)
ffmpeg -f concat -safe 0 -i <(for f in ~/Desktop/last30_*.mkv; do echo "file '$f'"; done) -c copy ~/Desktop/output.mkv

这样即使在片段切换时中断,你也能通过合并得到完整的最后30秒内容。


内容的提问来源于stack exchange,提问作者Vitalii

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 15:57:53