How to get video duration in seconds?

Just use ffprobe directly. No need for sed, grep, etc. There are several "durations" you can acquire (depending on your input).

Format (container) duration

ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 input.mp4

Result:

30.024000

Adding the -sexagesimal option will use the HOURS:MM:SS.MICROSECONDS time unit format:

0:00:30.024000

Video stream duration

If you want the duration of a particular video or audio stream:

ffprobe -v error -select_streams v:0 -show_entries stream=duration -of default=noprint_wrappers=1:nokey=1 input.mp4

Result:

30.000000

The above commands are from FFmpeg Wiki: FFprobe Tips.

With ffmpeg

You can use ffmpeg to get duration by decoding the input:

ffmpeg -i input.mp4 -f null -
…
frame= 1587 fps=0.0 q=0.0 Lsize=N/A time=00:01:03.48 bitrate=N/A

In this example time=00:01:03.48 is the duration.

This may take a long time depending on your input file.


To get minutes, you have to divide 2383 seconds by 60.

39.7167

and then multiply the fractional part .7167 by 60 to get the remaining seconds.

43.002

So it's 39 minutes, 43 seconds. The application appears to be giving you an accurate value.


If you have ffmpeg, you should also have ffprobe:

ffprobe -i input.file -show_format | grep duration
ffprobe -i input.file -show_format -v quiet | sed -n 's/duration=//p'

This will also give fractions of seconds, if that's a problem you can further process that away with sed.