70 votes

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

J'ai besoin d'obtenir la durée de la vidéo en Python. Les formats vidéo que j'ai besoin d'obtenir sont MP4 , Flash video, AVI et MOV... J'ai une solution d'hébergement mutualisé, donc je n'ai pas de support FFmpeg.

81voto

IfLoop Points 59461

Vous pouvez utiliser la commande externe ffprobe pour cela. Plus précisément, exécutez cette commande bash à partir du wiki FFmpeg :

 import subprocess

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

38voto

mobcdi Points 376

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 )

17voto

Andrew_1510 Points 2028

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

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 installé. Le code n'est pas optimisé pour la vitesse ou à des fins esthétiques, mais il fonctionne sur ma machine en espérant 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 __name__ == "__main__":
    video_file_path = "/tmp/tt1.mp4"
    duration(video_file_path) # 10.008

16voto

chenyi1976 Points 643

Retrouvez 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 devriez faire plus de vérifications car il repose fortement sur la sortie de MediaInfo.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X