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

j'ai besoin de la durée de la vidéo en Python. Les formats vidéo que je dois obtenir sont MP4, la vidéo Flash, AVI, et MOV... J'ai un hébergement mutualisé, donc je n'ai aucun FFmpeg assistance.

24
demandé sur Alex L 2010-10-02 08:49:15

7 réponses

vous aurez probablement besoin d'invoquer un programme externe. ffprobe pouvez-vous fournir des informations:

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]
38
répondu SingleNegationElimination 2012-01-14 17:52:43

pour rendre les choses un peu plus faciles, les codes suivants mettent la sortie à 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

Il fonctionne sur Ubuntu 14.04 bien sûr ffprobe installé. Le code n'est pas optimisé pour la vitesse ou de belles fins, mais il fonctionne sur ma machine espère qu'il 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
15
répondu Andrew_1510 2016-04-20 18:05:00

tel que rapporté 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 )
6
répondu mobcdi 2016-06-26 19:22:22

Trouver 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 dépend fortement de la sortie de MediaInfo.

4
répondu chenyi1976 2017-10-02 20:53:08
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)
2
répondu DeWil 2018-08-06 13:51:49

Ouvrir cmd terminal et installer 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
répondu Omar Ali 2018-06-25 11:28:07

pour quelqu'un qui comme l'utilisation de la mediainfo programme:

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
répondu vossman77 2018-07-13 13:31:43