ffmpeg -ss 30 -t 3 -i input.mp4 \
-vf "fps=10,scale=320:-1:flags=lanczos,split[s0][s1];[s0]palettegen[p];[s1][p]paletteuse" \
-loop 0 output.gif
This example will skip the first 30 seconds (-ss 30) of the input and create a 3 second output (-t 3).
fps filter sets the frame rate. A rate of 10 frames per second is used in the example.
scale filter will resize the output to 320 pixels wide and automatically determine the height while preserving the aspect ratio. The lanczos scaling algorithm is used in this example.
palettegen and paletteuse filters will generate and use a custom palette generated from your input. These filters have many options, so refer to the links for a list of all available options and values. Also see the Advanced options section below.
split filter will allow everything to be done in one command and avoids having to create a temporary PNG file of the palette.
Control looping with -loop output option but the values are confusing. A value of 0 is infinite looping, -1 is no looping, and 1 will loop once meaning it will play twice. So a value of 10 will cause the GIF to play 11 times.
ffmpeg -i clip.mp4 \
-vf "fps=15,scale=480:-1:flags=lanczos,\
drawtext=fontfile=/Library/Fonts/Arial.ttf:\
textfile=subtitles1.txt:reload=1:\
enable='lt(t,1)':\
fontcolor=white@0.8:fontsize=24:\
box=1:boxcolor=black@0.5:\
x=(w-text_w)/2:y=h-(text_h*2),\
drawtext=fontfile=/Library/Fonts/Arial.ttf:\
textfile=subtitles2.txt:reload=1:\
enable='between(t,1,3)':\
fontcolor=white@0.8:fontsize=24:\
box=1:boxcolor=black@0.5:\
x=(w-text_w)/2:y=h-(text_h*2),\
drawtext=fontfile=/Library/Fonts/Arial.ttf:\
textfile=subtitle3.txt:reload=1:\
enable='gte(t,3)':\
fontcolor=white@0.8:fontsize=24:\
box=1:boxcolor=black@0.5:\
x=(w-text_w)/2:y=h-(text_h*2)" \
-loop 0 output.gif
Create .txt files for the subtitles you want to use. (In this case, subtitles1.txt + subtitles2.txt + subtitles3.txt
Note the commands for time after “enable=” (it seems to use “between” at one point)