Cómo hacer un screencast utilizando ffmpeg

Para aquellos que no lo saben, un screencast es una grabación digital de la salida por pantalla de la computadora, a veces conteniendo narración de audio.

En Linux, existen varias herramientas para hacer screencasting. Sin embargo, aquellos que prefieran hacerlo consumiendo mínimos recursos no pueden dejar de leer este artículo.


Haciendo uso de 2 herramientas (ffmpeg para realizar la captura de la pantalla y xwininfo para obtener las coordenadas y dimensiones de la ventana a grabar) me las ingenié para poder realizar screencasts utilizando recursos mínimos y obteniendo óptimos resultados.

El script para iniciar el screencast

#!/bin/bash

# Obtener las coordenadas y el tamaño de la ventana seleccionada
# Esto excluye la decoración de la ventana.
  unset x y w h
  eval $(xwininfo -frame |
    sed -n -e "s/^ +Absolute upper-left X: +([0-9]+).*/x=1/p"
           -e "s/^ +Absolute upper-left Y: +([0-9]+).*/y=1/p"
           -e "s/^ +Width: +([0-9]+).*/w=1/p"
           -e "s/^ +Height: +([0-9]+).*/h=1/p" )
$w=$w + $w % 2 # que el ancho sea múltiplo de 2, sino ffmpeg se queja
WIN_XY=$x","$y # dar formato a las coordenadas XY
WIN_GEO=$w"x"$h # dar formato al tamaño de la ventana
# notify-send mostrará un mensaje indicando el inicio del screencast.
# correr ffmpeg con los parámetros que se ajusten a tu configuración.
notify-send "Iniciando screencast..." && ffmpeg -f alsa -i hw:0 -f x11grab -r 25 -s $WIN_GEO -i :0.0+$WIN_XY -acodec libmp3lame -async 1 -vcodec libx264 -preset ultrafast -crf 0 -threads 0 guardar.mp4

No hace falta que entiendas a la perfección todo lo que hace este script. Simplemente con seguir los comentarios ya es suficiente. Sin embargo, es muy posible que tengas que cambiar algunos parámetros en la línea donde se ejecuta ffmpeg para ajustarlos a la configuración de tu máquina.

Arquitectura de audio

1) Si usás OSS, reemplazá -f alsa -i hw:0 por -f oss -i /dev/dsp

2) Si usás solo ALSA, tenés que usar los parámetros que vienen en el script (-f alsa -i hw:0). Para determinar el número que va después de hw: podés ejecutar aplay -l y elegir el número de la tarjeta de sonido adecuada.

3) Si usás Pulse Audio (Ubuntu y derivados usan esto), usá los parámetros -f alsa -ac 1 -i pulse.

FPS

-r 25 indica los fps (frames per second o fotogramas por segundo) a los que quieras grabar. 25 es una buena opción.

Códec de audio, video y sincronización

-acodec libmp3lame es el códec de audio. Lo elegí grabar en mp3. Podés utilizar cualquier otro.

-async 1 permite la sincronización del audio con el video.

-vcodec libx264 -preset ultrafast -crf 0 -threads 0, le indica a ffmpeg que el códec de video a utilizar sea  x264 y que el preset sea ultrafast (hay fast, slow, etc), de lo contrario no llega a grabar correctamente a la cantidad de fps deseados. El parámetro -crf 0 indica el nivel de compresión (cuanto más bajo, menor la compresión). Por último, threads 0 indica la cantidad de hilos a utilizar, al pasar 0 ffmpeg lo calcula automáticamente. Al igual que con la configuración de audio, podés elegir otras opciones.

Todas estas configuraciones fueron las que a mi me dieron mejores resultados: un archivo relativamente pequeño, una buena calidad de video, con audio sincronizado y sin lags. No obstante, te recomiendo sumergirte en la documentación de ffmpeg para descubrir otras.

El script para finalizar el screencast

#!/bin/bash
notify-send "Finalizando screencast..." && killall ffmpeg
Para que ambos scripts funcionen tenés que tener instalado notify-send. Todas las distribuciones derivadas de Ubuntu deberían venir con esta herramienta instalada. En Arch y derivados: sudo pacman -S libnotify.

Ffcast

Buscando información para escribir los scripts, descubrí que alguien tuvo una idea muy similar a la mía.  Ffcast es un script que utiliza las mismas herramientas (ffmpeg y xwininfo). Lo menciono porque tal vez a algunos les resulte más cómodo utilizar este script.

En Arch y derivados, abrí un terminal y ejecutá:

yaourt -S ffcast

El resto, puede descargarlo desde aquí.

Para terminar…

Una vez que creaste y guardaste los scripts guardados en tu carpeta HOME, hay que otorgarle permisos de ejecución. Suponiendo que se llamen iniciar_screencast y terminar_screencast, ejecutá los siguientes comandos en un terminal:

chmod +x iniciar_screencast
chmox +x terminar_screencast

Finalmente, sólo resta asignar cada uno de los scripts a 2 shortcuts (accesos directos) que te resulten cómodos. De ese modo, los scripts se ejecutarán al presionar la combinación de teclas seleccionada.


Deja tu comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

*

*

  1. Responsable de los datos: Miguel Ángel Gatón
  2. Finalidad de los datos: Controlar el SPAM, gestión de comentarios.
  3. Legitimación: Tu consentimiento
  4. Comunicación de los datos: No se comunicarán los datos a terceros salvo por obligación legal.
  5. Almacenamiento de los datos: Base de datos alojada en Occentus Networks (UE)
  6. Derechos: En cualquier momento puedes limitar, recuperar y borrar tu información.

  1.   Michael Sp dijo

    Desde que conocí Linux me he preguntado exactamente lo mismo que se acaba de detallar en este comentario. sería un ambicioso proyecto.

  2.   pfme dijo

    me parece bueno el tuto pero como decis algo facil para usuarios novatos, puej el q mejor me parece es KAzam, es facil de usar y no consume mucho a mi parecer!!!!!! saludos

  3.   Usemos Linux dijo

    No todos. Además, honestamente creo que no hay ninguna buena interfaz para hacer screencasting (que tenga todo lo que necesito), que funcione con los formatos que yo quiero y que consuma pocos recursos.

    En mi caso, el terminal es la mejor opción. No pretendo que lo sea para todos, pero es bueno compartir lo que uno va aprendiendo, no?

    Saludos! Pablo.

  4.   Jorge Rocha dijo

    esta mal q si queremos expandir los SO bajo GNU/linux aconsejemos a los usuarios a hacer ese tipo de cosas en la terminal la gente quiere algo facil y funcional

    @ingjorgerocha

  5.   whysoyjuan dijo

    A nivel servidor yo también uso incluso únicamente consola,nada de entorno gráfico…es lo más práctico y lo hago todo desde ahí(automatizar backups por ejemplo como tú bien dices..),pero,en una máquina que tengas como servidor..para qué quieres hacer un screencast en ella?jeje..Ffmpeg es muy muy válido pero creo que el tema de la consola debería ir pasando a un segundo plano en según que distribuciones.
    Ya que tenemos tanta variedad de distros en el mundo Linux,y la consola está lo suficientemente perfeccionada como para funcionar adecuadamente en todas las situaciones(es casi infalible más bien..),habría que empezar a mejorar las apps de cara al público,empezar a pulir,código y aspecto gráfico..que a dia de hoy es lo que se demanda.
    Tenemos proyectos en Linux bastante arcáicos y abandonados,eso lo sabemos todos..un ejemplo bueno,para mi,es el porqué no hay ya un formato de archivo ejecutable que permita llevarte un programa en un pendrive y simplemente hacer doble click y una instalación sencilla fuera de requerir repositorios(y por ello red)..nada de APTonCD,esto está anticuado también..necesitamos un estandar, un «.tux» o algo así similar a un «.exe» de Windows.¿Es por tema de espacio?..en Windows,el ejecutable de Gimp ocupa 72mb y el mismo para Linux (.deb) ocupa 4,2mb…¿esto por que es? pues porque al programa de Gimp en sí,en Windows le acompañan todas las librerias para asegurarse de que el programa funciona al instalarlo..en Linux podriamos tener algo igual,el ejecutable ocuparía más,perderíamos la ventaja del tamaño pero ganamos en portabilidad(y mas con las memorias tan grandes que llevamos hoy en dia en los bolsillos..¿que más da llevar 4mb que 72mb si llevamos pendrives de 8gb casi todos?)
    Todas estas cosas son las que hay que ir puliendo..el sistema es estable,tiene gran soporte y compatibilidad de drivers..¿porqué no mejoramos lo que hay?..si alguien se anima,iniciamos el proyecto de ejecutable jeje.Un saludo!

  6.   hidabe dijo

    Uhm… pues la gente que ama la consola no la ama porqué sí querido amigo, la ama porque con ella se pueden automatizar muchas cosas, por ejemplo, a nivel de servidor (aunque este no sea el caso).

  7.   whysoyjuan dijo

    Sinceramente,la consola es muy util…pero hay programas con algún GUI que utilizan ffmpeg y son más atractivos y constructivos para posibles nuevos usuarios Linux…recomiendo RecordMyDescktop que está en los repositorios de casi todas las distros.Ya sé que hay mucha gente que ama la consola,pero esto hay que ir acabando con ello en todo lo posible…hay que enfocar Linux al escritorio y a un posible usuario final que fundamentalmente quiero eso,una interface gráfica y a ser posible bonita y práctica…¿tan dificil es?.hombre,que no podemos dejarnos pisar..Linux tiene un potencial tremendo y debemos exprimirlo!
    A pesar de todo,es un genial programa!buen post^^

  8.   whysoyjuan dijo

    La verdad que si,es genial compartir lo que uno va aprendiendo…Esto no es una crítica en el sentido desvalorizante del post,sino una crítica al porqué no usa más gente Linux..digan lo que digan,la consola debe ir quedando reducida al un segundo plano para dar paso a las facilidades gráficas (no quiere decir esto que la posibilidad de realizar cosas por consola quede descartada,sino que el que quiera la use y el que no,pues no..)
    Al fin y al cabo,lo que vende,lo que llama la atención es la facilidad en el manejo de un SO..internamente Linux es imparable,pero si a eso sumamos una facilidad de manejo y unas interfaces intuitivas..ganamos usuarios y eso beneficia al desarrollo de la comunidad,los diferentes programas,apoyo de las compañías de videojuegos y por tanto de hardware específico(díganse tarjetas gráficas..),creacción de software especializado que actualmente solo hay en Windows/Mac…no se,yo creo que esto es en plan 15M…todo muy bonito pero ya toca cambiar un poco el rumbo…y digo un poco!

    Bueno,lo del proyecto de los ejecutables estandar en Linux sigue en pie,si alguien lo lee y quiere que empecemos a colaborar aqui está mi correo,no me escondo jeje (whysoyjuan@gmail.com)

    Un saludo y espero ver más comentarios por aquí…sean críticas o alabanzas,el caso es que haya de que hablar.Xao

  9.   Usemos Linux dijo

    Bien! Buen aporte.
    Abrazo! Pablo.

  10.   Gerardo dijo

    En que consiste este programa…ojo, no soy muy entendido en ésto!

    1.    usemoslinux dijo

      Generalmente, se utiliza para convertir videos. En este caso, demostramos cómo utilizarlo para grabar tu escritorio y hacer un video tutorial, por ejemplo.
      Abrazo! pablo.

  11.   Tarribalis dijo

    Gracias. En la resolución, p.e. 1280X800, la equis debe ponerse en mayúscula para que funcione el comando ffmpeg.