From acf6e86c0fbb93e5c24d4f918a20dbcc6f8f4611 Mon Sep 17 00:00:00 2001 From: biggsbiggsby <33279473+biggsbiggsby@users.noreply.github.com> Date: Tue, 14 Nov 2017 09:39:59 +0100 Subject: [PATCH 1/3] gif animation.jl Change palette from png to gif to avoid png encoding bug in ffmpeg --- src/animation.jl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/animation.jl b/src/animation.jl index 8d3c0341..7faaa579 100644 --- a/src/animation.jl +++ b/src/animation.jl @@ -72,9 +72,9 @@ function buildanimation(animdir::AbstractString, fn::AbstractString, if is_animated_gif # generate a colorpalette first so ffmpeg does not have to guess it - run(`ffmpeg -v 0 -i $(animdir)/%06d.png -vf palettegen -y palette.png`) + run(`ffmpeg -v 0 -i $(animdir)/%06d.png -vf palettegen -y palette.gif`) # then apply the palette to get better results - run(`ffmpeg -v 0 -framerate $fps -loop $loop -i $(animdir)/%06d.png -i palette.png -lavfi paletteuse -y $fn`) + run(`ffmpeg -v 0 -framerate $fps -loop $loop -i $(animdir)/%06d.png -i palette.gif -lavfi paletteuse -y $fn`) else run(`ffmpeg -v 0 -framerate $fps -loop $loop -i $(animdir)/%06d.png -pix_fmt yuv420p -y $fn`) end From cf58f3cbf238152d9a2b6b5199acb345588049dd Mon Sep 17 00:00:00 2001 From: biggsbiggsby <33279473+biggsbiggsby@users.noreply.github.com> Date: Fri, 17 Nov 2017 10:30:23 +0100 Subject: [PATCH 2/3] Update animation.jl Generates a color palette for each frame (instead of each animation) to improve quality, and avoid palette file format issues in FFMPEG 3.4 --- src/animation.jl | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/animation.jl b/src/animation.jl index 7faaa579..760a56d2 100644 --- a/src/animation.jl +++ b/src/animation.jl @@ -71,10 +71,9 @@ function buildanimation(animdir::AbstractString, fn::AbstractString, fn = abspath(fn) if is_animated_gif - # generate a colorpalette first so ffmpeg does not have to guess it - run(`ffmpeg -v 0 -i $(animdir)/%06d.png -vf palettegen -y palette.gif`) - # then apply the palette to get better results - run(`ffmpeg -v 0 -framerate $fps -loop $loop -i $(animdir)/%06d.png -i palette.gif -lavfi paletteuse -y $fn`) + # generate a colorpalette for each frame to improve quality + palette="palettegen=stats_mode=single[pal],[0:v][pal]paletteuse=new=1" + run(`ffmpeg -v 0 -framerate $fps -loop $loop -i $(animdir)/%06d.png -lavfi "$palette" -y $fn`) else run(`ffmpeg -v 0 -framerate $fps -loop $loop -i $(animdir)/%06d.png -pix_fmt yuv420p -y $fn`) end From ee0f4e11ea1d81bbb08c1763c35d858bc105daf1 Mon Sep 17 00:00:00 2001 From: biggsbiggsby <33279473+biggsbiggsby@users.noreply.github.com> Date: Fri, 17 Nov 2017 12:35:36 +0100 Subject: [PATCH 3/3] Update animation.jl Changed palette for each frame to an option, made the default palette a lossless bmp file for best quality/filesize, but still compatible with FFMPEG 3.4 on Win7 x64 --- src/animation.jl | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/src/animation.jl b/src/animation.jl index 760a56d2..93f28427 100644 --- a/src/animation.jl +++ b/src/animation.jl @@ -67,13 +67,21 @@ mp4(anim::Animation, fn = mp4fn(); kw...) = buildanimation(anim.dir, fn, false; function buildanimation(animdir::AbstractString, fn::AbstractString, is_animated_gif::Bool=true; - fps::Integer = 20, loop::Integer = 0) + fps::Integer = 20, loop::Integer = 0, + variable_palette::Bool=false) fn = abspath(fn) if is_animated_gif - # generate a colorpalette for each frame to improve quality - palette="palettegen=stats_mode=single[pal],[0:v][pal]paletteuse=new=1" - run(`ffmpeg -v 0 -framerate $fps -loop $loop -i $(animdir)/%06d.png -lavfi "$palette" -y $fn`) + if variable_palette + # generate a colorpalette for each frame for highest quality, but larger filesize + palette="palettegen=stats_mode=single[pal],[0:v][pal]paletteuse=new=1" + run(`ffmpeg -v 0 -framerate $fps -loop $loop -i $(animdir)/%06d.png -lavfi "$palette" -y $fn`) + else + # generate a colorpalette first so ffmpeg does not have to guess it + run(`ffmpeg -v 0 -i $(animdir)/%06d.png -vf "palettegen=stats_mode=diff" -y "$(animdir)/palette.bmp"`) + # then apply the palette to get better results + run(`ffmpeg -v 0 -framerate $fps -loop $loop -i $(animdir)/%06d.png -i "$(animdir)/palette.bmp" -lavfi "paletteuse=dither=sierra2_4a" -y $fn`) + end else run(`ffmpeg -v 0 -framerate $fps -loop $loop -i $(animdir)/%06d.png -pix_fmt yuv420p -y $fn`) end