FFMPEG生成视频时读取不存在文件 Bash遍历生成的拼接列表无该文件
问题原因
你遇到的报错是因为混淆了FFmpeg序列占位符和bash文件遍历语法,核心逻辑问题有两个:
%06d是FFmpeg专属的序列格式占位符,bash本身无法识别该语法。你将它放在for循环的遍历路径中,bash匹配不到任何对应文件时,默认会将该占位符路径原样输出到FFmpeg的concat输入列表中。- FFmpeg读取到concat列表里带
%06d的路径时,自动触发了内置的image2序列解析逻辑,会从0开始按顺序替换占位符查找对应编号的图片,直到遇到不存在的image-005437.jpeg就抛出错误,完全绕过了你提前筛选合格文件的逻辑。
注:你报错中提到的查找路径是
/mnt/run/image-005437.jpeg,和你遍历的/mnt/processed_images/$image_folder/路径不一致,也可以佐证是FFmpeg自主解析序列占位符时使用了默认工作目录,而非bash输出的路径。
解决方法
推荐改用bash原生通配符遍历存在的文件,完全规避FFmpeg自动解析序列的问题:
方案1:基础可用版
开启bash的nullglob选项,避免匹配不到文件时返回通配符本身,直接遍历所有存在的jpeg文件:
image_folder=$1 singularity exec --bind $work_dir:/mnt $work_dir/longleaf2.sif ffmpeg -f concat -safe 0 -y -i <(shopt -s nullglob; for f in /mnt/processed_images/$image_folder/image-*.jpeg; do echo "file '$f'";done) -vf "crop=trunc(iw/3)*2:trunc(ih/2)*2" -movflags +faststart /mnt/run/summary_files/${image_folder}.mp4
方案2:保证编号顺序版
如果需要严格按图片编号从小到大排序生成视频,在遍历前加自然排序逻辑:
image_folder=$1 singularity exec --bind $work_dir:/mnt $work_dir/longleaf2.sif ffmpeg -f concat -safe 0 -y -i <(shopt -s nullglob; for f in $(ls -v /mnt/processed_images/$image_folder/image-*.jpeg); do echo "file '$f'";done) -vf "crop=trunc(iw/3)*2:trunc(ih/2)*2" -movflags +faststart /mnt/run/summary_files/${image_folder}.mp4
内容的提问来源于stack exchange,提问作者TheCodeNovice
相关产品推荐
相关产品推荐

