sábado, 12 de diciembre de 2009

Blender sequencer automation

Durante esta semana he estado buscando algunas alternativas a la creación de vídeos a partir de grandes secuencias dispersas de imágenes.

Mis condiciones eran las siguientes:

  1. Las imágenes pueden existir o no. Si no están ahí el vídeo debe presentar negro y el audio debe continuar tal cual.
  2. Los archivos pueden estar dañados o incompletos.
  3. La resolución de los ficheros es conocida a priori pero no es obligatoria
  4. El vídeo resultante debe ser un quicktime.
  5. Debe generarse en un entorno linux con coste de software cero.
Mi primera opción fue pensar en Shake y echarlo mucho de menos, optar por él iría en contra de la condición [5]

Tenía la opción de Toxik, incluído en nuestras licencias de maya. Sin embargo no terminaba de estar cómodo con esto ya que optar por esto habría supuesto que cada vez que alguien hiciese un video consumiría a su vez una licencia.

Finalmente y como es habitual en mí, opté por blender.

Y aquí es donde las cosas se ponen feas. Resulta que la documentación de la API en las áreas del secuenciador no termina de estar terminada. Es más, está prácticamente vacía.

En el foro de desarrollo encontré algunas pistas sobre cómo crear strips de vídeo. Especialmente esta corta respuesta de cómo crear videos en el sequencer. Sin embargo en ese post no se comenta nada acerca de cómo hacer una pista de efecto. Un cross fade, o un fade o yo que sé.



Así que me encontré con que tenía todas las secuencias colocadas pero ninguna transición entre clips. Tras seguir dándole caña, encontré que la forma de hacer los cross fades era esta:

sce = Scene.GetCurrent()
seq = sce.sequence
nu_strip = seq.new((13, strip_izquierdo, strip_derecho), , )

El número mágico, el "13" que aparece en el código puede obtenerse de la lista de códigos mágicos del código fuente de blender. En el fichero DNA_sequence_types.h, en el directorio: source/blender/makesdna

...
#define SEQ_ADD 9
#define SEQ_SUB 10
#define SEQ_ALPHAOVER 11
#define SEQ_ALPHAUNDER 12
#define SEQ_GAMCROSS 13
#define SEQ_MUL 14
#define SEQ_OVERDROP 15
#define SEQ_PLUGIN 24
#define SEQ_WIPE 25
#define SEQ_GLOW 26
#define SEQ_TRANSFORM 27
#define SEQ_COLOR 28
#define SEQ_SPEED 29
#define SEQ_EFFECT_MAX 29
...

No termina de gustarme el asunto de que ponga "gammacross" sin embargo, como puede verse en el vídeo embebido tiene el efecto que estoy buscando de cross entre vídeos.

Si refino esto un poco más intentaré buscar un hueco para contarlo aqui.

De cara a lanzar el proceso, opté por la simplicidad y utilicé una combinación de fichero .blend preconfigurado y mis propios módulos de python:

blender -b video_writting.blend -P my_script.py

Donde en my_script.py defino la longitud total del vídeo, su posición, etc. Los atributos del tipo de vídeo, tamaño de salida, etc. están en el propio .blend haciendo el proceso bastante más sencillo.


--
Podeís ver el resultado también aqui, en vimeo.
PD: blogger es una pesadilla para publicar un maldito vídeo de 500 K