Created
May 6, 2025 08:38
-
-
Save okurka12/ab0bb9a70a1486957c64b30b9b916a37 to your computer and use it in GitHub Desktop.
convert mp4 video to gif and optionally remove green background
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/bin/bash | |
# | |
# convert mp4 video to gif and optionally remove green background | |
# | |
# created: early 2025 | |
# ffmpeg version 5.1.6-0+deb12u1 | |
# ImageMagick 6.9.11-60 | |
if [ ! -f "$1" ]; then | |
echo "usage: $0 FILE" | |
echo "...where FILE is a mp4 FILE" | |
exit | |
fi | |
MP4FILE="$1" | |
OUTFILE="output.gif" | |
# extract frames at this framerate | |
FPS=10 | |
# delay after a frame in GIF (example: 5 means 20 FPS) | |
GIF_DELAY=10 | |
REMOVE_GREEN=y | |
# extract frames (-r 20 means 20 FPS) | |
ffmpeg -i "$MP4FILE" -vf "scale=1080:-1:flags=lanczos" -r $FPS intermediate_frames_%04d.png | |
TOTAL=$(ls -1 intermediate_frames_*.png | wc -l) | |
CNT=1 | |
if [ "$REMOVE_GREEN" = "Y" ]; then | |
# remove green (adjust the -fuzz parameter if needed) | |
echo "removing green from pictures..." | |
for frame in intermediate_frames_*.png; do | |
echo "removing green $CNT/$TOTAL" | |
CNT=$(expr $CNT + 1) | |
convert "$frame" -alpha on -channel RGBA -evaluate Multiply 1 -fill none \ | |
-fuzz 30% \ | |
-opaque "#00F000" \ | |
-opaque "#00F100" \ | |
-opaque "#00F200" \ | |
-opaque "#00F300" \ | |
-opaque "#00F400" \ | |
-opaque "#00F500" \ | |
-opaque "#00F600" \ | |
-opaque "#00F700" \ | |
-opaque "#00F800" \ | |
-opaque "#00F900" \ | |
-opaque "#00FA00" \ | |
-opaque "#00FB00" \ | |
-opaque "#00FC00" \ | |
-opaque "#00FE00" \ | |
-opaque "#00FF00" \ | |
"$frame" | |
done | |
fi # if REMOVE_GREEN = y | |
# put frames to gif | |
# -delay centiseconds display the next image after pausing | |
# convert -delay 10 -loop 0 intermediate_frames_*.png output.gif | |
echo "merging frames into a gif..." | |
convert \ | |
-background none \ | |
-alpha on \ | |
-delay $GIF_DELAY \ | |
-loop 0 \ | |
-dispose Background \ | |
intermediate_frames_*.png \ | |
output.gif | |
# -layers OptimizeTransparency \ | |
# -layers RemoveDups \ | |
# -layers RemoveZero \ | |
echo "saved in $OUTFILE" | |
du -h "$OUTFILE" | |
# remove frames | |
rm intermediate_frames_*.png |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment