timelapse設定

  • timelapseシナリオ

    • raspberry piにはモジュールカメラでtimelapse機能が標準搭載されているが

    • 低スペックかつ多重処理のIOT-House_zero_w単体でtimelapseを完結するには厳しい

    • なので2台のraspberry pi zeroでサーバーとクライアント分散処理をします

    • サーバー側(https://github.com/kujiranodanna/IOT-House/blob/master/raspberrypi/usr/local/bin/pepotimelapse)

      • raspistillコマンドのawbとannotationオプションをつけ60秒ごとにimage000.jpg,image001.jpg … image059.jpgファイル作成(スペック制限で画像サイズは640x480)
        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        11
        while true;do
        NOWSEC=`date +"%S:"`
        NOWMIN=`date +"%M:"`
        if [ $NOWSEC = "00:" ];then
        k=`printf "image%03d.jpg" $j`
        raspistill -awb flash -a 1036 -ae +25+25 -w 640 -h 480 -o $IMAGE_DIR/$k
        j=$(($j + 1))
        if [ $j -gt 59 -o $NOWMIN = "59:" ];then
        .
        fi
        done
      • 1時間ごとにこれをtimelapse.tar.gzで固め繰り返す
        1
        2
        3
        4
        mkdir $IMAGE_DIR_TMP
        mv $IMAGE_DIR/* $IMAGE_DIR_TMP/
        (cd $WORKDIR;tar cfz ${IMAGE_TIMELAPSE}.tar.gz $IMAGE_TIMELAPSE)

    • クライアント側(https://github.com/kujiranodanna/IOT-House/blob/master/raspberrypi/usr/local/bin/pepoffmpegtimelapse)

      • 1時間毎にtimelapse.tar.gzをサーバー側からゲット解凍後、日付時間毎の2021-08-17_00.mp4 … 2021-08-17_59.mp4の動画ファイル作成、htmlで閲覧できるようにしておく
      • 1時間毎のtimelapse(セキュリティ上大部分をトリミングしてます)
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      while true;do
      NOWMIN=`date +"%M:"`
      if [ $NOWMIN = "05:" ];then
      NOWHOUR=`date +"%H:"`
      NOWDATE=`date +"%Y-%m-%d_%H"`
      HOURAGO=`date -d "1 hour ago" +"%Y-%m-%d_%H"`
      DAYAGO=`date -d "1 day ago" +"%Y-%m-%d"`
      WEEKAGO=`date -d "1 week ago" +"%Y-%m-%d"`
      msleep 60000
      else
      msleep 10000
      continue
      fi
      .
      curl -s --connect-timeout $RETRYTIME --retry $RETRY --user-agent ${USERAGENT} --tlsv1 -k -u ${USER}:${PASSWORD} https://$RMHOST:$PORT/$REMOTEFILE >$LOCALFILE
      .
      ffmpeg -f image2 -i $IMAGE_DIR_TMP/image%03d.jpg -vcodec libx264 -y $IMAGE_DIR/${HOURAGO}.mp4 >/dev/null 2>&1
      • 00時に時間毎ファイルから1日分2021-08-17.mp4の動画ファイル作成、外部SDカードに移動htmlで閲覧できるようにリンクしておく
        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        11
        12
        13
        14
        15
        16
        if [ $NOWHOUR = "00:" ];then
        ls -l $IMAGE_DIR/*| grep $DAYAGO| awk '{printf("file %s\n",$9)}' >$FFMPEGINPUT
        .
        ffmpeg -safe 0 -f concat -i $FFMPEGINPUT -c copy -y $IMAGE_DIR/${DAYAGO}.mp4
        .
        mv $IMAGE_DIR/${DAYAGO}.mp4 $MP_DIR/
        ln -s $MP_DIR/${DAYAGO}.mp4 $IMAGE_DIR/${DAYAGO}.mp4
        .
        WEEKAGO_IMAGE=`ls -l $IMAGE_DIR/*| grep $WEEKAGO| awk '{printf("%s ",$9)}'`
        MP_WEEKAGO_IMAGE=`ls -l $MP_DIR/*| grep $WEEKAGO| awk '{printf("%s",$9)}'`
        if [ `echo $WEEKAGO_IMAGE| wc -w` -eq 0 ];then
        continue
        else
        rm $WEEKAGO_IMAGE
        .
        fi
      • 外部SDカードに溜まった1週間前の動画ファイルを消去
  • timelapse設定

    • サーバー側起動(/service/にサーバー・スクリプトへリンクを張りdaemotoolsで起動する)
      1
      2
      3
      4
      5
      6
      7
      8
      9
        ssh pi@iotXXX
      .
      $ sudo su
      # cd /service/
      # mkdir timelapse
      # cd timelapse
      # ln -s /usr/local/bin/pepotimelapse run
      # svstat /www/pepolinux/timelapse/
      /www/pepolinux/timelapse/: up (pid XX) X seconds
    • クライアント側(USBへ動画保存用SDカードセット後クライアント・スクリプトを起動)
      1
      2
      3
      4
      5
      6
      7
      8
      ssh pi@iotXXX
      .
      $ sudo su
      # cd /service/
      # mkdir ffmpegtimelapse
      # /usr/local/bin/pepoffmpegtimelapse run
      # svstat /www/pepolinux/ffmpegtimelapse/
      /www/pepolinux/ffmpegtimelapse/: up (pid XX) X seconds
      • 1日分のtimelapse(セキュリティ上大部分をトリミングしてます)