如何用Shell脚本+FFmpeg批量匹配同名图片与音频生成视频?
批量用FFmpeg按文件名匹配生成视频的Shell脚本实现
已知可用的单个FFmpeg命令
单个命令在终端可正常执行,实现单张图片+单段音频生成视频:
ffmpeg -loop 1 -i image.png -i audio.wav -c:v libx264 -tune stillimage -c:a aac -b:a 192k -pix_fmt yuv420p -shortest output.mp4
现有脚本问题
- 嵌套循环脚本会生成所有图片与音频的组合,不符合一对一匹配需求:
#!/bin/sh for img in *.png; do for wav in *.wav; do ffmpeg -loop 1 -i $img -i $wav -c:v libx264 -tune stillimage -c:a aac -b:a 192k -pix_fmt yuv420p -shortest ../mb/$img.mp4 done done
- 自行编写的匹配脚本存在逻辑错误:
img=*.png仅赋值字符串而非展开具体文件名,导致判断条件恒成立,且输出文件名格式错误($img.mp4会生成类似1.png.mp4的文件,若路径处理不当还可能覆盖原图片)。
简便实现方案
方案1:同一文件夹下一对一匹配
遍历所有PNG文件,提取文件名前缀后匹配对应WAV文件,生成同名MP4:
#!/bin/sh # 遍历当前目录下所有PNG文件 for img in *.png; do # 提取文件名前缀(移除.png后缀) base_name="${img%.png}" # 对应音频文件路径 wav_file="${base_name}.wav" # 检查音频文件是否存在 if [ -f "$wav_file" ]; then # 执行FFmpeg命令,生成同名MP4 ffmpeg -loop 1 -i "$img" -i "$wav_file" -c:v libx264 -tune stillimage -c:a aac -b:a 192k -pix_fmt yuv420p -shortest "${base_name}.mp4" else echo "警告:${wav_file} 不存在,跳过 ${img}" fi done
方案2:不同文件夹下按序号/文件名匹配
若图片、音频分属不同文件夹,可指定路径后按文件名前缀匹配:
#!/bin/sh # 定义各文件夹路径 IMG_DIR="./images" # 图片存放目录 WAV_DIR="./audios" # 音频存放目录 OUTPUT_DIR="./outputs"# 视频输出目录 # 创建输出目录(不存在则自动创建) mkdir -p "$OUTPUT_DIR" # 遍历图片文件夹下的所有PNG文件 for img in "${IMG_DIR}"/*.png; do # 提取文件名前缀(移除路径和.png后缀) base_name=$(basename "$img" .png) # 对应音频文件路径 wav_file="${WAV_DIR}/${base_name}.wav" # 输出视频路径 output_file="${OUTPUT_DIR}/${base_name}.mp4" # 检查音频文件是否存在 if [ -f "$wav_file" ]; then ffmpeg -loop 1 -i "$img" -i "$wav_file" -c:v libx264 -tune stillimage -c:a aac -b:a 192k -pix_fmt yuv420p -shortest "$output_file" else echo "警告:${wav_file} 不存在,跳过 ${img}" fi done
关键说明
- 使用
"${img%.png}"或basename "$img" .png"正确提取文件名前缀,避免通配符未展开的问题; - 用
[ -f "$wav_file" ]检查音频文件是否存在,避免无效执行; - 所有变量用双引号包裹,防止文件名含空格时出现错误。
内容的提问来源于stack exchange,提问作者psychaudio
相关产品推荐
相关产品推荐

