ffmpeg: una herramienta siempre útil

ffmpeg-logo

Una herramienta que siempre instalo cuando acabo de hacer una instalación nueva de Slackware Linux (como ahora) es ffmpeg (aquí la forma en que la instalé en Slackware 14.0 que es prácticamente igual), esta herramienta es una dependencia de una buena cantidad de programas que suelo utilizar en Linux por lo que siempre es de las primeras. Y como quiero tenerla mas o menos completa, primero hago una instalación de algunas de sus dependencias opcionales, como se explica a continuación.

Como siempre yo utilizo sbopkg, para no complicarme mucho la existencia y agilizar el proceso de descarga y compilación. La instalación de las dependencias opcionales la hago con el siguiente comando:

# sbopkg -i "libass libbluray celt libdc1394 libmp4v2 faac frei0r gsm libiec61883 libavc1394 libilbc openjpeg ladspa_sdk lame libmodplug OpenAL opencore-amr opus rtmpdump orc schroedinger speex twolame libvpx x264 xvidcore"

ffmpeg_01

Lo siguiente es instalar el paquete de ffmpeg, para ello hay que asegurarse de que estemos en una shell de root verdadera, esto lo hacemos con el comando «su -«.

Las dependencias opcionales instaladas anteriormente, proporcionan características extras a ffmpeg, pero estas no se detectan automáticamente por lo que se deben pasar algunos parámetros al comando de instalación.

El comando de instalación detallado es el siguiente:

# sbopkg -ri ffmpeg:ASS=yes:BLURAY=yes:CELT=yes:DC1394=yes:FAAC=yes:FREI0R=yes:GSM=yes:IEC61883=yes:ILBC=yes:JP2=yes:LADSPA=yes:MODPLUG=yes:OPENAL=yes:OPENCORE=yes:OPENSSL=yes:OPUS=yes:RTMP=yes:SCHROEDINGER=yes:SPEEX=yes:TWOLAME=yes:VPX=yes:X264=yes:XVID=yes

ffmpeg_02ffmpeg_03

Cuando pregunte por las opciones de linea de comandos contestamos con una letra «c», para que se acepten.

Listo ahora tenemos instalada la herramienta en Linux.

Saludos.

ffmpeg: Instalación en Slackware 14.0

ffmpeg-logo

Ya antes he escrito una entrada sobre la instalación de ffmpeg, algunas de las formas de usarlo y resolver algunos problemas aquí. Ahora voy a colocar la forma en la que lo acabo de instalar en mi nuevo sistema: Slackware 14.0 de 64 bits.

FFmpeg es una colección de software libre que puede grabar, convertir (transcodificar) y hacer streaming de audio y vídeo. Incluye libavcodec, una biblioteca de códecs. FFmpeg está desarrollado en GNU/Linux, pero puede ser compilado en la mayoría de los sistemas operativos, incluyendo Windows.

Primero les muestro un pequeño esquema de los requerimientos de esta aplicación:

+ffmpeg
 |
 +-Requirements
 | |
 | +-lame
 | +-x264
 |
 +-Optional
   |
   +-libass
   +-libbluray
   +-celt
   +-libdc1394
   +-faac
   | |
   | +-libmp4v2
   |
   +-frei0r
   +-gsm
   +-openjpeg
   +-lame *
   +-OpenAL
   +-opencore-amr
   +-rtmpdump
   +-schroedinger
   | |
   | +-orc
   |
   +-speex
   +-libvpx
   +-x264 *
   +-xvidcore

Se incluyen algunas dependencias opcionales, sin embargo no consideré las dependencias opcionales de estas para no hacer más largo el asunto. Algunas dependencias (*) están repetidas.

Primero para instalar las dependencias hay que ejecutar como root:

# sbopkg -i "libass libbluray celt libdc1394 libmp4v2 faac frei0r gsm openjpeg lame OpenAL opencore-amr rtmpdump orc schroedinger speex libvpx x264 xvidcore"

Entrar en una root shell «real» (el guión al final es necesario):

$ su -

Una vez entrada la contraseña de superusuario proceder a instalar ffmpeg:

# sbopkg -i ffmpeg:ASS="yes":BLURAY="yes":CELT="yes":DC1394="yes":FAAC="yes":FREI0R="yes":GSM="yes":JP2="yes":LAME="yes":OPENAL="yes":OPENCORE="yes":OPENSSL="yes":RTMP="yes":SCHROEDINGER="yes":SPEEX="yes":VPX="yes":X264="yes":XVID="yes"

Con esto tendremos el paquete de ffmpeg instalado y listo para correr ;).

Fuentes:

SlackBuilds
Wikipedia

Capturando la pantalla con ffmpeg

Existen muchas formas de capturar el video de la pantalla de nuestra computadora, hay muchos programas que cumplen con esta función y cada uno lo hace de una forma diferente por lo tanto la calidad del video de salida también lo es. Personalmente he probado con la opción de hacerlo con el VLC y con ffmpeg. De estas dos formas prefiero ffmpeg pues me permite tener un control absoluto sobre lo que se desea grabar, además la calidad del video resultante es por mucho superior.

INSTALANDO ffmpeg EN SLACKWARE

Para instalar ffmpeg en Slackware tenemos como siempre la opción de hacerlo mediante los scripts de SlackBuild.org, para facilitar aún más esta tarea de instalación de paquetes yo uso sbopkg. En el sitio de ffmpeg de SlackBuilds.org se especifican algunas dependencias opcionales que permiten agregar características al ffmpeg, yo instalé la mayoría (algunas no se pudieron instalar) y para ello ejecuté lo siguiente.

Es recomendable primero hacer una sincronización para estar seguros de que los paquetes de sbopkg se actualicen con los más actuales del sitio SlackBuilds.org:

# sbopkg -r

A mí me da errores por lo que tengo que utilizar:

# torsocks sbopkg -r

Instalar las dependencias:

# sbopkg -i "celt libdc1394 dirac libmp4v2 faac frei0r gsm openjpeg opencv opencore-amr rtmpdump orc schroedinger speex libvpx x264 xvidcore"

En mi caso me dió errores para instalar dirac y ya tenía instalado lame. Para activar todas estas opciones en ffmpeg decidí instalar el paquete «a mano».

Para instalar el paquete primero hay que descargar todos los archivos de ffmpeg del sitio de ffmpeg en SlackBuils.org.

Cuando se hayan descargado hay que descomprimir el tar.gz que contiene el script.

$ tar -xvzf ffmpeg.tar.gz

Yo muevo todos los archivos al directorio creado dela manera siguiente:

$ mv ffmpeg-0.8.7.tar.bz2 ffmpeg
$ mv ffmpeg.tar.gz ffmpeg
$ mv ffmpeg.tar.gz.asc ffmpeg

Entrar en el directorio descomprimido:

$ cd ffmpeg/

Una vez instaladas las dependencias hay que activarlas colocando yes en cada una de las opciones siguientes antes de ejecutar el SlackBuild, en mi caso tuve que omitir OPENCV y DIRAC:

# CELT=yes DC1394=yes FACC=yes FREI0R=yes GSM=yes JP2=yes LAME=yes OPENCORE=yes RTMP=yes SCHROEDINGER=yes SPEEX=yes VPX=yes X264=yes XVID=yes ./ffmpeg.SlackBuild

Creado el paquete tgz hay que instalarlo con installpkg:

# installpkg /tmp/ffmpeg-0.8.7-i686_custom-1_SBo.tgz

GRABANDO EL ESCRITORIO

Cuando se haya instalado el paquete se puede empezar a grabar el escritorio, si uno busca en Google capture screen ffmpeg encontrará muchas formas de grabar la pantalla. Una de las que yo encontré es la siguiente:

$ ffmpeg -f alsa -i hw:0,0 -f x11grab -r 25 -s 1366x768 -i :0.0+0,0 -acodec pcm_s16le -vcodec libx264 -vpre lossless_ultrafast -threads 0 output.mkv

Otro pedazo de código:

$ ffmpeg -f alsa -i hw:0,0 -f x11grab -r 25 -s 1366x768 -i :0.0+0,0 -acodec pcm_s16le -sameq output.avi

EDIT: Otro comando que funciona muy bien es:

ffmpeg -f x11grab -r 25 -s 1366x768 -i :0.0+0,0 -vcodec libx264 -preset ultrafast -threads 0 video.mkv

En algunos sitios de internet y blogs se encuentran ejemplos con la opción -vpre lossless_ultrafast sin embargo esto genera el error:
File for preset 'lossless_ultrafast' not found

Para entender el porqué, basta ejecutar:

$ x264 --help

Y podremos ver los presets que están disponibles, los cuales debemos usar como el comando de arriba: -preset ultrafast.

Se pueden encontrar más ejemplos aquí y acá.

Opciones de ffmpeg

Entre las opciones que se le están pasando a ffmpeg, la primera es -f alsa que indica que se forzará a usar un formato de sonido, la opción -i hw:0,0 indica la entrada (input) de donde se tomará el sonido, h:0,0 indica que debe tomarlo de la tarjeta de audio 0 y dispositivo 0, en mi este caso el micrófono pues pretendo hacer videos en los que aparezca mi voz a manera de tutoriales explicativos. Esta configuración tal vez no sea la óptima para videos con fondo musical.

Para listar el hardware de audio de mi laptop ejecuté:

$ cat /proc/asound/cards

Que me dió como resultado:

0 [Intel]: HDA-Intel - HDA Intel
...........HDA Intel at 0xd4700000 irq 45

Lo cual indica que tengo una tarjeta de audio HDA de Intel. Para ver los dispositivos de captura de audio hice:

$ arecord -l

El resultado es:

**** List of CAPTURE Hardware Devices ****
card 0: Intel [HDA Intel], device 0: CONEXANT Analog [CONEXANT Analog]
..Subdevices: 0/1
..Subdevice #0: subdevice #0

Donde se observa que la tarjeta tiene un número 0 y el dispositivo también es 0 por lo que en la entrada de audio el parámetro hw:0,0 es correcto. Éste parámetro es para tomar audio del micrófono.

Luego -f x11grab indica se usará un formato de video, -r 25 configura la frecuencia de las imágenes por segundo a 25 Hz, -s 1366×768 es el tamaño de los cuadros (Ancho x Alto) que en este caso es el valor del tamaño de mi pantalla. -i :0.0+0,0 indica que se tomará la señal de video del monitor y a partir de las coordenadas (offset) 0,0. -acodec pcm_s16le y -vcodec libx264 indican respectivamente el codec de audio y video a utilizar, -sameq indica que se utilizará el mismo cuantizador (quantizer) de fuente. -vpre pone las opciones de video a la configuaración preestablecida (preset) indicada, en este caso lossless_ultrafast y finalmente el nombre del archivo de salida en el formato deseado.

Problema: No se graba el sonido

Tuve un problema pues no se grababa sonido, entonces empecé a investigar la razón, las posibles opciones que se me ocurrieron son:

  • No se reconoce el hardware del micrófono
  • El micrófono está mal configurado

Verificado que efectivamete se reconoce el micrófono en el dispositivo hw:0,0, solo queda checar la configuración del micrófono. Ello se puede checar en la configuración de ALSA. Encontré por la red que el micrófono podía estar en estado Mute por lo que intenté quitar esa configuración.

Para quitar el silencio del micrófono se puede ejecutar lo siguiente:

$ amixer set PCM 100% unmute

Sin embargo, puede ser que otro dispositivo esté causando el problema. Para ver la configuración de todos los dispositivos simplemente hay que hacer:

$ amixer

Aparecerá algo como lo siguiente:

Simple mixer control 'Capture',0
..Capabilities: cvolume cswitch penum
..Capture channels: Front Left - Front Right
..Limits: Capture 0 - 80
..Front Left: Capture 28 [35%] [-46.00dB] [on]
..Front Right: Capture 28 [35%] [-46.00dB] [on]

Este pedazo de código es solamente del dispositivo Capture (puede que hayan otros dispositivos), si el [35%] aparece como [0%] entonces quiere decir que no se está capturando sonido por lo que se puede hacer:

$ amixer set Capture 80%

El porcentaje puede variar dependiendo de lo que se necesite, sin embargo mis videos aún salen con un sonido medio extraño de fondo y mi voz no se escucha del todo bien. Si no se soluciona esto intenten agregar la opción unmute al final de la instrucción.

Funcionó, y por fortuna con ello ya se escucha el audio de mis videos, perfecto para empezar a hacer tutoriales.

Saludos Slackers…