Get length of a video using regex and ffmpeg

19,057

Solution 1

You can use the shell

$ ff=$(ffmpeg -i video.mp4 2>&1)
$ d="${ff#*Duration: }"
$ echo "${d%%,*}"

Solution 2

This way you get the duration in seconds. I think this is more convenient.

ffprobe -loglevel error -show_streams inputFile.mp3 | grep duration | cut -f2 -d=

ffprobe comes with ffmpeg so you should have it.


EDIT: For a more dedicated version you could use for example

ffprobe -loglevel error -show_format -show_streams inputFile.extension -print_format json

Instead of JSON you could also use e.g. CSV or XML. For more output options look here http://ffmpeg.org/ffprobe.html#Writers

Solution 3

Do you want to do this in a bare shell pipeline, or read the result in a calling program?

/\s+Duration: ((\d\d):(\d\d):(\d\d)\.(\d+))/

… is a PCRE that will split the result up (replace the \. with [;:.] if ffmpeg might output the duration in frames rather than fractional seconds). In a Unix pipeline:

| grep Duration: | cut -f2- -d: | cut -f1 -d, | tr -d ' '

There are of course a billion other ways to express this.

Solution 4

Format (container) duration:

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

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

0:00:30.024000

Duration of the first video stream:

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

https://trac.ffmpeg.org/wiki/FFprobeTips#Duration

Solution 5

Duration: (\d\d):(\d\d):(\d\d(\.\d\d)?)

should work. Whatever your language's $1 is will be the hours, $2 will be the minutes, $3 will be the seconds, and $4 will be just the centiseconds if they are exist.

Share:
19,057

Related videos on Youtube

David542
Author by

David542

Updated on June 04, 2022

Comments

  • David542
    David542 about 2 years

    From the following ffmpeg -i output, how would I get the length (00:35)--

    $ ffmpeg -i 1video.mp4
    
    Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '/Users/david/Desktop/1video.mp4':
      Metadata:
        major_brand     : isom
        minor_version   : 1
        compatible_brands: isomavc1
         creation_time   : 2010-01-24 00:55:16
      Duration: 00:00:35.08, start: 0.000000, bitrate: 354 kb/s
        Stream #0.0(und): Video: h264 (High), yuv420p, 640x360 [PAR 1:1 DAR 16:9], 597 kb/s, 25 fps, 25 tbr, 25k tbn, 50 tbc
        Metadata:
          creation_time   : 2010-01-24 00:55:16
        Stream #0.1(und): Audio: aac, 44100 Hz, stereo, s16, 109 kb/s
        Metadata:
          creation_time   : 2010-01-24 00:55:17
    At least one output file must be specified
    
    • Kerrek SB
      Kerrek SB almost 13 years
      Why have you decided that you must use a regular expression? It looks like a simple string search (or on the shell, a combination of grep and cut) will do fine.
  • thevoipman
    thevoipman over 11 years
    say result is: 00:00:34.03 - how do we make this show in seconds... even if it's 01:34:03 - how can we make this show the total amount of seconds
  • Tyler
    Tyler over 9 years
    You can add up all durations in the current directory with this bash one-liner: for f in *; do (ffprobe -loglevel error -show_streams $f | grep duration | head -1 | cut -f2 -d=); done | awk '{ s += $1 } END { print s / 60 " minutes" }'