Skip to content

Instantly share code, notes, and snippets.

@cknd
Last active March 25, 2025 17:30
Show Gist options
  • Save cknd/c61f841040884759e54ef4a9cc398604 to your computer and use it in GitHub Desktop.
Save cknd/c61f841040884759e54ef4a9cc398604 to your computer and use it in GitHub Desktop.
magic ffmpeg calls
# pack a bunch of images into a nice-looking gif running at 5 fps (with rescaling and a proper color palette)
ffmpeg -f image2 -r 5 -i %*.png -vf "scale=450:-1,split[s0][s1];[s0]palettegen[p];[s1][p]paletteuse" out.gif
# convert section of video to gif (with palette, rescale and slowdown)
ffmpeg -ss 00:00:43 -to 00:00:49.5 -i input.mp4 -r 15 -vf "scale=300:-1,split[s0][s1];[s0]palettegen[p];[s1][p]paletteuse,setpts=2.0*PTS" out.gif
# shrink a video (half the size and _slightly_ lower quality)
ffmpeg -i input.mp4 -vf scale="iw/2:ih/2" -crf 30 output.mp4
#!/usr/bin/env bash
# Re-compress a whole folder of videos to some maximum size
#
# Usage:
# ./multi_ffmpeg.sh /path/to/folder/of/videos
#
# Output is written to new folder /path/to/folder/of/videos_encoded
#
set -e
MAX_PIXELS=1440 # max pixels on the longest side of the video. larger videos will be shrunk, smaller ones stay small.
CRF=22 # bigger number = more compression. https://trac.ffmpeg.org/wiki/Encode/H.264#a1.ChooseaCRFvalue
INPUT_DIR="$1"
[ -z "$INPUT_DIR" ] && { echo "Usage: $0 /path/to/folder"; exit 1; }
OUTPUT_DIR="${INPUT_DIR}_encoded"
mkdir -p "$OUTPUT_DIR"
for file in "$INPUT_DIR"/*; do
[ -f "$file" ] || continue
base="$(basename "$file")"
base_no_ext="${base%.*}"
out="$OUTPUT_DIR/${base_no_ext}.mp4"
echo "Processing $file -> $out"
# re-encode with
# - scale of the largest side <= MAX_PIXELS
# - pixel format yuv420p because not every player understands yuv444
# - something something for audio
ffmpeg -i "$file" \
-vf "scale='if(gte(iw,ih),min(iw,$MAX_PIXELS),-2)':'if(gte(ih,iw),min(ih,$MAX_PIXELS),-2)'" \
-c:v libx264 \
-pix_fmt yuv420p \
-crf $CRF \
-c:a aac -b:a 128k \
-y "$out"
done
echo "All done! Encoded files are in: $OUTPUT_DIR"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment