使用ffmpeg制作延时视频时无法匹配全部jpg文件问题求助
问题原因&修正方案
- 第一处语法错误:
while read -r后直接换行,变量A没有接在read命令后,导致读取到的目录路径无法正确赋值,ffmpeg获取的路径为空自然找不到图片。 - 第二处核心参数错误:
-i "$(\"${A}\"*.jpg)"写法完全错误,$()是命令替换语法,此处不需要执行命令,只需要拼接目录路径和jpg通配符,多余的转义引号和命令替换会导致路径解析失败,无法匹配到任何jpg文件。 - 额外优化点:原脚本固定生成
0.mp4再重命名,重复生成临时文件无意义,可以直接合并为一步生成目标视频,降低不必要的IO开销。
修正后可用脚本
#!/bin/bash DIR_SOURCE="/volume1/homes/krislec/timelapse/test/" find "${DIR_SOURCE}" -maxdepth 1 -type d ! -name 'test' ! -name '@eaDir' | while read -r A; do # 直接一步生成带正确宽高比的延时视频,兼容普通播放器、移动端播放 ffmpeg -nostdin -framerate 5 -pattern_type glob -i "${A}/*.jpg" -c:v libx264 -pix_fmt yuv420p -aspect 16:9 "${A}.mp4" done
可选补充:如果文件名未按时间顺序排列,可使用按修改时间排序的版本
#!/bin/bash DIR_SOURCE="/volume1/homes/krislec/timelapse/test/" find "${DIR_SOURCE}" -maxdepth 1 -type d ! -name 'test' ! -name '@eaDir' | while read -r A; do # 先按文件修改时间升序生成输入列表 ls -1tr "${A}"/*.jpg > filelist.txt ffmpeg -nostdin -framerate 5 -f concat -safe 0 -i <(sed "s/^/file '/;s/$/'/" filelist.txt) -c:v libx264 -pix_fmt yuv420p -aspect 16:9 "${A}.mp4" rm -f filelist.txt done
内容的提问来源于stack exchange,提问作者kris Lec
相关产品推荐
相关产品推荐

