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.
Réponses
Trop de publicités?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)
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 )
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
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.