在文件夹中使用最近更新的 7 倍 JPG 制作 gif(每周延时摄影!



这个bash脚本每天在cronjob上截取闭路电视截图。 文件名保存YY_MM_DD_HH_MM_SS。

我可以使用以下行轻松制作"年初至今"延时摄影(显示为sofar.gif) - 请注意,这会忽略所有文件名/创建日期,并且只是起诉文件夹中的每个 JPGffmpeg -pattern_type glob -i $outdir/'*.jpg' $outdir/gif/sofar.gif -y

但我也想同时生成一个 gif,使用以下任一方式: A) 具有最新 7x 文件名的 JPG B) 带有最新修改印章的 JPG (相同的结果)

我在下面尝试了这段代码,它确实生成了一个7days.gif但它只包含 1 帧,这是第 7 个最旧的屏幕截图——而不是我想要的输出,有 7 帧由最近的 7 倍屏幕截图组成。

#!/usr/bin/env bash
PATH=/usr/local/bin:/usr/local/sbin:~/bin:/usr/bin:/bin:/usr/sbin:/sbin
# 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
mkdir $outdir/gif/
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 'http://192.168.1.69/cgi-bin/snapshot.cgi?chn=0&u=XXX&p=XXX&q=0&d=1&rand=0.14620004288649113' -o $file) ; then
echo "Captured & saved $file!"
else
echo "Failed to capture $file"
fi
# THIS IS THE BIT WHICH DOES THE LAST 7 DAYS
shopt -s nullglob
files=( "$outdir"/*.jpg )
file_count=${#files[@]}
echo
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
echo "Making weekly.."
echo "${input_args[@]}"
echo "Making weekly.."
ffmpeg "${input_args[@]}" $outdir/gif/7days.gif -y
echo "Making YTD.."
ffmpeg -hide_banner -loglevel panic -pattern_type glob -i $outdir/'*.jpg' $outdir/gif/sofar.gif -y
exit 1

代码一半工作,就好像我在看到正确的文件列表${input_args[@]}回显一样;Making weekly.. -i 365/2019_07_10_15-00-00.jpg -i 365/2019_07_11_15-00-00.jpg -i 365/2019_07_12_15-00-00.jpg -i 365/2019_07_13_15-00-00.jpg -i 365/2019_07_14_15-00-00.jpg -i 365/2019_07_15_15-00-00.jpg -i 365/2019_07_16_12-00-19.jpg这似乎混淆了ffmpeg,因为它一遍又一遍地添加了-i,这意味着GIF只有一帧。

我需要编辑上面的脚本才能正确地吐出一个7days.gif,该是使用最新的 7 倍屏幕截图动态制作的$outdir

如果您想要七个最新的文件,并且由于您的文件名不包含换行符,您可以执行以下操作:

readarray -t files < <( ls -tr | tail -7 )

最新更新