0

I'm playing with jclem's Gifify bash script as a quick way to make GIFs for documentation. It runs on ffmpeg and ImageMagick and I'm trying to find a way to add a variable to scale the produced GIF so I don't have to go back and add it again. I thought I added the d (resize) variable correctly, but the script fails and just prints the help contents. It does not show my added variable in that help readout. Any ideas?

Update

I solved the problem with printing help contents rather than running the script, but now I'm receiving an error about the -scale parameter.

convert: invalid argument for option `-scale': -vf @ error/convert.c/ConvertImageCommand/2513.

Is this because of my if statement syntax for the scale parameter below?

#!/bin/bash

function printHelpAndExit {
  echo 'Usage:'
  echo '  gifify -conx filename'
  echo ''
  echo 'Options: (all optional)'
  echo '  c CROP:   The x and y crops, from the top left of the image, i.e. 640:480'
  echo '  o OUTPUT: The basename of the file to be output (default "output")'
  echo '  n:        Do not upload the resulting image to CloudApp'
  echo '  r FPS:    Output at this (frame)rate (default 10)'
  echo '  s SPEED:  Output using this speed modifier (default 1)'
  echo '            NOTE: GIFs max out at 100fps depending on platform. For consistency,'
  echo '            ensure that FPSxSPEED is not > ~60!'
  echo '  x:        Remove the original file and resulting .gif once the script is complete'
  echo '  d SCALE:  Scales GIF image to specified dimensions (default no scale)'
  echo ''
  echo 'Example:'
  echo '  gifify -c 240:80 -o my-gif -x my-movie.mov'
  exit $1
}

noupload=0
fps=10
speed=1

OPTERR=0

while getopts "c:o:r:s:d:nx" opt; do
  case $opt in
    c) crop=$OPTARG;;
    h) printHelpAndExit 0;;
    o) output=$OPTARG;;
    n) noupload=1;;
    r) fps=$OPTARG;;
    s) speed=$OPTARG;;
    x) cleanup=1;;
    d) scale=$OPTARG;;
    *) printHelpAndExit 1;;
  esac
done

shift $(( OPTIND - 1 ))

filename=$1

if [ -z ${output} ]; then
  output=$filename
fi

if [ -z $filename ]; then printHelpAndExit 1; fi

if [ $crop ]; then
  crop="-vf crop=${crop}:0:0"
else
  crop=
fi

if [ $scale ]; then
  scale="-vf scale=${scale}:0:0"
else
  scale=
fi

# -delay uses time per tick (a tick defaults to 1/100 of a second)
# so 60fps == -delay 1.666666 which is rounded to 2 because convert
# apparently stores this as an integer. To animate faster than 60fps,
# you must drop frames, meaning you must specify a lower -r. This is
# due to the GIF format as well as GIF renderers that cap frame delays
# < 3 to 3 or sometimes 10. Source:
# http://humpy77.deviantart.com/journal/Frame-Delay-Times-for-Animated-GIFs-214150546
echo 'Exporting movie...'
delay=$(bc -l <<< "100/$fps/$speed")
temp=$(mktemp /tmp/tempfile.XXXXXXXXX)

ffmpeg -loglevel panic -i $filename $crop -r $fps -f image2pipe -vcodec ppm - >> $temp

echo 'Making gif...'
cat $temp | convert +dither -layers Optimize -delay $delay -scale $scale - ${output}.gif

if [ $noupload -ne 1 ]; then
  open -a Cloud ${output}.gif

  echo `pbpaste`

  if [ $cleanup ]; then
    rm $filename
    rm ${output}.gif
  fi
else
  echo ${output}.gif
fi
6
  • 1
    What's the actual parse error message? Commented Jun 17, 2014 at 17:49
  • @konsolebox I figured that out...the r variable was already assigned, so adding a second was causing the script to fail. Question is updated above. Commented Jun 17, 2014 at 18:03
  • It sounds like you're running the original file instead of your updated copy. Commented Jun 17, 2014 at 18:12
  • I shouldn't need to remap if I'm editing that original file, though, correct? Commented Jun 17, 2014 at 18:14
  • @BrianBennett I'm not having problem letting your script parse -d option. My guess is that if it's not an actual command syntax problem, perhaps you're running the script with a shell that's not bash. How about bash yourscript.sh ...? Commented Jun 17, 2014 at 18:35

1 Answer 1

2

You're calling convert with $scale="-vf scale...", which is actually an ffmpeg video filter definition.

Either scale in ffmpeg (with a -vf scale).

Or use convert to scale.

Sign up to request clarification or add additional context in comments.

1 Comment

The mistake was actually down in the ffmpeg call, not in the if statement, but your answer helped me find that. Thanks.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.