如何在HPC环境下使用ffmpeg将大量非连续JPEG图片合成为视频
适配5万张不连续JPEG的FFmpeg合成脚本(Slurm+Singularity环境)
直接替换你原脚本中的合成命令即可,所有原有调度配置保留:
#!/bin/bash #SBATCH -p general #SBATCH -N 1 #SBATCH -t 03-00:00:00 #SBATCH --mem=8g #SBATCH -n 1 #SBATCH --mail-type=BEGIN,REQUEUE,END,FAIL,REQUEUE #SBATCH --mail-user=<snip> img_dir='foo/bar/1/2/123456' folder='fooo' # 输出帧率,可根据需求调整 FRAME_RATE=24 # 核心合成逻辑:用singularity内的for循环逐张输出图片到管道,规避参数长度限制 singularity exec /${img_dir}/foo_container bash -c "for img in /${img_dir}/processed_images/${folder}/*.jpeg; do cat \"\$img\"; done" | \ ffmpeg -f image2pipe -framerate ${FRAME_RATE} -i pipe:.jpeg \ -vf "crop=trunc(iw/2)*2:trunc(ih/2)*2,format=yuv420p" \ -c:v libx264 -crf 23 -preset medium -y \ /${img_dir}/processed_images/${folder}/${folder}.mp4
核心修改说明
- 替换了原有
cat *.jpeg的通配符写法,改为在Singularity容器内执行for循环逐张读取图片,不会触发Shell的ARG_MAX参数长度硬限制,且自动按文件名字典序遍历所有存在的JPEG文件,不受序号不连续的影响 - 新增帧率参数
-framerate可自定义视频每秒帧数,默认24帧符合通用场景 - 新增
format=yuv420p像素格式配置、H.264编码器参数,输出视频兼容性更强,可在绝大多数播放器直接播放 - 新增
-y参数自动覆盖已存在的输出文件,避免任务因交互提示卡住
注意事项
- 如果你的图片需要按时间戳/其他规则排序而非文件名默认字典序,可修改for循环的遍历逻辑,替换为排序命令输出后再迭代即可
- 8G内存、单核心的调度配置足够应对5万张图片的合成任务,无需调整
- 合成速度主要取决于存储读写速度和编码器预设,可根据需求调整
-preset参数:fast速度更快、压缩率更低,slow速度更慢、压缩率更高
内容的提问来源于stack exchange,提问作者TheCodeNovice
相关产品推荐
相关产品推荐

