Merge pull request #1093 from seefood/ira-gifski
New and improved/enhanced vid-to-gif functionpull/1097/head
commit
08fe18f5a4
|
|
@ -1,34 +1,134 @@
|
|||
cite about-plugin
|
||||
about-plugin 'gif helper functions'
|
||||
about-plugin 'video to gif helper functions'
|
||||
|
||||
# From https://gist.github.com/SlexAxton/4989674#comment-1199058
|
||||
# Requirements (Mac OS X using Homebrew): brew install ffmpeg gifsicle imagemagick
|
||||
function gifify {
|
||||
about 'Converts a .mov file into an into an animated GIF.'
|
||||
# Renamed gifify to v2gif to go avoid clobbering https://github.com/jclem/gifify
|
||||
# Requirements (Mac OS X using Homebrew): brew install ffmpeg giflossy imagemagick
|
||||
# Requirements on Ubuntu: sudo apt install ffmpeg imagemagick ; plus install https://github.com/pornel/giflossy
|
||||
# Optional: if lossy is not important, Ubuntu has gifsicle packaged for apt-get, instead of giflossy
|
||||
# Optional: gifski (from `brew install gifski` or github.com/ImageOptim/gifski)
|
||||
# for high quality huge files.
|
||||
function v2gif {
|
||||
about 'Converts a .mov/.avi/.mp4 file into an into an animated GIF.'
|
||||
group 'gif'
|
||||
param '1: MOV file name'
|
||||
param '2: max width in pixels (optional)'
|
||||
example '$ gifify foo.mov'
|
||||
example '$ gifify foo.mov 600'
|
||||
param '1: MOV/AVI/MP4 file name(s)'
|
||||
param '2: -w <num> ; Optional: max width in pixels'
|
||||
param '3: -l <num> ; Optional: extra lossy level for smaller files (80-200 make sense, needs giflossy instead of gifsicle)'
|
||||
param '4: -h ; Optional: high quality using gifski (installed seperately) - overrides "--lossy" above!'
|
||||
param '5: -d ; Optional: delete the original video file if succeeded'
|
||||
param '6: -t ; Optional: Tag the result with quality stamp for comparison use'
|
||||
param '7: -f <num> ; Optional: Change number of frames per second (default 10)'
|
||||
param '8: -a <num> ; Optional: Alert if resulting file is over <num> kilobytes (default is 5000, 0 turns off)'
|
||||
example '$ v2gif foo.mov'
|
||||
example '$ v2gif foo.mov -w 600'
|
||||
example '$ v2gif -l 100 -d *.mp4'
|
||||
example '$ v2gif -dh *.avi'
|
||||
example '$ v2gif -thw 600 *.avi *.mov'
|
||||
|
||||
if [ -z "$1" ]; then
|
||||
echo "$(tput setaf 1)No input file given. Example: gifify example.mov [max width (pixels)]$(tput sgr 0)"
|
||||
# Parse the options
|
||||
args=$(getopt -l "alert:" -l "lossy:" -l "width:" -l del,delete -l high -l tag -l "fps:" -o "a:l:w:f:dht" -- "$@")
|
||||
|
||||
use_gifski=""
|
||||
del_after=""
|
||||
maxsize=""
|
||||
lossiness=""
|
||||
maxwidthski=""
|
||||
giftagopt=""
|
||||
giftag=""
|
||||
fps=10
|
||||
alert=5000
|
||||
eval set -- "$args"
|
||||
while [ $# -ge 1 ]; do
|
||||
case "$1" in
|
||||
--)
|
||||
# No more options left.
|
||||
shift
|
||||
break
|
||||
;;
|
||||
-d|--del|--delete)
|
||||
# Delete after
|
||||
del_after=true
|
||||
shift
|
||||
;;
|
||||
-h|--high)
|
||||
#High Quality, use gifski
|
||||
use_gifski=true
|
||||
giftag="${giftag}-h"
|
||||
shift
|
||||
;;
|
||||
-w|--width)
|
||||
maxsize="-vf scale=$2:-1"
|
||||
maxwidthski="-W $2"
|
||||
giftag="${giftag}-w$2"
|
||||
shift 2
|
||||
;;
|
||||
-t|--tag)
|
||||
# mark with a quality tag
|
||||
giftagopt="true"
|
||||
shift
|
||||
;;
|
||||
-l|--lossy)
|
||||
# Use giflossy parameter
|
||||
lossiness="--lossy=$2"
|
||||
giftag="${giftag}-l$2"
|
||||
shift 2
|
||||
;;
|
||||
-f|--fps)
|
||||
# select fps
|
||||
fps="$2"
|
||||
giftag="${giftag}-f$2"
|
||||
shift 2
|
||||
;;
|
||||
-a|--alert)
|
||||
# set size alert
|
||||
alert="$2"
|
||||
shift 2
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
# Done Parsing, all that's left are the filenames
|
||||
movies="$*"
|
||||
|
||||
if [[ -z "$movies" ]]; then
|
||||
echo "$(tput setaf 1)No input files given. Example: v2gif file [file...] [-w <max width (pixels)>] [-l <lossy level>] < $(tput sgr 0)"
|
||||
return 1
|
||||
fi
|
||||
|
||||
output_file="${1%.*}.gif"
|
||||
# Prepare the quality tag if requested.
|
||||
[[ -z "$giftag" ]] && giftag="-default"
|
||||
[[ -z "$giftagopt" ]] && giftag=""
|
||||
|
||||
for file in $movies ; do
|
||||
|
||||
output_file="${file%.*}${giftag}.gif"
|
||||
|
||||
echo "$(tput setaf 2)Creating $output_file ...$(tput sgr 0)"
|
||||
|
||||
if [ ! -z "$2" ]; then
|
||||
maxsize="-vf scale=$2:-1"
|
||||
if [[ "$use_gifski" = "true" ]] ; then
|
||||
# I trust @pornel to do his own resizing optimization choices
|
||||
ffmpeg -loglevel panic -i $file -r $fps -vcodec png v2gif-tmp-%05d.png && \
|
||||
gifski $maxwidthski --fps $fps -o $output_file v2gif-tmp-*.png || return 2
|
||||
else
|
||||
maxsize=""
|
||||
ffmpeg -loglevel panic -i $file $maxsize -r $fps -vcodec png v2gif-tmp-%05d.png && \
|
||||
convert +dither -layers Optimize v2gif-tmp-*.png GIF:- | \
|
||||
gifsicle $lossiness --no-warnings --colors 256 --delay=$((100/fps)) --loop --optimize=3 --multifile - > $output_file || return 2
|
||||
fi
|
||||
|
||||
ffmpeg -loglevel panic -i $1 $maxsize -r 10 -vcodec png gifify-tmp-%05d.png
|
||||
convert +dither -layers Optimize gifify-tmp-*.png GIF:- | gifsicle --no-warnings --colors 256 --delay=10 --loop --optimize=3 --multifile - > $output_file
|
||||
rm gifify-tmp-*.png
|
||||
rm v2gif-tmp-*.png
|
||||
|
||||
# Checking if the file is bigger than Twitter likes and warn
|
||||
if [[ $alert -gt 0 ]] ; then
|
||||
out_size=$(wc --bytes < $output_file)
|
||||
if [[ $out_size -gt $(( alert * 1000 )) ]] ; then
|
||||
echo "$(tput setaf 3)Warning: $output_file is $((out_size/1000))kb, keeping $file even if --del requested.$(tput sgr 0)"
|
||||
del_after=""
|
||||
fi
|
||||
fi
|
||||
|
||||
[[ "$del_after" = "true" ]] && rm $file
|
||||
|
||||
done
|
||||
|
||||
echo "$(tput setaf 2)Done.$(tput sgr 0)"
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue