2014-11-08

Capturar pantalla en video con FFmpeg

bash script para Linux debian-based

A pesar de que en Comandos útiles de FFmpeg ya publiqué cómo capturar la pantalla completa en video directamente pasando los valores por consola, la idea de este script es que se encargue de hablar con FFmpeg para simplificarte las cosas.
Funciona en cualquier distro basada en debian (Linux Mint, Ubuntu, etc) con los paquetes necesarios instalados (los cuáles podrán ver al final de esta entrada) y toma todos los valores que necesite automáticamente.
El mismo da la posibilidad de definirle a cuántos FPS (frames per second, cuadros por segundo) y de cuánto tiempo se quiere realizar la captura, así como también el lugar en donde se guardará el archivo de video resultante, por supuesto. En caso de no definirse la salida, el video se almacenará en formato mkv en el home o carpeta personal con la fecha y hora de inicio de grabación.

fah_capture-screen - Ayuda y modo de empleo

Entonces, para ponerlo en marcha tendremos que crear un archivo llamado fah_capture-screen dentro de /usr/local/bin/:
cd /usr/local/bin && sudo nano fah_capture-screen

En el cuál pegaremos (Ctrl+Shift+V) el código del script:
#!/bin/bash

# Versión 20141108_2

# Ayuda y modo de empleo
mostrarAyuda () {
   echo -e "\nfah_capture-screen: Captura pantalla completa en video."
   echo -e "\nUSO:"
   echo -e "\tfah_capture-screen [ -f <VALOR> | -t <VALOR> | -h | -o <SALIDA[.mkv|.mp4|.avi]> ]"
   echo -e "\nOPCIONES:"
   echo -e "\t-f\tFPS (Frames Por Segundo). Por defecto: 30."
   echo -e "\t-h\tAyuda y modo de empleo."
   echo -e "\t-o\tArchivo de salida donde se almacenará la captura. Por defecto: \"~/FECHA_HORA.mkv\""
   echo -e "\t-t\tTiempo hasta finalizar la captura, en segundos o del modo \"hh:mm:ss[.xxx]\". Por defecto: infinito."
   echo -e "\nEJEMPLOS:"
   echo -e "\tfah_capture-screen"
   echo -e "\tfah_capture-screen -o ./videos/mivideo.mp4"
   echo -e "\tfah_capture-screen -f 60 -o mivideo.mkv"
   echo -e "\tfah_capture-screen -f 25 -t 30 -o mivideo.avi"
   echo -e ""
}

# Procesamiento de parámetros
while getopts 'f:t:o:h' OPCION; do
   case $OPCION in
      f)
         FPS=$OPTARG
         ;;
      t)
         TIME=$OPTARG
         ;;
      o)
         OUTPUT=$OPTARG
         ;;
      h)
         mostrarAyuda
         exit 0;
         ;;
      \?)
         echo -e "\nERROR: -$OPTARG no es un parámetro válido."
         mostrarAyuda
         exit 1;
         ;;
       :)
         echo -e "\nERROR: Opción -$OPTARG requiere un parámetro."
         mostrarAyuda
         exit 1;
         ;;
   esac
done

# Valores por defecto
FPS=30
OUTPUT="$HOME/"$(date +"%Y%m%d_%H%M%S")".mkv"
LINE=$(xrandr -q | grep Screen);
WIDTH=$(echo ${LINE} | awk '{ print $8 }');
HEIGHT=$(echo ${LINE} | awk '{ print $10 }' | awk -F"," '{ print $1 }');

if [ ${TIME} ]; then
   ffmpeg -f x11grab \
    -r ${FPS} \
    -s ${WIDTH}x${HEIGHT} \
    -i ${DISPLAY} \
    -t ${TIME} \
    -vcodec libx264 \
    -vpre lossless_ultrafast \
    -y ${OUTPUT}
else
   ffmpeg -f x11grab \
    -r ${FPS} \
    -s ${WIDTH}x${HEIGHT} \
    -i ${DISPLAY} \
    -vcodec libx264 \
    -vpre lossless_ultrafast \
    -y ${OUTPUT}
fi
Cerramos el archivo (Ctrl+X) y aceptamos guardar las modificaciones cuando nano nos lo pregunte.

Luego le daremos permisos de ejecución y de lectura/escritura para evitar tener que usar sudo cuando queramos ejecutarlo:
sudo chmod +x fah_capture-screen && sudo chmod 775 fah_capture-screen

Y por último lo ponemos en práctica:
cd ~ && fah_capture-screen
Para finalizar la grabación: Ctrl+C. Esto guardará el video capturado en el home o carpeta personal.


EDIT 20141109: Agrego video de prueba del script ^_^ (música by Mariano Babich)


Nota importante: Estos paquetes pueden ser necesarios para el correcto funcionamiento de FFmpeg con casi todas sus funciones:
sudo apt-get install -y build-essential ubuntu-restricted-extras ffmpeg libavcodec-extra-53

Y estos son más a elección, depende de lo que vayan a hacer, puede q nunca los necestien, pero por las dudas se los dejo:
sudo apt-get install x264 libx264-123 libx264-dev

2014-11-04

Comandos útiles de FFmpeg


A pesar de que existen soft con intefaz gráfica como Avidemux o Audacity, los cuáles a veces utilizo, hace un tiempo que termino eligiendo FFmpeg para casi todo lo relacionado con grabación, edición y conversión de video y/o audio, más que nada por su simplicidad (una vez que te acostumbras) y velocidad, sobre todo cuando uno puede utilizarlo en scrips própios hechos en bash, x ejemplo, para facilitar aún más su uso.

Luego de un tiempo de usar FFmpeg x consola, acomodando cada vez las opciones que necesitaba para cada cosa, de a poco me fuí anotando los comandos simples q más uso y haciendo también algunos script en bash para no tener que pensar (sí, no-pensar, no-pensar!), así que quería compartirlos ya q pueden serles de utilidad (aunque sea a quienes usan Linux).

Entonces, a lo que viene el post. En esta oportunidad voy a dejar varios comandos últiles y en próximos post iré dejando algunos scripts para automatizar y simplificar algunas cosillas.

Primero que nada, para poder utilizar el FFmpeg en todo su esplendor sin renegar porque les falte un codec o librería para hacer tal o cuál cosa, instalando estos paquetes estoy casi seguro que no necesitarán de ningún otro
sudo apt-get install -y build-essential ubuntu-restricted-extras ffmpeg libavcodec-extra-53

Si notan algún problema, pueden instalar o fijarse si tienen instalados estos paquetes. Deberían encontrarse instalados o haberse instalado junto a los paquetes antes señalados.
sudo apt-get install x264 libx264-123 libx264-dev


Bueno, ahora sí, empecemos:


Obtener información de un video
ffmpeg -i VIDEO.avi


Concatenar archivos de audio (unir en un solo archivo 2 o más archivos de audio, uno detras de otro)
ffmpeg -i "concat:AUDIO1.mp3|AUDIO2.mp3|AUDIO3.mp3" -acodec copy AUDIO.mp3


Extraer audio de un video
ffmpeg -i VIDEO.mp4 -ab 196608 AUDIO.mp3
El valor "196608" corresponde al bitrate (en bits) del mp3 de salida, 192Kbps en este caso.


Silenciar un video (quitarle el audio)
ffmpeg -i VIDEO.avi -vcodec copy -an VIDEO.avi


Añadir audio a un video
ffmpeg -i VIDEO.mkv -i AUDIO.mp3 -acodec copy -vcodec copy -map 0:0 -map 1:0 VIDEO-CON-AUDIO.mkv


Extraer imágenes de un video (convertir video a imágenes)
ffmpeg -i VIDEO.mp4 -r 25 IMAGEN%d.png
Esto guardará las imágenes numeradas (IMAGEN1.png, IMAGEN2.png, etc) en la carpeta donde se ejecute el comando. "-r 25" (opcional) corresponde a la cantidad de imagenes que queremos se extraigan por cada segundo de reproducción del video. Ya que en definitiva se corresponde con los FPS (frames per second, cuadros por segundo) del video, se recomienda poner un valor igual o menor para evitar imágenes repetidas.


Capturar pantalla completa en video (ver script automatizado)
ffmpeg -f x11grab -r 30 -s 1280x1024 -i :0.0 -vcodec libx264 -vpre lossless_ultrafast -y VIDEO.mp4
"-r 30" corresponde a la candidad de FPS (frames per second, cuadros por segundo) a la que se quiere grabar y "-s 1280x1024" la resolución de pantalla.


Por ahora hasta ahí nomás queda. Pueden ser pocos comandos pero la verdad son los que recuerdo en este momento porque son los que más utilizo. Más adelante puede que agregue más y, cuando publique los posts con los scripts, agrego los enlaces a los mismos.


Fuente: La Inet y mis pruebas y errores.

Reviviendo el blog

...como por 5ta vez?

Luego de hacer una rápida selección de las entradas que se quedan y las que no, paso a reactivar mi blog, esta vez dirigiéndolo un poco más a lo que me gusta compartir: Temas relacionados con la informática en general (sobre todo con el mundo opensource), manga y anime, y diseño de imágenes.

Aviso de entrada que las publicaciones sobre Linux no son dirigidas a nadie en especial, es decir, son más que nada una "ayuda memoria" para mi mismo, por lo que puede que no a todos les funcione lo que diga o haga.
Esto no significa que no responderé sus comentarios en busca de ayuda (puede que al intentar ayudarlos pueda generalizar un poco más mis própios scripts), pero sí es un aviso de que a ustedes "les puede fallar".

En fin, de ahora en más iré republicando de a poco los diseños que he hecho y se perdieron en la historia, y publicando nuevos post relacionados a Linux que tengo dando vueltas por foros en la Inet.

Espero les sirva o guste algo de lo que vean acá, y sino, ya saben:


^_^ [P4NCH1 - Back in Blah]