Skip to content

Instantly share code, notes, and snippets.

@krystalcampioni
Created January 30, 2025 18:18
Show Gist options
  • Save krystalcampioni/ec8fb630ad18a0862f467fc1ea54a710 to your computer and use it in GitHub Desktop.
Save krystalcampioni/ec8fb630ad18a0862f467fc1ea54a710 to your computer and use it in GitHub Desktop.
#!/bin/bash
INPUT_DIR="UPLOAD"
OUTPUT_DIR="frames"
MAX_WIDTH=1920
QUALITY=80
FORMAT="webp" # can be webp, jpg, or png
mkdir -p "$OUTPUT_DIR"
clean_filename() {
echo "$1" | tr ' ' '_' | tr -cd '[:alnum:]._-'
}
total_files=$(find "$INPUT_DIR" -type f \( -name "*.mp4" -o -name "*.mov" -o -name "*.webm" -o -name "*.avi" -o -name "*.mkv" \) | wc -l)
current=0
find "$INPUT_DIR" -type f \( -name "*.mp4" -o -name "*.mov" -o -name "*.webm" -o -name "*.avi" -o -name "*.mkv" \) | while read -r video; do
((current++))
filename=$(basename "$video")
name=$(clean_filename "${filename%.*}")
echo "[$current/$total_files] Processing: $filename"
if ffmpeg -i "$video" \
-vframes 1 \
-f image2 \
-c:v "$FORMAT" \
-quality "$QUALITY" \
-filter:v "scale='min($MAX_WIDTH,iw)':-1" \
-metadata title="" \
"$OUTPUT_DIR/${name}_frame.$FORMAT" 2>/dev/null; then
echo "✓ Success: $OUTPUT_DIR/${name}_frame.$FORMAT"
else
echo "✗ Error processing: $filename"
fi
done
echo "Complete! Processed $total_files videos."
echo "Frames saved in: $OUTPUT_DIR"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment