如何在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
相关产品推荐
相关产品推荐

