Obtener la longitud total de los videos en un directorio particular en Python

He descargado un montón de videos de coursera.org y los tengo almacenados en una carpeta en particular. Hay muchos videos individuales en una carpeta en particular (Coursera divide una conferencia en varios videos cortos). Me gustaría tener un script en Python que proporcione la longitud combinada de todos los videos en un directorio en particular. Los archivos de video están en formato .mp4.

Este enlace muestra cómo obtener la longitud de un archivo de video https://stackoverflow.com/a/3844467/735204

Si está utilizando esa función, puede envolverla con algo como

import os for f in os.listdir('.'): print "%s: %s" % (f, getLength(f)) 

Puede que llegue un poco tarde, pero para que las futuras personas no tengan que repetir mi trabajo, aquí está el código que sugiere la respuesta aceptada

 import os import subprocess import json def get_len(filename): result = subprocess.Popen(["ffprobe", filename, '-print_format', 'json', '-show_streams', '-loglevel', 'quiet'], stdout = subprocess.PIPE, stderr = subprocess.STDOUT) return float(json.loads(result.stdout.read())['streams'][0]['duration']) #if you only want total time of all mp4 files in seconds print sum([get_len(x) for x in os.listdir('.') if x.endswith('.mp4')]) #if you want length all files print sum([get_len(x) for x in os.listdir('.')]) 
  1. Descargue MediaInfo e instálelo (no instale el adware incluido)
  2. Vaya a las descargas de origen de MediaInfo y en la fila “Código fuente, todo incluido”, elija el enlace junto a “libmediainfo”
  3. Encuentre MediaInfoDLL3.py en el archivo descargado y extráigalo en cualquier lugar. Ubicación de ejemplo: libmediainfo_0.7.62_AllInclusive.7z\MediaInfoLib\Source\MediaInfoDLL\MediaInfoDLL3.py
  4. Ahora haga un script para probar (fonts abajo) en el mismo directorio.
  5. Ejecutar el script.

MediaInfo también funciona en POSIX. La única diferencia es que se carga un archivo en lugar de un DLL.

Script de prueba (Python 3!)

 import os os.chdir(os.environ["PROGRAMFILES"] + "\\mediainfo") from MediaInfoDLL3 import MediaInfo, Stream MI = MediaInfo() def get_lengths_in_milliseconds_of_directory(prefix): for f in os.listdir(prefix): MI.Open(prefix + f) duration_string = MI.Get(Stream.Video, 0, "Duration") try: duration = int(duration_string) yield duration print("{} is {} milliseconds long".format(f, duration)) except ValueError: print("{} ain't no media file!".format(f)) MI.Close() print(sum(get_lengths_in_milliseconds_of_directory(os.environ["windir"] + "\\Performance\\WinSAT\\" )), "milliseconds of content in total") 

Además de la respuesta anterior de Janus Troelsen, me gustaría señalar un pequeño problema que encontré al implementar su respuesta. Seguí sus instrucciones una por una, pero obtuve resultados diferentes en windows (7) y linux (ubuntu). Sus instrucciones funcionaron perfectamente bajo Linux, pero tuve que hacer un pequeño truco para que funcionara en Windows. Estoy usando un intérprete de python 2.7.2 de 32 bits en Windows, así que utilicé MediaInfoDLL.py. Pero eso no fue suficiente para que funcionara para mí. Estaba recibiendo este error en este punto del proceso:

“WindowsError: [Error 193]% 1 no es una aplicación Win32 válida”.

Esto significaba que de alguna manera estaba usando un recurso que no era de 32 bits, tenía que ser la DLL MediaInfoDLL.py se estaba cargando. Si observa el directorio de instalación de MediaInfo, verá que 3 dlls MediaInfo.dll es de 64 bits, mientras que MediaInfo_i386.dll es de 32 bits. MediaInfo_i386.dll es el que tuve que usar debido a mi configuración de python. Fui a MediaInfoDLL.py (que ya había incluido en mi proyecto) y cambié esta línea:

 MediaInfoDLL_Handler = windll.MediaInfo 

a

 MediaInfoDLL_Handler = WinDLL("C:\Program Files (x86)\MediaInfo\MediaInfo_i386.dll") 

No tuve que cambiar nada para que funcione en Linux.