56

Suppose we have a video file some_video.

How can I get its length from a shell script (with mplayer/transcode/gstreamer/vlc/ffmpeg/whatever)?

VIDEO_LENGTH_IN_SECONDS=`ffmpeg .... -i some_video ... | grep -o .....`

4 Answers 4

81
ffprobe -i some_video -show_entries format=duration -v quiet -of csv="p=0"

will return the video duration in seconds.

2
  • 3
    sorry for the dump question, but how to get it in minutes and seconds. Commented Sep 21, 2022 at 18:33
  • 1
    @SalemF also pass -sexagesimal as per: superuser.com/a/1611729/128124 , that gives e.g. 0:00:21.811000. Commented Apr 18, 2024 at 11:01
31

Something similar to:

ffmpeg -i input 2>&1 | grep "Duration"| cut -d ' ' -f 4 | sed s/,//

This will deliver: HH:MM:SS.ms. You can also use ffprobe, which is supplied with most FFmpeg installations:

ffprobe -show_format input | sed -n '/duration/s/.*=//p'

… or:

ffprobe -show_format input | grep duration | sed 's/.*=//')

To convert into seconds (and retain the milliseconds), pipe into:

awk '{ split($1, A, ":"); print 3600*A[1] + 60*A[2] + A[3] }'

To convert it into milliseconds, pipe into:

awk '{ split($1, A, ":"); print 3600000*A[1] + 60000*A[2] + 1000*A[3] }'

If you want just the seconds without the milliseconds, pipe into:

awk '{ split($1, A, ":"); split(A[3], B, "."); print 3600*A[1] + 60*A[2] + B[1] }'

Example:

enter image description here

2
  • Also tcprobe is desiged for it, but it doesn't work well on my system. Commented Nov 25, 2011 at 16:33
  • 1
    ...my edit was rejected, so I'll post here that the first step can be more concisely accomplished with ffprobe, a tool designed for exactly these sort of purposes that is packaged with ffmpeg: ffprobe -show_format input | sed -n '/duration/s/.*=//p' (or ffprobe -show_format input | grep duration | sed 's/.*=//'). Maybe @slhck can edit this straight into the answer. Commented Apr 21, 2013 at 19:20
7
ffprobe -v error -select_streams v:0 -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 movie.mp4

Will return the total duration in seconds. (video+audio) = 124.693091

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

Will return only video duration in seconds stream=duration = 123.256467

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

Will return only video duration using the -sexagesimal format. = 0:02:03.256467

1
  • can I get duration to suite mkvmerge I want it cut until the end of the video, and there is no option on it to know what it ends in time, in this form at HH:MM:SS Commented Dec 29, 2023 at 16:48
0

In case you don't have access to ffprobe, you could use mediainfo.

# Outputs a decimal number in seconds
mediainfo some_video --Output=JSON | jq '.media.track[0].Duration' | tr -d '"'`
3
  • 2
    Eliminate the need for jq and tr: mediainfo --Output="General;%Duration/String%" input Commented Mar 20, 2019 at 17:45
  • Neat! I'm going to leave my answer unedited for now because the output of your command is of the form X s YYY ms versus X.YYY. Easy enough to adjust with | sed -e 's/ s /./' -e 's/ ms//' if you want to go that route and do not have access to jq. Commented Mar 21, 2019 at 4:49
  • 1
    That can be changed with mediainfo --Output="General;%Duration/String3%" input to output 00:01:48.501 instead of 1 min 48 s. Commented Mar 21, 2019 at 16:53

You must log in to answer this question.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.