Skip to content

Instantly share code, notes, and snippets.

@nathanrosspowell
Created August 21, 2016 21: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 nathanrosspowell/7535e8045f3dc27be0ffe6707843a818 to your computer and use it in GitHub Desktop.
Save nathanrosspowell/7535e8045f3dc27be0ffe6707843a818 to your computer and use it in GitHub Desktop.
ffmpeg gif maker
#!/usr/bin/env python
from os import walk, chdir, mkdir
from os.path import join, splitext
from subprocess import call
from shutil import copyfile, rmtree
from random import seed, randint
from uuid import uuid4
# Batches ffmpeg commands to make GIFs.
# Install https://ffmpeg.org/
# http://blog.pkh.me/p/21-high-quality-gif-with-ffmpeg.html
def make_gif(folder):
# Unique temp dir
temp_dir = join(src_dir, "gmtemp-{}".format(uuid4()))
# Get all images
file_data = []
# Load each file into a list
for root, dirs, filenames in walk(src_dir):
for filename in filenames:
if filename.lower().endswith(".jpg"):
name, ext = splitext(filename)
file_data.append(join(src_dir, filename))
break
# Move into a temp directory.
try:
mkdir(temp_dir)
except:
pass
chdir(temp_dir)
# Make smaller images.
name_index = 0
for data in file_data:
cmd = "ffmpeg -y -v warning -i {} -vf scale=600:-1 {:03d}.png".format(
data, name_index)
print("---->", cmd)
call(cmd)
name_index += 1
# Make movie.
cmd = "ffmpeg -y -v warning -framerate 11 -i %03d.png -c:v libx264 -r 30 -pix_fmt yuv420p out.mp4"
print("---->", cmd)
call(cmd)
# Make gif.
palette = "palette.png"
filters = "fps=11,scale=600:-1:flags=lanczos"
cmd = "ffmpeg -y -v warning -i out.mp4 -vf \"{},palettegen\" -y {}".format(
filters, palette)
print("---->", cmd)
call(cmd)
cmd = "ffmpeg -y -v warning -i out.mp4 -i {} -lavfi \"{} [x]; [x][1:v] paletteuse\" -y final.gif".format(
palette, filters)
print("---->", cmd)
call(cmd)
# Move back gif.
copyfile("final.gif", join(src_dir, "final.gif"))
# Nuke the temp dir.
chdir(src_dir)
#rmtree(temp_dir)
if __name__ == "__main__":
src_dir = "C:\\Users\\Nathan\\Desktop\\bou" # test
make_gif(src_dir)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment