Created
August 21, 2016 21:46
-
-
Save nathanrosspowell/7535e8045f3dc27be0ffe6707843a818 to your computer and use it in GitHub Desktop.
ffmpeg gif maker
This file contains 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
#!/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