The code below was used to generate the video countdown timers that are available in the following playlist using ffmpeg:
#This example will create a 3 second video, with 100 frames per second and it will print the elapsed and remaining times using a two second accuracy.
fps=100;
seconds=3;
mantissaDigits=2;
upperFont=600;
lowerFont=100;
ffmpeg -loop 1 -i ~/Pictures/Black-Background.png -c:v libx264 -r $fps -t $seconds -pix_fmt yuv420p -vf "fps=$fps,drawtext=fontfile='/usr/share/fonts/urw-base35/C059-Bold.otf':fontcolor=yellow:fontsize=$upperFont:x=(w-text_w)/2:y=(h-text_h)/2:text='%{eif\:($seconds-t)\:d}.%{eif\:(mod($seconds-t, 1)*pow(10,$mantissaDigits))\:d\:$mantissaDigits}',drawtext=fontfile='/usr/share/fonts/urw-base35/C059-Bold.otf':fontcolor=yellow:fontsize=$lowerFont:x=(w-text_w)/2:y=((h-text_h)/2)+$upperFont:text='Elapsed\: %{eif\:(t)\:d}.%{eif\:(mod(t, 1)*pow(10,$mantissaDigits))\:d\:$mantissaDigits}'" "$seconds seconds countdown timer.mp4";
- We used a single black frame for the background that defined the size of the video frame as well.
- Using the
fps
variable we defined the number of Frames per Second for the video. - The
seconds
variable defined the number of seconds the duration of the video should be. - The
mantissaDigits
variable defines how many decimal digits should be shown after the dot. upperFont
andlowerFont
define the size of the fonts in the upper row and the lower one respectively.- We used the
drawtext
directive twice to write to the frames.
fontfile='/usr/share/fonts/urw-base35/C059-Bold.otf'
defines the font to be used for the text.fontcolor=yellow
defines the color of the font of the text.fontsize=$upperFont
defines the size of the font of the text.x=(w-text_w)/2
defines the X-coordinate of the location for the text on the frame, here we center the text horizontally on the frame.y=(h-text_h)/2
defines the Y-coordinate of the location for the text on the frame, here we center the text vertically on the frame.text='%{eif\:($seconds-t)\:d}.%{eif\:(mod($seconds-t, 1)*pow(10,$mantissaDigits))\:d\:$mantissaDigits}'
We print the remaining seconds for the video to finish with specific decimal digit accuracy.
drawtext=fontfile='/usr/share/fonts/urw-base35/C059-Bold.otf'
defines the font to be used for the text.fontcolor=yellow
defines the color of the font of the text.fontsize=$lowerFont
defines the size of the font of the text.x=(w-text_w)/2
defines the X-coordinate of the location for the text on the frame, here we center the text horizontally on the frame.y=((h-text_h)/2)+$upperFont
defines the Y-coordinate of the location for the text on the frame, here shift the text from the vertical center of the frame.text='Elapsed\: %{eif\:(t)\:d}.%{eif\:(mod(t, 1)*pow(10,$mantissaDigits))\:d\:$mantissaDigits}'
We print the elapsed seconds since the video started with specific decimal digit accuracy.
Source: bytefreaks.net
My ffmpeg code (show time on H:M:S format):
fps=1;
seconds=10800;
mantissaDigits=2;
upperFont=300;
lowerFont=50;
ffmpeg -loop 1 -i /data/111.jpg -c:v libx264 -r $fps -t $seconds -pix_fmt yuv420p -vf "fps=$fps,drawtext=fontfile='/root/.fonts/Fonts/MyriadPro-Bold.otf':fontcolor=yellow:fontsize=$upperFont:x=(w-text_w)/2:y=(h-text_h)/2:text='%{eif\:(mod(($seconds-t)/3600, 60))\:d\:2}\:%{eif\:(mod(($seconds-t)/60, 60))\:d\:2}\:%{eif\:(mod($seconds-t, 60))\:d\:2}',drawtext=fontfile='/root/.fonts/Fonts/MyriadPro-Bold.otf':fontcolor=yellow:fontsize=$lowerFont:x=(w-text_w)/2:y=((h-text_h)/2)+$upperFont:text='Elapsed\: %{pts\:gmtime\:0\:%H\\\\\:%M\\\\\:%S}'" "$seconds seconds countdown timer.mp4"
Is it possible to hold last frame 10 seconds, and show countdown text on video in that 10 seconds same farme?