使用文件夹中最新的7倍更新的JPG制作gif(每周间隔拍摄!)

时间:2019-07-28 13:30:32

标签: bash ffmpeg

此bash脚本每天在cronjob上获取一个CCTV截图。 文件名保存为YY_MM_DD_HH_MM_SS。

我可以使用下面的代码轻松地进行“年初至今”的间隔(显示为sofar.gif)-请注意,这会忽略所有文件名/创建日期,而只是起诉每个文件夹ffmpeg -pattern_type glob -i $outdir/'*.jpg' $outdir/gif/sofar.gif -y

中的JPG

但是我也想同时使用EITHER生成一个gif: A)使用最新7x文件名的JPG B)带有最新修改图章的JPG (结果相同)

我在下面尝试了此代码,该代码确实生成了7days.gif,但是它只包含1帧,是最早的第七张屏幕截图-而是我希望的输出具有由最近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上一遍又一遍地添加了-i,这意味着gif只包含一帧。

我需要编辑上面的脚本以正确吐出7days.gif,该脚本是使用$outdir中最新的7x屏幕截图动态制作的

1 个答案:

答案 0 :(得分:1)

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

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