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

如何在Bash脚本中批量从MP4视频中间切割20秒片段

批量从MP4视频中间切割20秒片段的Bash脚本实现

以下是直接可用的Bash脚本,实现遍历目录下所有MP4文件,自动计算视频中间位置并切割20秒片段,同时处理时长不足20秒的特殊情况:

#!/bin/bash

# 遍历当前目录下所有MP4文件
for input_file in *.mp4; do
    # 跳过非文件对象(如子目录)
    [ -f "$input_file" ] || continue

    # 用ffprobe提取视频总时长(单位:秒,支持小数)
    duration=$(ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 "$input_file")

    # 计算中间起始时间:总时长的一半
    start_time=$(echo "$duration / 2" | bc -l)

    # 处理时长不足20秒的视频:直接截取全部内容
    if (( $(echo "$duration < 20" | bc -l) )); then
        echo "警告:$input_file 时长不足20秒,将截取完整视频"
        start_time=0
        cut_duration=$duration
    else
        cut_duration=20
    fi

    # 生成输出文件名(原文件名后缀加"_mid")
    output_file="${input_file%.mp4}_mid.mp4"

    # 执行切割命令,屏蔽冗余输出
    ffmpeg -ss "$start_time" -i "$input_file" -t "$cut_duration" -c copy "$output_file" 2>/dev/null

    echo "处理完成:$input_file -> $output_file"
done

关键细节说明

  • 时长提取:使用ffprobe(ffmpeg配套工具)而非ffmpeg,它专门用于提取媒体元数据,输出更简洁高效,避免了ffmpeg的启动冗余信息。
  • 浮点运算:依赖bc -l工具完成精确的除法计算,支持带小数的视频时长(如125.6秒)。
  • 边界处理:自动判断视频时长是否小于20秒,避免出现起始时间+20秒超出总时长的错误,这种情况直接截取完整视频。
  • 文件名安全:用${input_file%.mp4}处理文件名,确保即使原文件名包含空格也能正常工作,输出文件名格式统一为原文件名_mid.mp4。
  • 快速切割:-c copy参数直接复制原视频的音视频编码,无需重新编码,处理速度极快;如果需要重新编码(比如解决时间戳问题),可以去掉该参数。

扩展说明

  • 如果需要处理子目录中的MP4文件,可以替换遍历逻辑为find命令(支持空格文件名):
    find . -type f -name "*.mp4" | while read -r input_file; do
        # 脚本核心逻辑(同上)
    done
    
  • 确保系统已安装ffmpeg(包含ffprobe),Debian/Ubuntu系可执行sudo apt install ffmpeg,RHEL/CentOS系可执行sudo yum install ffmpeg。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 20:55:59