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 .
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
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 )
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.
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)
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
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
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"))