ipcam-merge.sh raw

   1  #!/bin/bash
   2  # Merge all *_condensed.mkv files into a rolling accumulator via stream copy
   3  # Usage: ipcam-merge.sh [output.mkv]
   4  # The accumulator file is prepended (oldest first), new condensed files appended in order
   5  DIR="$(cd "$(dirname "$0")" && pwd)"
   6  OUT="${1:-$DIR/ipcam/motion.mkv}"
   7  TMP=$(mktemp -d)
   8  trap "rm -rf $TMP" EXIT
   9  
  10  # collect condensed files sorted by name (timestamp order)
  11  CONDENSED=($(ls "$DIR"/ipcam/*_condensed.mkv 2>/dev/null | sort))
  12  
  13  if [ ${#CONDENSED[@]} -eq 0 ]; then
  14    echo "no condensed files to merge"
  15    exit 0
  16  fi
  17  
  18  # build concat list: existing accumulator first, then new condensed files
  19  if [ -f "$OUT" ]; then
  20    echo "file '$OUT'" > "$TMP/concat.txt"
  21  fi
  22  for f in "${CONDENSED[@]}"; do
  23    echo "file '$f'" >> "$TMP/concat.txt"
  24  done
  25  
  26  echo "merging ${#CONDENSED[@]} condensed files"
  27  
  28  ffmpeg -y -loglevel error -f concat -safe 0 -i "$TMP/concat.txt" -c copy "$TMP/merged.mkv"
  29  mv "$TMP/merged.mkv" "$OUT"
  30  
  31  # remove merged condensed files
  32  for f in "${CONDENSED[@]}"; do
  33    rm "$f"
  34  done
  35  
  36  echo "wrote $OUT ($(du -h "$OUT" | cut -f1))"
  37