← back to Debate Ring Viewer

scripts/keyframes-extract.sh

24 lines

#!/bin/bash
# Extract evenly-spaced keyframes from a finished MP4 for the post-build
# four-horsemen review.
set -u
MP4="${1:?usage: keyframes-extract.sh <mp4> <out-dir> [n_frames]}"
OUT="${2:?usage: keyframes-extract.sh <mp4> <out-dir> [n_frames]}"
N="${3:-5}"

mkdir -p "$OUT"
DUR=$(/opt/homebrew/bin/ffprobe -v error -show_entries format=duration -of csv=p=0 "$MP4" | head -1)
DUR=${DUR%.*}; DUR=${DUR:-30}

# Skip the first 1.5s (intro card) and last 1s (fade) when sampling.
START=2
END=$(( DUR - 1 ))
SPAN=$(( END - START ))
STEP=$(( SPAN / (N - 1) ))
for i in $(seq 0 $((N-1))); do
  T=$(( START + STEP * i ))
  /opt/homebrew/bin/ffmpeg -y -ss "$T" -i "$MP4" -vframes 1 -q:v 2 \
    "$OUT/frame-$(printf '%02d' "$i")-t${T}s.png" >/dev/null 2>&1
done
ls -1 "$OUT"/frame-*.png | wc -l | awk '{print "[keyframes] extracted "$1" frames"}'