web-dev-qa-db-fra.com

Comment obtenir la durée d'une vidéo en Python?

J'ai besoin de connaître la durée de la vidéo en Python. Les formats vidéo dont j'ai besoin sont: MP4 , vidéo Flash, AVI , et MOV ... J'ai une solution d'hébergement partagé, je n'ai donc aucun support/ FFmpeg .

26
eos87

Vous aurez probablement besoin d'appeler un programme externe. ffprobe peut vous fournir cette information:

import subprocess

def getLength(filename):
  result = subprocess.Popen(["ffprobe", filename],
    stdout = subprocess.PIPE, stderr = subprocess.STDOUT)
  return [x for x in result.stdout.readlines() if "Duration" in x]

Pour rendre les choses un peu plus faciles, les codes suivants placent la sortie dansJSON.

Vous pouvez l'utiliser en utilisant probe(filename) ou obtenir la durée en utilisant duration(filename):

json_info     = probe(filename)
secondes_dot_ = duration(filename) # float number of seconds

Cela fonctionne sur Ubuntu 14.04 où bien sûr ffprobe est installé. Le code n'est pas optimisé pour la vitesse ou de belles choses, mais cela fonctionne sur ma machine, espérons que cela aide.

#
# Command line use of 'ffprobe':
#
# ffprobe -loglevel quiet -print_format json \
#         -show_format    -show_streams \
#         video-file-name.mp4
#
# man ffprobe # for more information about ffprobe
#

import subprocess32 as sp
import json


def probe(vid_file_path):
    ''' Give a json from ffprobe command line

    @vid_file_path : The absolute (full) path of the video file, string.
    '''
    if type(vid_file_path) != str:
        raise Exception('Gvie ffprobe a full file path of the video')
        return

    command = ["ffprobe",
            "-loglevel",  "quiet",
            "-print_format", "json",
             "-show_format",
             "-show_streams",
             vid_file_path
             ]

    pipe = sp.Popen(command, stdout=sp.PIPE, stderr=sp.STDOUT)
    out, err = pipe.communicate()
    return json.loads(out)


def duration(vid_file_path):
    ''' Video's duration in seconds, return a float number
    '''
    _json = probe(vid_file_path)

    if 'format' in _json:
        if 'duration' in _json['format']:
            return float(_json['format']['duration'])

    if 'streams' in _json:
        # commonly stream 0 is the video
        for s in _json['streams']:
            if 'duration' in s:
                return float(s['duration'])

    # if everything didn't happen,
    # we got here because no single 'return' in the above happen.
    raise Exception('I found no duration')
    #return None


if __== "__main__":
    video_file_path = "/tmp/tt1.mp4"
    duration(video_file_path) # 10.008
16
Andrew_1510

Comme indiqué ici https://www.reddit.com/r/moviepy/comments/2bsnrq/is_it_possible_to_get_the_length_of_a_video/

vous pouvez utiliser le module moviepy 

from moviepy.editor import VideoFileClip
clip = VideoFileClip("my_video.mp4")
print( clip.duration )
10
mobcdi

Trouvez cette nouvelle bibliothèque python: https://github.com/sbraz/pymediainfo

Pour obtenir la durée:

from pymediainfo import MediaInfo
media_info = MediaInfo.parse('my_video_file.mov')
#duration in milliseconds
duration_in_ms = media_info.tracks[0].duration

Le code ci-dessus est testé par rapport à un fichier mp4 valide et fonctionne, mais vous devez effectuer davantage de contrôles, car il dépend fortement de la sortie de MediaInfo.

5
chenyi1976
from subprocess import check_output

file_name = "movie.mp4"

#For Windows
a = str(check_output('ffprobe -i  "'+file_name+'" 2>&1 |findstr "Duration"',Shell=True)) 

#For Linux
#a = str(check_output('ffprobe -i  "'+file_name+'" 2>&1 |grep "Duration"',Shell=True)) 

a = a.split(",")[0].split("Duration:")[1].strip()

h, m, s = a.split(':')
duration = int(h) * 3600 + int(m) * 60 + float(s)

print(duration)
4
DeWil

Une fonction que je suis venu avec. Ceci utilise fondamentalement uniquement les arguments ffprobe

from subprocess import  check_output, CalledProcessError, STDOUT 


def getDuration(filename):

    command = [
        'ffprobe', 
        '-v', 
        'error', 
        '-show_entries', 
        'format=duration', 
        '-of', 
        'default=noprint_wrappers=1:nokey=1', 
        filename
      ]

    try:
        output = check_output( command, stderr=STDOUT ).decode()
    except CalledProcessError as e:
        output = e.output.decode()

    return output


fn = '/app/648c89e8-d31f-4164-a1af-034g0191348b.mp4'
print( getDuration(  fn ) )

Durée de sortie comme ceci:

7.338000
1
sr9yar

pour ceux qui aiment utiliser le programme mediainfo :

import json
import subprocess

#===============================
def getMediaInfo(mediafile):
    cmd = "mediainfo --Output=JSON %s"%(mediafile)
    proc = subprocess.Popen(cmd, Shell=True,
        stderr=subprocess.PIPE, stdout=subprocess.PIPE)
    stdout, stderr = proc.communicate()
    data = json.loads(stdout)
    return data

#===============================
def getDuration(mediafile):
    data = getMediaInfo(mediafile)
    duration = float(data['media']['track'][0]['Duration'])
    return duration
0
vossman77

Ouvrez le terminal cmd et installez le paquet python: mutagen en utilisant cette commande 

python -m pip install mutagen

puis utilisez ce code pour obtenir la durée de la vidéo et sa taille:

import os
from mutagen.mp4 import MP4

audio = MP4("filePath")

print(audio.info.length)
print(os.path.getsize("filePath"))
0
Omar Ali