使用ffmpeg批量截取文件夹中MP4视频前半段的问题
解决批量截取MP4视频前半段的问题
原脚本的问题
let命令仅支持整数运算,而ffprobe返回的视频时长是浮点数,导致算术语法错误。- 变量未加双引号,文件名包含空格或特殊字符时会被Shell拆分,引发参数错误。
- ffmpeg参数错误:
-sseof是从文件末尾往前截取内容,不符合“保留前半段”的需求。
修正后的脚本
方式一:用awk处理浮点数计算
for i in *.mp4; do # 获取视频精确时长(浮点数) duration=$(ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 "$i") # 计算半长,保留3位小数保证精度 half_duration=$(echo "$duration / 2" | awk '{printf "%.3f", $0}') # 截取前半段,-c copy快速复制流(无重新编码),自动覆盖同名输出文件 ffmpeg -i "$i" -t "$half_duration" -c copy -y "${i%.mp4}_half.mp4" done
方式二:用bc处理浮点数计算
for i in *.mp4; do duration=$(ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 "$i") # scale=3表示保留3位小数 half_duration=$(echo "scale=3; $duration / 2" | bc) ffmpeg -i "$i" -t "$half_duration" -c copy -y "${i%.mp4}_half.mp4" done
关键说明
- 引号包裹变量:所有涉及文件名的变量都用双引号(
"$i")包裹,确保空格、特殊字符(如!、&)能被正确识别。 - 浮点数计算:用awk或bc替代
let处理浮点数除法,保证时长计算的精度。 - ffmpeg参数优化:
-t:指定截取的持续时间(即视频前半段的长度),符合需求。-c copy:直接复制音视频流,无需重新编码,速度极快;若遇到关键帧问题导致复制失败,可删除该参数让ffmpeg重新编码(速度变慢但兼容性更好)。-y:自动覆盖已存在的输出文件,避免手动确认。
- 输出文件名:在原文件名后添加
_half后缀,避免覆盖原视频文件。
内容的提问来源于stack exchange,提问作者c00kieRaptor
相关产品推荐
相关产品推荐

