Edición de vídeo desde consola
viernes, 15 de enero de 2010¿ editar vídeo desde una consola de texto ? Si, suena algo raro y poco amigable, pero en algunas ocasiones puede resulta muy cómodo y útil, algún ejemplo:
– han terminado las fiestas, tienes 200 vídeos de tu sobrino comiendo mazapanes y te gustaría reescalarlos a 320 pixels y saturar al máximo los colores antes de subirlos a youtube.
– ademas, quieres hacer un vídeo con las 2000 fotos, con bonitas cortinillas de estrella entre cada foto y todo esto para verlo en el DVD cuando tu sobrino se recupere.
– La webcam graba cada día un vídeo y te gustaría crear un script que cada mañana coja ese vídeo, le sobreimprima un título en movimiento y le aplique un ligero desenfoque-romantic-gaussians.
Vaya, para cualquier tarea susceptible de ser automatizada y especialmente dañina, caso de hacerlo a mano, podeis usar MLT (melt, en su ejecutable de consola), un framework opensource y que es usado por muchos programas gráficos de edición de vídeo, KdeNLive por ejemplo.
La lista de ordenes/opciones de melt, al contrario de lo que pudiera parecer, son poco más de 20 (sin contar las clásicas -version, -help, -debug, etc.. ), pero dada la flexibilidad y las posibilidades de combinación los resultados pueden ser realmente impresionante.
Conceptos básicos
Para entender el funcionamiento de melt conviene tener en mente un breve esquema elemental del concepto de la edición de vídeo con multipistas y conocer los 4 objetos básicos de los que se compone Melt:
– producers: (entrada) alimentan una pista con contenido procedente de imagen, vídeo, audio, dispositivos ó incluso otros archivos melt anteriores.
– filters: manipulan y transforman el resultado devuelto por producers.
– transtions: realiza transiciones entre dos tracks.
– consumers: (salida) reciben los datos procesados y los devuelven en otro formato, que puede ser, entre otros, de audio/video (consumer avformat), de texto (consumer xml) ó de previsualización (consumer gtk2_preview, por defecto).
Algunos ejemplos de uso
A continuación algunos ejemplos animados y comentados con los cuales creo que os podeis hacer una idea de su versatilidad y posibilidades (el número que aparece sobreimpreso en el vídeo hace referencia a apartado en que se comenta el código):
1. Reproducir un vídeo
Simplemente
melt miVideo.avi
2. Reproducir una secuencia de fotografias
Creamos un grupo, le asignamos la propiedad out=50 para que salte al siguiente elemento a los 50 frames, por ultimo rellenamos el grupo con todos los jpgs que haya en la carpeta misfotos (si quitasemos la propiedad out reproduciría de la primera imagen encontrada indefinidamente)
melt -group out=50 /home/usuario/misfotos/*jpg
Melt dispone de gestión de multiples imágenes con lo que podriamos hacer tambien
melt /home/usuario/misfotos/.all.jpg ttl=50
Donde TTL es el número de frames que se muestra cada imagen. Necesita ruta absoluta.
3. Reproducir una fotografía y después un vídeo
Reproducimos una imagen durante 110 frames y a continuación 50 frames de un vídeo empezando en el frame 40.
melt miImagen.jpg out=110 miVideo.avi in=40 out=90
4.Titulo y video
Creamos un fondo negro con el texto «Mi titular» en rojo y a los 90 frames cambiamos a un video que empieza en su frame 350.
El texto es generado por pango, que es obviado en la primera linea pero no en la segunda, ambas lineas producen identico resultado:
melt "+Mi titular.txt" fgcolour=0xff0000ff out=90 miVideo.avi in=350
melt pango: text="Mi titular" fgcolour=0xff0000ff out=90 miVideo.avi in=350
5. Titulo, fundido, video y salida a AVI
Creamos con pango un texto rojo y texto «Mi titular» que sale a los 90 frames y se mezcla durante 20 frames con «mi_video.avi» del que se muestran los frames 350 a 390. El resultado se guarda en el archivo salida.avi
melt pango: text="Mi titular" fgcolour=0xff0000ff out=90 miVideo.avi in=350 out=390 -mix 20 -mixer luma -consumer avformat:salida.avi
6.Blanco, fundido a video y fundido a blanco
Creamos un fondo blanco durante 30 frames, de los cuales 20 funden al video que dura 40 frames, de los cuales 20 funden a blanco de nuevo. Se guarda en test.avi pero especificando un bitrate de 8000kb y aspecto panorámico para el archivo resultante.
melt colour:white out=30 miVideo.avi in=350 out=390 -mix 20 -mixer luma colour:0xffffffff out=30 -mix 20 -mixer luma -consumer avformat:salida.avi b=8000k aspect=@16/9
7. Pase de diapositivas con cortinilla
Creamos un grupo con los JPG que haya en la carpeta que se muestran durante 40 frames y transicionan con la siguiente imagen utilizando alguno de los lumas incluidos en la instalación de MLT.
melt -group out=40 /home/usuario/misfotos/*jpg -group -filter luma:/usr/share/mlt/lumas/PAL/luma14.pgm luma.softness=0.2
o también
melt /home/usuario/misfotos/.all.jpg ttl=40 out=400 -filter luma:luma14.pgm luma.softness=0.2
Donde % es la ruta al directorio de compilación. Observa que este segundo caso hay que añadir la propiedad OUT de lo contrario se ejecutan las transiciones de forma infinita, algo que no ocurre en el primer caso.
8. Salida a archivo de texto
Idem anterior, pero en lugar de previsualizar el resultado se guarda en un archivo de texto.
melt /home/usuario/misfotos/.all.jpg ttl=40 out=100 -filter luma:%luma15.pgm luma.softness=0.2 -serialise salida.melt
Despues podemos visualizar el resultado haciendo
melt test.melt
O aplicar un efecto de pixelado a todo el conjunto (ojo: incluidas las cortinillas) con
melt salida.melt -filter frei0r.pixeliz0r
9. Video con subtitulo deslizante
Creamos un fondo negro durante 90 frames que funde a un vídeo. En otro track incluimos un título en color rojo y fuente ttf Baveuse que dura 150 frames, que es lo mismo que dura una transición que lo desplaza de derecha a izquierda (100% -100%)
La propiedad valign (alineación vertical) ó halign (alineación horizontal) toma los valores 0,1,2 para arriba,medio,abajo
melt colour:black out=90 miVideo.avi out=400 -mix 50 -mixer luma -track pango: text="Texto al pie del video" font="Baveuse 60" fgcolour=red out=150 -transition composite:100%,0%:100%x100% end=-100% valign=2 in=0 out=150
10. Mosaico 2×2 con un vídeo
Creamos un fondo negro sobre el que «crece» un vídeo hasta cubrir el fotograma. El resultado se guarda como XML en salida.mlt
melt colour:black -track miVideo.avi -transition composite:50%,50%:0%x0% end=0%,0%:100%x100% in=0 out=20 -consumer xml:salida.mlt
A continuación creamos un fondo blanco al cual aplicamos 4 filtros de «marca de agua» que contienen el resultado del proceso anterior y cada uno ubicado en una coordenada diferente.
melt colour:white -filter watermark:salida.mlt composite.start=0%,0%:50%x50% -filter watermark:salida.mlt composite.start=50%,0%:50%x50% -filter watermark:salida.mlt composite.start=0%,50%:50%x50% -filter watermark:salida.mlt composite.start=50%,50%:50%x50%
luismanolo
#1/ 22 de January/2010 a 18:49:09
Otros comentarios de «luismanolo»
Muy buen artículo, muchas gracias.
Carlos Giurleo
#2/ 26 de February/2011 a 16:19:27
Otros comentarios de «Carlos Giurleo»
Hola, excelente artículo. Quisiera preguntar si es posible subtitular en tiempo real. Tengo necesidad de agregar PNGs en tiempo real a un flujo de video en formato RAWDV. Tengo una aplicación que envía un stream en formato RAWDV hacia el dispositivo /dev/dv1394/0. Mi intención es intercalar un programa que puega agregarle en todo momento una imagen PNG. Incluso necesito que si dicha imagen cambia, cambie en tiempo real. En este momento tengo lo siguiente:
dvsink-command cat > /dev/dv1394/0
Pensaba hacer lo siguiente:
dvsink-command cat | melt /dev/stdin -attach watermark:miArchivo.png -consumer libdv:/dev/dv1394/0
He visto que toma un solo cuadro cuando lanzo el comando y luego finaliza. Tambien he tenido problemas para leer directamente desde /dev/dv1394/0 o desde /dev/raw1394. Me da un error de Segmentation fault.
Alguien me puede ayudar?
Saludos
Carlos (cgiurleo@gmail.com)
Trebol-A
#3/ 26 de February/2011 a 22:03:49
Otros comentarios de «Trebol-A»
Hola Carlos,
no he probado lo que comentas, pero en principio entiendo que MELT lea solo un fotograma puesto no le indicas la duración del "watermark". Supongo que debería funcionar con (para 10 seg)
dvsink-command cat | melt /dev/stdin -attach watermark:miArchivo.png -in=1 -out=240 -consumer libdv:/dev/dv1394/0
El fallo por la lectura en tiempo real del dispositivo imagino que estara relacionado con la ausencia de buffer y/o caché entre dvsing-command y melt (no lo sé, es una suposición), pero podrías probar a simular esta buffer haciendo algo como:
mkfifo tubo-video.dv
dvsink-command > tubo-video.dv | melt tubo-video.dv .... COMNDS
Es una idea, no lo he hecho nunca..
Carlos Giurleo
#4/ 18 de May/2011 a 00:15:29
Otros comentarios de «Carlos Giurleo»
Al parecer, el MELT abre y cierra un archivo para obtener datos del mismo y luego lo procesa. Por éste motivo no es capaz de leer un stream.
Ahora ando con otra inquietud, quiero utilizarlo al menos como subtitulador con unos scripts. Hago: melt $1 -attach watermark:$2 -consumer libdv:$3 y funciona bien. El unico detalle es que los PNGs sobreimpresos se ven mal. Como si les faltara interlacearlos. Alguien sabe si le puedo agregar algun parámetro para mejorar el PNG sobreimpreso?
Gracias
Saludos
26 de December, 2024 @ 20:00