使用ffprobe与Bash脚本截取视频最后10秒时遇语法错误求助
解决Bash脚本中ffprobe视频时长计算的语法错误问题
首先得说,你脚本里的核心问题是直接对时间格式的字符串做算术运算——Bash的$((...))只能处理整数数值,没法识别00:00:10.000000这种时分秒格式的字符串,所以肯定会报错。咱们一步步来修正:
问题拆解
- 你用
-sexagesimal让ffprobe输出了人类可读的时间格式,但这种格式对脚本计算不友好,不如直接输出秒数(浮点数)更方便。 - Bash本身处理浮点数计算需要借助
bc工具,因为默认算术扩展只支持整数运算。 - 还要考虑边界情况:如果视频本身时长不足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
相关产品推荐
相关产品推荐

