2009-11-20 18 views
17

Ho bisogno di creare miniature per un file video dopo averlo caricato su una webapp che esegue python.Creazione di miniature da file video con Python

Come potrei andare su questo ... Ho bisogno di una libreria che può fondamentalmente o fare questo per me, o che può leggere automaticamente le immagini fuori dai file video (di diversi formati).

+1

Sede [questa risposta] [1] per il modo di farlo con Gstreamer e Python. [1]: http://stackoverflow.com/a/16478342/1049318 –

risposta

8

Una semplice combinazione di PyMedia e PIL farebbe il trucco per i file AVI, ASF o MPEG. PyMedia ti permette di estrarre i frame (usando la routine decoder()), mentre PIL ha una semplice routine thumbnail().

+0

Molto apprezzato. – Alterlife

+0

PyMedia non funziona su python 3.x hai un'altra soluzione possibile? – EduardoMaia

+0

@EduardoMaia In questi giorni probabilmente inizierei invocando un pacchetto esterno come ffmpeg, o libav su https://libav.org/. –

1

Cerca su PythonMagick, un'interfaccia Python su ImageMagick. Questo dovrebbe avere quello che ti serve. (Disclaimer: non ho usato l'interfaccia Python prima, ma so che ImageMagick è buono.)

3

È possibile utilizzare l'API di YouTube per la memorizzazione e la transcodifica e acquisire gratuitamente le miniature dei feed. Onestamente, questo è il modo più semplice per gestire i video online e non sto solo facendo un servizio di terze parti, sono un utente molto felice di quell'API e dei percorsi video interni che sono riuscito a cancellare grazie ad esso.

10

È possibile utilizzare ffvideo

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

ffvideo non funziona su python 3.x hai un'altra soluzione possibile? – 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() 

"soglia" è un numero intero. Quando si ottiene un fotogramma video, può essere molto nero, bianco ecc. Per ottenere una buona miniatura è possibile specificare il valore medio di tutti i pixel nel fotogramma.

2

Non ho potuto installare ffvideo su OSX Sierra, quindi ho deciso di lavorare con ffmpeg.

OSX:

brew install ffmpeg 

Linux:

apt-get install ffmpeg 

Python 3 Codice:

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]) 
Problemi correlati