批量将嵌套文件夹PNG帧生成回旋GIF的脚本及命令优化问询
问题解答
1. 遍历嵌套文件夹自动生成GIF的脚本方案
用Bash脚本就能搞定批量遍历和生成,核心是递归定位所有包含帧图片的文件夹,提取指定路径片段作为GIF文件名,自动执行生成命令。
以下是完整可运行脚本:
#!/bin/bash # 原始帧文件的根目录(/raw/bodies所在的上级目录) ROOT_DIR="./dragon/raw/bodies" # GIF输出目录,可自行调整 OUTPUT_DIR="./generated_gifs" # 提前创建输出目录(不存在则自动生成) mkdir -p "$OUTPUT_DIR" # 递归遍历所有包含1.png的子目录(确保只处理有帧文件的目标文件夹) find "$ROOT_DIR" -type d -exec test -f "{}/1.png" \; -print | while read -r FRAME_DIR; do # 提取/raw/bodies之后的路径片段,把路径分隔符/替换成_,生成合法的GIF文件名 GIF_NAME=$(echo "$FRAME_DIR" | sed "s|^$ROOT_DIR/||" | tr "/" "_").gif FULL_OUTPUT="$OUTPUT_DIR/$GIF_NAME" echo "正在处理: $FRAME_DIR → $FULL_OUTPUT" # 调用合并后的ffmpeg命令生成回旋GIF ffmpeg -framerate 10 -i "$FRAME_DIR/%d.png" -filter_complex "[0:v]split[s0][s1];[s1]reverse,fifo[r];[s0][r]concat=n=2:v=1:a=0,loop=-1:size=$(($(ls "$FRAME_DIR"/*.png | wc -l)*2 -1))" -y "$FULL_OUTPUT" done
关键细节:
- 脚本会自动跳过没有
1.png的文件夹,避免误处理无关目录 - 路径中的
/会被替换成_,比如示例路径会生成dragon_green_old_5_down_idle.gif -framerate 10是动画帧率,可根据你的需求调整数值-y参数会自动覆盖已存在的同名GIF,无需手动确认
2. 合并ffmpeg命令直接生成回旋GIF(无中间文件)
不需要分两步生成正向GIF再反转拼接,用ffmpeg的滤镜链可以一步完成,直接输出无限回旋循环的GIF:
ffmpeg -framerate 10 -i "目标文件夹/%d.png" -filter_complex "[0:v]split[s0][s1];[s1]reverse,fifo[r];[s0][r]concat=n=2:v=1:a=0,loop=-1:size=$(($(ls 目标文件夹/*.png | wc -l)*2 -1))" -y "输出文件名.gif"
滤镜链解析:
split[s0][s1]:把正向帧流拆成两个分支,s0保留正向,s1用于生成反向流reverse,fifo[r]:将s1流反转得到反向帧流r,fifo用于处理帧同步问题concat=n=2:v=1:a=0:把正向流s0和反向流r拼接成"正向→反向"的完整视频loop=-1:size=XXX:让视频无限循环,size设为正向帧数×2-1,避免循环时重复最后一帧
如果你的帧序列是带前导零的命名(比如01.png、02.png),把%d.png换成%02d.png即可(根据实际命名长度调整数字,比如%04d.png对应四位数字命名)。
内容的提问来源于stack exchange,提问作者BestMordaEver
相关产品推荐
相关产品推荐

