2009-11-20 15 views
17

Necesito crear miniaturas para un archivo de video una vez que he cargado a una aplicación de Internet que ejecuta Python.Creación de miniaturas de archivos de video con Python

Cómo voy a hacer esto ... Necesito una biblioteca que básicamente puede hacer esto por mí, o que puede leer los marcos de imagen de archivos de video (de varios formatos) automáticamente.

+1

Ver [esta respuesta] [1] para la forma de hacerlo con Gstreamer y Python. [1]: http://stackoverflow.com/a/16478342/1049318 –

Respuesta

8

una simple combinación de PyMedia y PIL haría el truco para AVI, ASF, MPEG o archivos. PyMedia le permite extraer los marcos (usando la rutina decodificador()), mientras que PIL tiene una rutina simple en miniatura().

+0

muy apreciado. – Alterlife

+0

PyMedia no funciona en Python 3.x ¿tiene otra posible solución? – EduardoMaia

+0

@EduardoMaia En estos días probablemente comenzaría invocando un paquete externo como ffmpeg, o libav en https://libav.org/. –

1

Mire en PythonMagick, una interfaz de Python para ImageMagick. Eso debería tener lo que necesitas. (Negación: No he utilizado la interfaz de Python antes, pero sé ImageMagick es un buen mojo.)

3

Puede usar la API de Youtube para el almacenamiento y la transcodificación, y obtener las miniaturas de las publicaciones de forma gratuita. Honestamente, esa es la forma más fácil de manejar videos en línea y no solo comparto el servicio de un tercero, soy un usuario muy feliz de esa API y de las rutas de video internas que pude eliminar gracias a ella.

10

Puede utilizar ffvideo "umbral"

from ffvideo import VideoStream 
pil_image = VideoStream('0.flv').get_frame_at_sec(5).image() 
pil_image.save('frame5sec.jpeg') 
+0

ffvideo no funciona en python 3.x ¿tiene otra posible solución? – EduardoMaia

0
import cv2 
vcap = cv2.VideoCapture(filename) 
res, im_ar = vcap.read() 
while im_ar.mean() < threshold and res: 
     res, im_ar = vcap.read() 
im_ar = cv2.resize(im_ar, (thumb_widht, thumb_height), 0, 0, cv2.INTER_LINEAR) 
#to save we have two options 
#1) save on a file 
cv2.imwrite(save_on_filename) 
#2)save on a buffer for direct transmission 
res, thumb_buf = cv2.imencode('.png', im_ar) 
# '.jpeg' etc are permitted 
#get the bytes content 
bt = thumb_buf.tostring() 

es un entero. Cuando obtiene un cuadro de video puede ser muy negro, blanco, etc. para obtener una buena miniatura, puede especificar el valor medio de todos los píxeles en el cuadro.

2

No pude instalar ffvideo en OSX Sierra, así que decidí trabajar con ffmpeg.

OSX:

brew install ffmpeg 

Linux:

apt-get install ffmpeg 

Python 3 Código:

import subprocess 
video_input_path = '/your/video.mp4' 
img_output_path = '/your/image.jpg' 
subprocess.call(['ffmpeg', '-i', video_input_path, '-ss', '00:00:00.000', '-vframes', '1', img_output_path]) 
Cuestiones relacionadas