如何编写Bash脚本按25组批量执行FFmpeg并添加间隔?
批量分组处理视频文件的Bash脚本
以下是适配CentOS 7、Bash 5.0.17环境的解决方案,实现每25个文件为一组执行FFmpeg加水印转码,每组处理完成后暂停1-2分钟释放服务器资源:
完整脚本
#!/bin/bash # 配置项:根据实际环境修改路径与参数 INPUT_FILE="example.txt" FFMPEG="/path/to/file/ffmpeg" WATERMARK="/path/to/file/watermark.png" SOURCE_DIR="/path/to/file" OUTPUT_DIR="/path/to/file" BATCH_SIZE=25 PAUSE_DURATION=60 # 单位:秒,1分钟=60秒,2分钟则设为120 # 初始化批次计数器与存储数组 current_count=0 batch=() # 逐行读取文件名 while IFS= read -r filename; do # 跳过空行 [[ -z "$filename" ]] && continue batch+=("$filename") ((current_count++)) # 达到批次大小,执行处理 if [[ "$current_count" -eq "$BATCH_SIZE" ]]; then for fn in "${batch[@]}"; do # 生成输出文件名:原文件名后加"_watermarked",保留原后缀 ext="${fn##*.}" base="${fn%.*}" output_fn="${OUTPUT_DIR}/${base}_watermarked.${ext}" # 执行FFmpeg转码命令 "$FFMPEG" -report -nostdin -i "$WATERMARK" -i "${SOURCE_DIR}/${fn}" \ -filter_complex "scale2ref[a][b];[b][a]overlay=x=(main_w-overlay_w)/2:y=(main_h-overlay_h)/2" \ "$output_fn" -c:v libx265 done # 暂停指定时长 echo "批次处理完成,暂停 $((PAUSE_DURATION/60)) 分钟..." sleep "$PAUSE_DURATION" # 重置批次状态 current_count=0 batch=() fi done < "$INPUT_FILE" # 处理剩余不足一个批次的文件 if [[ "$current_count" -gt 0 ]]; then for fn in "${batch[@]}"; do ext="${fn##*.}" base="${fn%.*}" output_fn="${OUTPUT_DIR}/${base}_watermarked.${ext}" "$FFMPEG" -report -nostdin -i "$WATERMARK" -i "${SOURCE_DIR}/${fn}" \ -filter_complex "scale2ref[a][b];[b][a]overlay=x=(main_w-overlay_w)/2:y=(main_h-overlay_h)/2" \ "$output_fn" -c:v libx265 done echo "剩余文件处理完成" fi echo "所有文件处理完毕"
使用说明
- 配置修改:将脚本中
# 配置项下的路径、参数替换为实际值,比如调整PAUSE_DURATION为120秒实现2分钟暂停。 - 权限设置:给脚本添加执行权限:
chmod +x batch_process.sh - 运行脚本:直接执行
./batch_process.sh
关键细节
- 批次控制:通过计数器和数组收集文件名,确保每25个文件为一组执行,避免逐行频繁调用或一次性加载所有文件导致资源耗尽。
- 输出文件名规则:自动保留原文件后缀,在文件名中添加
_watermarked标记,可根据需求修改生成逻辑。 - 空行处理:跳过输入文件中的空行,避免无效的FFmpeg调用。
- 剩余文件处理:最后一批不足25个的文件会被自动处理,不会遗漏。
内容的提问来源于stack exchange,提问作者Robert Dio
相关产品推荐
相关产品推荐

