domingo, 13 de junio de 2010

Definición y Limpieza

Y no hablo de la RAE, con su peculiar eslogan "Limpia, fija y da esplendor", aunque pudiera parecerlo, sino de unos arreglos que he hecho en los scripts del otro día.


Recordemos:

El otro día presenté dos scripts relacionados con los Stop Motions, Time Lapses y en definitiva, todo lo que implique hacer un vídeo fotograma a fotograma. Los scripts eran los siguientes:

  • RAW2Avi: Pasaba de unos archivos de imagen en bruto ".NEF" a vídeo, utilizando mencoder.

Las Mejoras

Barra de progreso del script NEF2Vid


El script HDRClipMaker no lo he tocado, puesto que es más lento y me parece menos útil que RAW2Avi. RAW2Avi ha pasado a ser NEF2Vid, y entre las mejoras incluye:
  • Más limpieza: Se ha quitado la morralla del script y ahora va más "al grano".
  • Más inteligente: Ahora deduce parámetros que antes requería que el usuario introdujese (como, por ejemplo, los números identificativos del primer y último fotograma*).
  • Más cómodo: Al tener un sencillo entorno gráfico basado en zenity y deducir casi todos los parámetros que necesita, no es necesario ejecutarlo por consola, se puede ejecutar haciendo "doble click".
  • Más opciones: Mientras antes sólo hacía un tipo de vídeo, ahora  como "input" sólo tiene un sencillo selector de "perfiles de vídeo" gráfico, dándote la opción de elegir entre tres formatos de vídeo de diferentes calidades (fácilmente editable para añadir al selector otros perfiles interesantes de manera trivial).
Selector gráfico de perfiles de vídeo, único "input" del script NEF2Vid

El código vendría a ser algo como lo que sigue:

#!/bin/bash
#
# AUTORÍA:
#
# Script realizado por Astaroth (O.R.G - http://astarothsworld.blogspot.com), apoyado en muchos otros programas que son los que realmente hacen todo el trabajo.
#
# OBJETIVO:
#
# Partiendo de una secuencia de imágenes RAW y un posible patrón de UFRaw (ID), hacer un clip de video.
#
#
# DEPENDENCIAS:
#
# Usaremos UFRaw opara revelar los archivos, ffmpeg para hacer el vídeo y zenity para el entorno gráfico.
#
# Uso:
#
# "./NEF2Vid" en la carpeta con las imágenes.
#
# ------------------------------------------
ini=`ls *.NEF | grep -o -m 1 "[0-9]*"` # Primer fotograma.
fin=`ls *.NEF | grep -o "[0-9]*" | sed -n '$p'` # Último fotograma.
#
# PERFILES
#
perf=`zenity --list --title="RAW2Vid - by Astaroth (O.R.G.)" --text="Elija el tipo de perfil que desee:" --radiolist --column "Sel" --column "#" --column "Opción" --column "Resolución" --column "Notas" true "1" "Full HD" "1920x1080" "Archivos muy grandes, pero de calidad." false "2" "HD" "1280x720" "Archivos de moderado tamaño y alta calidad." false "3" "DV" "720x576" "Archivos más manejables de resolución estándar." --width 650 --height 200`
{
case $perf in
    1) RESx="1920"; RESy="1080"; vid="-f image2 -i .fotogramas/%d.jpg -s 1920x1080 -b 220mb -vcodec png videoFHD.avi" ;;
    2) RESx="1280"; RESy="720"; vid="-f image2 -i .fotogramas/%d.jpg -s 1280x720 -vcodec mjpeg videoHD.avi" ;;
    3) RESx="720"; RESy="576"; vid="-f image2 -i .fotogramas/%d.jpg -target pal-dv videoDV.dv" ;;
    *) echo "ERROR" ;;
esac
numfot=`echo "$fin-$ini+1" | bc`
if [ -e *.ufraw ] ; then
    idarch=`ls | grep *.ufraw`
    ida=1
    echo "#DETECTADO!"
    PERFIL="Usando arcivo ID de UFRaw."
else
    ida=0
    echo "#NO ENCONTRADO ARCHIVO ID!"
    PERFIL="Archivo ID de UFRaw no encontrado... valores por defecto."
fi
mkdir .fotogramas
fotograma=0
Tvid=0 # Tiempo en minutos aprox de cración del vídeo (adecuado a ffmpeg)
for foto in $(seq $ini $fin) ; do
    tini=`date +%s` # Tiempo inicial en segundos.
    fotograma=`echo "$fotograma + 1" | bc`
    porcent=`echo "scale=2; ( $foto - $ini + 1 ) * 80 / $numfot" | bc`
    echo "$porcent"
    if [ $ida = 1 ] ; then
      # Revelado con archivo ID:
      echo "#Revelando la imagen número $foto de $fin...\n$PERFIL\nTiempo restante ~ $Test min..."
      ufraw-batch --conf=$idarch --size=$RESx --out-type=jpg --output=.fotogramas/$fotograma.jpg _DSC$foto.NEF
    else
      #Revelado sin archivo ID:
      echo "#Revelando la imagen número $foto de $fin...\n$PERFIL\nTiempo restante ~ $Test min..."
      ufraw-batch --size=$RESx --out-type=jpg --output=.fotogramas/$fotograma.jpg _DSC$foto.NEF
    fi tfin=`date +%s` # Tiempo final en segundos. Ttrans=`echo "scale=2; ($tfin-$tini )/ 60" | bc` # Tiempo transcurrido en revelar un fotograma en minutos. Test=`echo "scale=2; ( $fin - $foto ) * $Ttrans + $Tvid" | bc` # Tiempo estimado para el fin del programa.
done
echo "90"
echo "#Realizando vídeo...\n($numfot fotos @ $fps fps)\nTiempo restante ~ $Test min..."
ffmpeg $vid
echo "#Borrando copias innecesarias..."
echo "99"
rm -R .fotogramas
}| zenity --progress --title="Creación de vídeo a partir de RAW" --auto-close --auto-kill

Entre los diferentes perfiles de vídeo que he puesto por defecto, hay un modo de alta definición llamado "Full HD" (lo he llamado así porque le he hecho coincidir con la resolución de ese formato, 1920x1080, pero no sé si se puede considerar realmente ese estándar, debido a la codificación del vídeo y otros factores).

Uno de los fotogramas (reducidos) del vídeo en alta resolución


Tal y como trabajo ahora, a mi me cuesta editar vídeos de más de 720x576 (DV), pero hay una evidente pérdida de calidad con respecto a las imágenes tomadas con la cámara de foto (en mi caso, de 3872x2592 px), por lo que he querido hacer una prueba para ver si puedo subir a Internet un vídeo en alta definición.

El resultado es el que sigue:

Fragmento de "Perseguidores del Tiempo"

Donde he subido directamente la salida del script NEF2Vid (perfil "Full HD") sin ningún tipo de edición que pudiera causar una pérdida de calidad (el audio se ha introducido a posteriori, con las herramientas de edición de YouTube, y supongo que al hacerlo así no se produce ninguna pérdida en la imagen además de la propia de la subida y procesado inicial de YouTube).

Otro ejemplo de un Full HD realizado por mi con este script es el siguiente.


Una de las propiedades de NEF2Vid es que puedes editar todos los fotogramas de golpe generando un "archivo ID" de UFRaw (es decir, editando los parámetros de un único fotograma a mano, los demás se editan automáticamente), por lo que no cuesta nada cambiar las curvas de color, el balance de blancos, la saturación, la exposición, etc. de la escena, como muestro a continuación.


El complemento perfecto para este "unidor de fotogramas", es el script Fot-o-matic, desarrollado por Altair Mikoto, basado en gphoto2, el cual realiza fotografías automáticamente cada cierto intervalo de tiempo controlado por un ordenador. De esta manera, no hace falta estar mirando mientras se hace el Time-Lapse y se evitan movimientos bruscos de la cámara (ójala lo hubiera sabido antes de hacer este vídeo :p!).

El que podéis ver a continuación es un vídeo de Altair Mikoto donde utiliza estas técnicas:


------------------------

Nota sobre la inserción de HD en YouTube:

Si no véis por defecto el vídeo en HD, pulsar en "1080p", pero en principio, añadiendo a las direcciones de los vídeo de YouTube "&hd=1" en el código HTML para insertarlos, deberían mostrarse directamente en HD.


* Sugerencia de murciélago.
Comparte en Facebook

1 comentario:

  1. Yo es que no me canso de ver los Time-Lapse de las nubes! le he dado a replay no sé cuántas veces ya!

    Oye, una cosa, me puedes decir qué canciones son las que suenan en el video de "Prueba de Full HD", y "Wind destination"?

    ResponderEliminar

Querido astarothista!,

Si te ha gustado la entrada y quieres dejar constancia de ello, tienes alguna sugerencia para completarla o corregirla, quieres mostrar tu opinión respecto a algo de lo que se haya hablado en esta entrada (con respeto) o simplemente quieres dejarme un mensaje a mi o a la comunidad, no dudes en comentar ;)!

Recuerda que también estamos en Facebook y en Google+.