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

Linux下FFmpeg按指定间隔强制关键帧报错问题求助

问题原因分析

1. Shell解析的转义/字符截断问题

从错误提示Invalid duration specification for force_key_frames: "expr:gte(t 能看出,FFmpeg只接收到了表达式的前半部分,后面的,n_forced*15)丢失了。这大概率是因为Linux shell(比如bash)对参数的解析逻辑和Windows cmd不同:

  • 即使你替换了双引号为单引号,如果命令里混入了Windows格式的换行符\r(比如直接复制Windows下的命令到Linux终端),会导致shell错误截断参数;
  • 部分旧版shell对包含逗号的表达式处理存在隐性问题,导致参数被拆分。

2. FFmpeg版本兼容性差异

如果Windows和Linux上的FFmpeg版本相差较大,旧版Linux FFmpeg可能对expr:gte(t,n_forced*15)这种表达式语法支持不完善,导致解析失败。


解决方法

方法1:修正表达式写法与转义

尝试用更简洁、兼容性更好的表达式替代原写法,同时确保shell能完整传递参数:

# 使用mod表达式替代gte写法
ffmpeg -y -i asd.mp4 -map 0 -segment_time 15 -f segment -force_key_frames "expr:mod(t,15)==0" asd%03d.mp4

如果还是存在解析问题,试试用反斜杠转义逗号(排除shell拆分参数的可能):

ffmpeg -y -i asd.mp4 -map 0 -segment_time 15 -f segment -force_key_frames 'expr:gte(t\,n_forced*15)' asd%03d.mp4

方法2:升级Linux下的FFmpeg

先对比Windows和Linux的FFmpeg版本:

# Linux下查看版本
ffmpeg -version
# Windows下查看版本
ffmpeg.exe -version

如果Linux版本较旧,建议升级到和Windows相近的版本(可以通过官方源安装、编译源码或使用静态编译包),新版本对表达式语法的兼容性更稳定。

方法3:用脚本循环分割替代segmenter

如果segmenter的关键帧问题始终无法解决,可以用脚本手动循环分割视频,灵活性更高:

  1. 先获取视频总时长(转换为秒数):
# 提取时长并转换为秒
duration=$(ffmpeg -i asd.mp4 2>&1 | grep -oP 'Duration: \K[^,]+' | awk -F: '{ print $1*3600 + $2*60 + $3 }')
  1. 循环执行分割命令,每次截取15秒:
start=0
segment=15
count=0
while [ $(echo "$start < $duration" | bc) -eq 1 ]; do
  ffmpeg -y -ss $start -i asd.mp4 -t $segment -c copy -avoid_negative_ts make_zero asd$(printf "%03d" $count).mp4
  start=$(echo "$start + $segment" | bc)
  count=$((count + 1))
done

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:02:44