Skip to content

Instantly share code, notes, and snippets.

@isaactzab
Forked from hubgit/youtube-gif.sh
Created May 29, 2019 20:46
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save isaactzab/af0c8cb6bb3bb0bd0dbbb7188cc44850 to your computer and use it in GitHub Desktop.
Save isaactzab/af0c8cb6bb3bb0bd0dbbb7188cc44850 to your computer and use it in GitHub Desktop.
Convert a section of a YouTube video to an animated GIF
#!/bin/bash
# brew install rtmpdump
# brew install ffmpeg
# brew install youtube-dl
# brew install imagemagick
ID='c5kuYfTCGLg' # YouTube video ID, i.e. https://www.youtube.com/watch?v={ID}
# fetch the video file with youtube-dl
# convert it to MP4 (not really needed, but keeps the filename predictable)
if [ ! -f $ID.mp4 ]; then
youtube-dl --output '%(id)s.%(ext)s' --recode-video mp4 $ID
fi
# convert the video file to GIF with ffmpeg
START='00:00:20.000' # start 20 seconds in
LENGTH='00:00:06.000' # end after 6 seconds
SIZE='400x300' # size of the output GIF
ffmpeg -ss $START -i $ID.mp4 -pix_fmt rgb24 -r 10 -s $SIZE -t $LENGTH $ID-unoptimized.gif
# optimize the GIF with imagemagick
convert -layers Optimize $ID-unoptimized.gif $ID.gif
# credits:
# http://www.commandlinefu.com/commands/view/10002/create-an-animated-gif-from-a-youtube-video
# http://superuser.com/a/436109/106809
You can improve the performance a lot using this line:
ffmpeg -i $(youtube-dl -f 18 --get-url https://www.youtube.com/watch?v=$ID) -ss $START -t $LENGTH -c:v copy -c:a copy $ID.mp4
Instead of:
youtube-dl --output '%(id)s.%(ext)s' --recode-video mp4 $ID
And having defined START and LENGTH variables before this part.
This will avoid downloading and recoding the entire video. For a video of 4 minutes this reduced the time to make the gif from ~80sec to 6sec.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment