Using ffmpeg to obtain video durations in python

I'd suggest using FFprobe (comes with FFmpeg).

The answer Chamath gave was pretty close, but ultimately failed for me.

Just as a note, I'm using Python 3.5 and 3.6 and this is what worked for me.

import subprocess 

def get_duration(file):
    """Get the duration of a video using ffprobe."""
    cmd = 'ffprobe -i {} -show_entries format=duration -v quiet -of csv="p=0"'.format(file)
    output = subprocess.check_output(
        cmd,
        shell=True, # Let this run in the shell
        stderr=subprocess.STDOUT
    )
    # return round(float(output))  # ugly, but rounds your seconds up or down
    return float(output)

If you want to throw this function into a class and use it in Django (1.8 - 1.11), just change one line and put this function into your class, like so:

def get_duration(file):

to:

def get_duration(self, file):

Note: Using a relative path worked for me locally, but the production server required an absolute path. You can use os.path.abspath(os.path.dirname(file)) to get the path to your video or audio file.


There is no need to iterate though the output of FFprobe. There is one simple command which returns only the duration of the input file:

ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 <input_video>

You can use the following method instead to get the duration:

def get_length(input_video):
    result = subprocess.run(['ffprobe', '-v', 'error', '-show_entries', 'format=duration', '-of', 'default=noprint_wrappers=1:nokey=1', input_video], stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
    return float(result.stdout)