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

使用ffprobe与Bash脚本截取视频最后10秒时遇语法错误求助

解决Bash脚本中ffprobe视频时长计算的语法错误问题

首先得说,你脚本里的核心问题是直接对时间格式的字符串做算术运算——Bash的$((...))只能处理整数数值,没法识别00:00:10.000000这种时分秒格式的字符串,所以肯定会报错。咱们一步步来修正:

问题拆解

  1. 你用-sexagesimal让ffprobe输出了人类可读的时间格式,但这种格式对脚本计算不友好,不如直接输出秒数(浮点数)更方便。
  2. Bash本身处理浮点数计算需要借助bc工具,因为默认算术扩展只支持整数运算。
  3. 还要考虑边界情况:如果视频本身时长不足10秒,直接减10秒会得到负数,得加个判断避免出错。

修正后的脚本

for f in *.mp4; do
    # 用ffprobe输出秒数格式的视频时长(浮点数,比如65.234代表1分5秒234毫秒)
    videoduration=$(ffprobe -i "$f" -show_entries format=duration -v quiet -of csv="p=0")
    # 要减去的时长(固定10秒)
    cutduration=10.0
    # 用bc计算新时长,保留小数精度;如果原时长小于10秒,直接设为0
    newduration=$(echo "if ($videoduration > $cutduration) $videoduration - $cutduration else 0" | bc -l)
    
    echo "原视频 $f 时长:$videoduration 秒,裁剪后目标时长:$newduration 秒"
    
    # 如果需要实际执行视频裁剪,取消下面的注释即可(无损复制编码,速度快)
    # ffmpeg -i "$f" -t "$newduration" -c:v copy -c:a copy "trimmed_$f"
done

关键改动说明

  • 去掉了-sexagesimal参数,让ffprobe直接输出秒数,从根源上简化计算逻辑。
  • 用bc -l处理浮点数减法,-l参数加载数学库,保证浮点数运算的精度。
  • 给变量$f加了双引号,避免文件名包含空格时出现解析错误(这是Bash脚本的常见坑)。
  • 增加了时长判断,防止出现负数时长的非法情况。

如果之后需要把秒数转回HH:MM:SS.ss的格式,可以用这个小技巧:

# 将秒数格式化为时分秒格式
formatted_duration=$(printf "%02d:%02d:%06.3f" $(echo "$newduration/3600" | bc) $(echo "($newduration%3600)/60" | bc) $(echo "$newduration%60" | bc -l))
echo "格式化后的时长:$formatted_duration"

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 09:33:13