2011-01-26 11 views
7

¿Cómo puede Python hacer un límite simple para un video?Generar programáticamente CAP de imágenes en miniatura para video pequeño

Ideia: tomar instantáneas 9 de 9 veces incluso colocados (en la línea de tiempo), y desplazar entonces en un JGP

¿Cómo debo hacer esto?

¿Es PIL la única manera? (Que no va a ser fácil de hacer lo que quiero, ¿verdad?)

no están allí cualquier módulo (pitón seens tener gran modeles para almoust nada, ¿o me de suerte)

Ejemplo:

Movie lenght = 10 min 
T1= snapshot of 1 min 
T2= snapshot of 2 min 
...... 
T9= snapshot of 9 min 
    | | 
T1| T2| T3 
---+---+--- 
T4| T5| T6 
---+---+--- 
T7| T8| T9 
    | | 

Respuesta

7

se trata de un cambio rápido a algo que he hecho hace algún tiempo, usando ffmpeg para la extracción del marco y PIL para crear la imagen completa pulgares.

import os, sys 
from PIL import Image 

# Use "ffmpeg -i <videofile>" to get total length by parsing the error message 
chout, chin, cherr = os.popen3("ffmpeg -i %s" % sys.argv[1]) 
out = cherr.read() 
dp = out.index("Duration: ") 
duration = out[dp+10:dp+out[dp:].index(",")] 
hh, mm, ss = map(float, duration.split(":")) 
total = (hh*60 + mm)*60 + ss 

# Use "ffmpeg -i <videofile> -ss <start> frame<nn>.png" to extract 9 frames 
for i in xrange(9): 
    t = (i + 1) * total/10 
    os.system("ffmpeg -i %s -ss %0.3fs frame%i.png" % (sys.argv[1], t, i)) 

# Make a full 3x3 image by pasting the snapshots 
full = None 
for y in xrange(3): 
    for x in xrange(3): 
     img = Image.open("frame%i.png" % (y*3+x)) 
     w, h = img.size 
     if full is None: 
      full = Image.new("RGB", (w*3, h*3)) 
     full.paste(img, (x*w, y*h)) 

# Save result 
full.save("thumbs.png") 
+0

Lo probaré esta noche. Vaya, comenta tu código (GRACIAS :)) –

Cuestiones relacionadas