Usando ffmpeg para obtener duraciones de video en python

He instalado ffprobe utilizando el comando pip ffprobe en mi PC, e instalé ffmpeg desde aquí .

Sin embargo, todavía tengo problemas para ejecutar el código que se muestra aquí .

Intento usar el siguiente código sin éxito.

SyntaxError: carácter no ASCII ‘\ xe2’ en el archivo GetVideoDurations.py en la línea 12, pero sin encoding declarada; vea http://python.org/dev/peps/pep-0263/ para más detalles

¿Alguien sabe lo que está mal? ¿No estoy haciendo referencia a los directorios correctamente? ¿Debo asegurarme de que los archivos .py y de video estén en una ubicación específica?

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] fileToWorkWith = ‪'C:\Users\PC\Desktop\Video.mkv' getLength(fileToWorkWith) 

Disculpas si la pregunta es algo básica. Todo lo que necesito es poder iterar sobre un grupo de archivos de video y obtener su hora de inicio y finalización.

¡Gracias!

No hay necesidad de iterar a través de la salida de FFprobe . Hay un comando simple que resulta solo la duración del archivo de entrada.

 ffprobe -i input_audio -show_entries format=duration -v quiet -of csv="p=0" 

Puedes usar el siguiente método para obtener la duración.

 def getLength(input_video): result = subprocess.Popen('ffprobe -i input_video -show_entries format=duration -v quiet -of csv="p=0"', stdout=subprocess.PIPE,stderr=subprocess.STDOUT) output = result.communicate() return output[0] 

También debe proporcionar la ruta absoluta a cada uno de sus archivos.

¡Espero que esto ayude!

Yo sugeriría usar FFprobe (viene con FFmpeg).

La respuesta que dio Chamath fue bastante cercana, pero finalmente falló para mí.

Solo como una nota, estoy usando Python 3.5 y 3.6 y esto es lo que funcionó para mí.

 import subprocess def get_duration(file): """Get the duration of a video using ffprobe.""" cmd = 'ffprobe -i {} -show_entries format=duration -v quiet -of csv="p=0"'.format(file) output = subprocess.check_output( cmd, shell=True, # Let this run in the shell stderr=subprocess.STDOUT ) # return round(float(output)) # ugly, but rounds your seconds up or down return float(output) 

Si desea incluir esta función en una clase y usarla en Django (1.8 – 1.11), simplemente cambie una línea y ponga esta función en su clase, así:

 def get_duration(file): 

a:

 def get_duration(self, file): 

Nota: el uso de una ruta relativa me funcionó localmente, pero el servidor de producción requería una ruta absoluta. Puede usar os.path.abspath(os.path.dirname(file)) para obtener la ruta a su video o archivo de audio.

Creo que el segundo comentario de Chamath responde a la pregunta: tienes un personaje extraño en algún lugar de tu script, ya sea porque estás usando un `en lugar de un ‘o tienes una palabra con acentos que no están en inglés, algo como esto.

Como observación, por lo que está haciendo, también puede probar MoviePy, que analiza la salida ffmpeg como lo hace (pero quizás en el futuro use el método ffprobe de Chamath para que se vea más limpio):

 import moviepy.editor as mp duration = mp.VideoFileClip("my_video.mp4").duration 

También podemos usar ffmpeg para obtener la duración de cualquier archivo de video o audio.

Para instalar ffmpeg sigue este enlace.

 import subprocess import re process = subprocess.Popen(['ffmpeg', '-i', path_of_video_file], stdout=subprocess.PIPE, stderr=subprocess.STDOUT) stdout, stderr = process.communicate() matches = re.search(r"Duration:\s{1}(?P\d+?):(?P\d+?):(?P\d+\.\d+?),", stdout, re.DOTALL).groupdict() print matches['hours'] print matches['minutes'] print matches['seconds'] 

Código Python

  cmnd = ['/root/bin/ffmpeg', '-i', videopath] process = subprocess.Popen(cmnd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) stdout, stderr = process.communicate() #This matches regex to get the time in H:M:S format matches = re.search(r"Duration:\s{1}(?P\d+?):(?P\d+?):(?P\d+\.\d+?),", stdout, re.DOTALL).groupdict() t_hour = matches['hours'] t_min = matches['minutes'] t_sec = matches['seconds'] t_hour_sec = int(t_hour) * 3600 t_min_sec = int(t_min) * 60 t_s_sec = int(round(float(t_sec))) total_sec = t_hour_sec + t_min_sec + t_s_sec #This matches1 is to get the frame rate of a video matches1 = re.search(r'(\d+) fps', stdout) frame_rate = matches1.group(0) // This will give 20fps frame_rate = matches1.group(1) //It will give 20  

¿Has intentado añadir la encoding? Ese error es típico de eso, como dijo Chamath. Agregue la encoding utf-8 a su encabezado de script:

 #!/usr/bin/env python # -*- coding: utf-8 -*-