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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 12:20:54