在目录中使用最近7个jpg文件制作gif(ffmpeg)

时间:2019-07-15 23:45:00

标签: bash ffmpeg

我有一个在cron上运行的bash脚本,每天拍摄我的CCTV 1x的屏幕快照,以进行年度间隔拍摄。一切正常,我得到了第一个屏幕快照到最后一个屏幕快照的YTD sofar.gif-现在已经很长了。我想添加一行以制作last7days.gif,这样我可以得到更短的每周gif等。

我已经搜索了该站点和网络,并可以使用以下命令在终端中列出最新的7个文件:ls -1t | head -n 9 | tail -n 7(这将删除最后修改的.gif和.mov),但我不知道该如何做将7个文件名的垂直列表转换为变量,以使用这些文件名创建gif

# runs from a cronjob. saves live screenshot from CCTV to jpg, then updates the year-to-date movie

if [ $# -ne 1 ]
then
  echo "Usage: `basename $0` OUTDIR"
  exit 65
fi

doexit=0

start=$(date +%s)
end=$(date +%s)

outdir=${1%/}
mkdir $outdir
echo "Capturing image..."

counter=$(date +"%Y_%m_%d_%H-%M-%S");
file=$outdir/$counter.jpg

if response=$(curl --silent --write-out %{http_code} --max-time 600 'URL REDACTED' -o $file) ; then
    echo "Captured & saved $file!"
else
    echo "Failed to capture $file"
fi

ffmpeg -hide_banner -loglevel panic -pattern_type glob -i $outdir/'*.jpg' $outdir/sofar.mov -y
ffmpeg -hide_banner -loglevel panic -pattern_type glob -i $outdir/'*.jpg' $outdir/sofar.gif -y

exit 1

当前,最后一行使用每个图像文件创建一个.gif,这仅是因为它们与日期一起保存在文件名中。

我想添加一行以仅使用最近的7张图像来创建.gif

1 个答案:

答案 0 :(得分:3)

在外壳中进行遍历,然后可以获取所需的任何子集:

#!/usr/bin/env bash
#              ^^^^- NOT /bin/sh; array support is required.

shopt -s nullglob
files=( "$outdir"/*.jpg )
file_count=${#files[@]}

if (( ${#files[@]} == 0 )); then
  echo "ERROR: No files found" >&2; exit 1;
elif (( ${#files[@]} > 7 )); then
  files=( "${files[@]:$(( ${#files[@]} - 7 ))}" )
fi

input_args=( )
for f in "${files[@]}"; do
  input_args+=( -i "$f" )
done

ffmpeg "${input_args[@]}" "$outdir/sofar.gif"