Logo Espacio Linux Paypal - Acepta pagos con tarjeta en tu negocio      
Portada Manuales Linux Descargas Foros Buscar Mapa del sitio Ayuda BlogEL
   Iniciar sesión | Registrarse    
 
Principal

Patrocinadores

Anuncios



Boletín Espacio Linux
Las novedades del sitio y el mundo Linux en tu email.


Sitios amigos

Blogs de miembros


Directorio de blogs | Registrarse
Los usuario registrados pueden crear su propio blog y escribir comentarios.

Script para hacer un video con imágenes jpg


Por: zeka
Publicado el: 10-26-2007 @ 06:01 pm


Si se nos ocurre la idea de hacer un video con las imágenes que hemos tomado en nuestras vacaciones, esto puede ser hecho a través de un script que incluya el comando mencoder. Como siempre, para instalarlo en Debian:

aptitude install mencoder

Aquí deberiamos saber algunas cosas relativas a la imagen y al número de ellas que se proyectarán por segundo en el video. Si no tenemos idea de ello lo más sencillo es abrir uno con Avidemux e ir a Archivo -> Properties. Tal como se presenta en la imagen, un ejemplo válido sería 720x480 para el tamaño de imagen y de 29,97 fps para el Frame Rate.

Si nuestra imagen no tiene esa geometría (formato) la escalamos con el gimp o empleamos un script destinado para ello. Por otra parte, el Frame Rate señala el número de imágenes que se proyectarán por segundo. En este caso, si queremos proyectar nuestra imagen por 3 segundos necesitamos entonces 90 copias de ella.

El script que presentamos a continuación permite copiar una imagen de geometría 720x480 las veces que se quiera en un folder contenedor transitorio denominado carpeta y, desde allí, construir automáticamente el video *.avi a 29,97 fps. En la etapa final todas las imágenes en carpeta se borran para no ocupar espacio innecesariamente. El video, nombre_base_archivo.avi, se graba en el directorio donde se encuentra alojado el script.

#!/bin/bash
echo -n "nombre archivo a copiar? = "
read archivo
echo -n "numero de copias? ="
read j
for archivo in *.jpg
do
base=`basename "$archivo" .jpg`
done
while [ "$i" != $j ]
do
let "i = i + 1"
cp $archivo carpeta/$base"$i"".jpg"
done
mencoder 'mf://carpeta//*.jpg' -mf w=720:h=480:fps=29.97:type=jpg -of avi -ovc lavc -oac mp3lame -o $base".avi"
rm carpeta/*

Para hacer funcionar el script es necesario darle permisos de ejecución:

chmod +x videoavi

y ejecutarlo con:

./videoavi

No obstante, es importante manifestar que en el lugar donde alojemos el script hay que crear tambien el directorio carpeta que almacenará transitoriamente las múltiples imágenes que constituirán el video. Este script acelera considerablemente el proceso cuando se compara con el procedimiento delineado en este otro artículo:

Como hacer un video con imágenes jpg

Aquí tenemos una imagen que ejemplifica el uso del script:

El video estático producido dura poco más de 3 segundos con la incorporación de 100 frames a 29,97 fps.

Finalmente, reformulé el script anterior para ganar en rapidez. Este fue el resultado:

#!/bin/bash
for archivo in *.jpg
do
j=100
base=`basename "$archivo" .jpg`
while [ "$i" != $j ]
do
let "i = i + 1"
cp $archivo carpeta/$base"$i"".jpg"
done
let "i=0"
mencoder 'mf://carpeta//*.jpg' -mf w=720:h=480:fps=29.97:type=jpg -of avi -ovc lavc -oac mp3lame -o videos_imagenes/$base".avi"
rm carpeta/*.jpg
mv $base".jpg" imagenes/
done

En las imágenes que presento a continuación hago una breve reseña de como opera. La imagen siguiente presenta 5 ventanas abiertas. La primera corresponde a video_estatico_avi que es la que contiene el guión, la segunda es salida que contiene la imágenes que fueron formateadas masivamente por el script resize. Las tres últimas corresponden, respectivamente, a imagenes (almacena aquellas imágenes que se van procesando desde salida), videos_imagenes (almacena los pequeños videos de poco más de 3 segundos generados) y la cónsola donde se ejecuta el script. Desde salida se arrastra la imagen hacia video_estatico_avi, nos dirigimos a la cónsola donde modificamos levemente el nombre de la imagen y al pulsar [Enter] (como por ejemplo en time ./videoavi nombre.jpg) obtenemos automáticamente lo siguiente:

  1. Generación del minivideo en videos_imagenes.
  2. Movimiento de la imagen procesada a imagenes.

En la imagen siguiente podemos verificar como la foto procesada fue efectivamente movida a la carpeta imagenes (evitando la incertidumbre de cuales no han sido procesadas), que aparece el minivideo correspondiente y el tiempo de ejecución del script.

Lo mejor de todo es que el script anterior funciona como un productor masivo de minivideos de 3,3 segundos. Se pueden colocar en el folder contenedor del script todas la imágenes *.jpg de formato 729x480 que se deseen y tendremos con:

./videoavi *.jpg [Enter]

en un tiempo relativamente breve (alrededor de 1 segundo/imagen), todos los minivideos generados en el folder videos_imagenes.

Nota: Va sin garantía.


 



Ultima actualización el 04-21-2008 @ 08:19 pm




Añadir un comentario
Añadir un comentario
Ver más artículos
Ver más artículos

Comentarios

Por: pendulo     Publicado el 10-26-2007 @ 08:54 pm

Hola zeka hay cosas que puedes hacer para generalizar, por ejemplo:
Crear mas variables al comienzo, digamos que w, h, fps y tiempo de video t,
Luego puedes:
Escalar la imagen original con convert así:
convert -resize $wx$h!
Calcular en número de copias necesarias así:
COPIAS`expr $fps * $t`
Finalmente el comando de mencoder te quedaría así:
mencoder "mf://*.jpg" -mf fps=$fps -o filme.avi -ovc lavc -lavcopts vcodec=mpeg4
De esta forma permites al usuario a decidir sobre las dimensiones del cuadro del filme, la razón de cuadros por segundo y el tiempo de reproducción,
Espero no haberme equivocado, pero esa es la idea.
Por: zeka     Publicado el 10-26-2007 @ 09:07 pm

Sé que tienes razón pero como desconozco cuales son los formatos de video válidos me refiero sólo al que conozco: 720x420. Como te habrás dado cuenta he seguido un procedimiento iterativo en el sentido de que a medida de que me doy cuenta de las carencias las incluyo. Con relación a lo de convert ya lo estoy considerando (en realidad serían dos: uno con resize y otro con crop). Como tengo más de 1500 fotos es necesario crear primero el guion para el redimensionamiento masivo (ya lo tengo listo). Luego lo integraría con el guión de este tema para que se haga todo en una sóla fase. Crear 1500 minivideos con 100 imágenes cada uno debe dar aproximadamente una hora y cuarto de duración. Tus recomendaciones las voy a tomar en cuenta.

Saludos
Por: pendulo     Publicado el 10-26-2007 @ 09:41 pm

Estamos pensando en cosas diferentes?, tu estás pensando en hacer microvideos con movimiento partiendo de imágenes diferentes colocadas en un directorio? o una suerte de slideshow en forma de filme con imágenes estáticas de un tiempo breve de exposisión?.
Yo lo que he hecho es crear un vídeo estático desde una sola imagen que fue lo que dio lugar a este asunto tan interesante en el foto, Recuerdas?
Con respecto a convert las dos variantes, tanto -crop como -resize son problemáticas cuando la imagen que quieres usar no coincide en resolución.
crop recorta la imagen por lo que puedes perder parte importante de ella y resize usando ! fuerza la escala y se pierde la proporción, por lo que la imagen resultante puede parecer aplastada o alargada según el caso.
En cada caso particular puede ser mejor uno o el otro.
Por: zeka     Publicado el 10-26-2007 @ 09:55 pm

Estamos pensando lo mismo. Ya hice el script tomando en cuenta lo que tu dices y funciona para mi caso particular (no hay perdida apreciable de calidad ni de parte de la imagen). Ya estoy publicando el artículo correspondiente.

Saludos
Journal ©
 



Copyright | Términos de uso | Política de privacidad | Publicidad | Contáctanos | Blog