write videocapture read guardar grabar and python video

videocapture - show video opencv python



¿Cómo obtener la duración de un video en Python? (7)

Necesito obtener la duración del video en Python. Los formatos de video que necesito obtener son MP4 , Flash video, AVI y MOV ... Tengo una solución de alojamiento compartido, por lo que no tengo soporte para FFmpeg .


Abra el terminal cmd e instale el paquete python: mutagen usando este comando

python -m pip install mutagen

luego usa este código para obtener la duración del video y su tamaño:

import os from mutagen.mp4 import MP4 audio = MP4("filePath") print(audio.info.length) print(os.path.getsize("filePath"))



Encuentre esta nueva biblioteca de Python: https://github.com/sbraz/pymediainfo

Para obtener la duración:

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

El código anterior se prueba con un archivo mp4 válido y funciona, pero debe hacer más comprobaciones, ya que depende en gran medida de la salida de MediaInfo.


Para hacer las cosas un poco más fáciles, los siguientes códigos ponen el resultado en JSON .

Puede usarlo usando probe(filename) u obtener duración usando duration(filename) :

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

Funciona en Ubuntu 14.04 donde, por supuesto, ffprobe instalado. El código no está optimizado para la velocidad o propósitos hermosos, pero funciona en mi máquina espero que ayude.

# # 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


para cualquiera que le guste usar el programa 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


Probablemente necesites invocar un programa externo. ffprobe puede proporcionarle esa información:

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]


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)