ffmpeg多滤镜串联实现GIF叠加透明度设置及批量处理咨询
单文件处理命令
你需要调整滤镜链路,确保GIF分辨率和背景对齐后再传入blend滤镜,同时修正GIF居中、循环播放的问题,完整命令如下:
ffmpeg -i inputmovie.mov -stream_loop -1 -i transparentgif.gif -filter_complex "[0]scale=1280:760:flags=lanczos[bg];[1]format=rgba,pad=1280:760:(ow-iw)/2:(oh-ih)/2:color=0x00000000[gif_padded];[bg][gif_padded]blend=all_mode='overlay':all_opacity=0.3[v]" -map "[v]" -map 0:a? -b:v 1500k -c:a copy outputvideo.mp4
改动说明
- 输入GIF前添加
-stream_loop -1参数,让GIF循环播放和视频时长对齐 - scale参数设置为固定1280x760,新增
flags=lanczos提升缩放画质;如果不需要拉伸原视频比例,可改为scale=1280:-2 - 先将GIF转为RGBA格式,再通过pad滤镜填充为和背景一致的1280x760分辨率,自动居中对齐
- blend滤镜参数按你的要求直接挂载在背景流、处理后的GIF流之后
- 新增
-map 0:a?自动复制原视频音轨,无音轨也不会报错
简化备选方案
overlay滤镜本身支持混合模式和透明度设置,无需单独调用blend滤镜,命令更简洁,效果一致:
ffmpeg -i inputmovie.mov -stream_loop -1 -i transparentgif.gif -filter_complex "[0]scale=1280:760:flags=lanczos[bg];[bg][1]overlay=(main_w-overlay_w)/2:(main_h-overlay_h)/2:opacity=0.3:blend_mode=overlay:eof_action=repeat[v]" -map "[v]" -map 0:a? -b:v 1500k -c:a copy outputvideo.mp4
批量处理方案
Windows 系统
新建文本文档,修改后缀为.bat,和所有待处理的video*.mov、透明GIF放在同一目录下,写入以下内容后双击运行即可:
@echo off for %%f in (video*.mov) do ( ffmpeg -i "%%f" -stream_loop -1 -i transparentgif.gif -filter_complex "[0]scale=1280:760:flags=lanczos[bg];[bg][1]overlay=(main_w-overlay_w)/2:(main_h-overlay_h)/2:opacity=0.3:blend_mode=overlay:eof_action=repeat[v]" -map "[v]" -map 0:a? -b:v 1500k -c:a copy "output_%%f" )
Linux/macOS 系统
新建batch.sh脚本文件,放在同一目录下,写入以下内容:
#!/bin/bash for f in video*.mov do ffmpeg -i "$f" -stream_loop -1 -i transparentgif.gif -filter_complex "[0]scale=1280:760:flags=lanczos[bg];[bg][1]overlay=(main_w-overlay_w)/2:(main_h-overlay_h)/2:opacity=0.3:blend_mode=overlay:eof_action=repeat[v]" -map "[v]" -map 0:a? -b:v 1500k -c:a copy "output_$f" done
执行以下命令运行脚本:
chmod +x batch.sh ./batch.sh
内容的提问来源于stack exchange,提问作者user6262902
相关产品推荐
相关产品推荐

