Capturar la pantalla en Linux

Hace unos días quería hacer una captura de mi pantalla mientras jugaba un juego; tras una rápida búsqueda en internet encontré que en Linux es bastante sencillo capturar la pantalla con programas que vienen instalados o se pueden instalar fácilmente en cualquier distro.

Hay muchas alternativas para hacer la captura pero se puede hacer directamente desde una ventana de terminal a través de FFmpeg o Libav; en mi caso, al revisar la lista de paquetes instalados encontré que ya tenía instalado Libav así que decidí probarlo. Como dije, resultó ser bastante fácil, sin bien los argumentos usados en la terminal no son necesariamente obvios. En todo caso, para capturar la pantalla en Linux con Libav, usé el siguiente comando:

monstruosoft@PC:~$ avconv -f alsa -i hw:0 -f x11grab -r 15 -s 1366x768 -i :0.0+0,0 -vcodec h264 -acodec libmp3lame -ar 44100 -r 15 -b:v 4096k -preset ultrafast mi-video.mp4

Si nunca has usado la terminal esto debe parecer complicado (y las opciones pueden ser diferentes en tu caso) pero este comando básicamente está indicando que se capture la pantalla con el correspondiente audio de salida con una resolución de 1366×768 píxeles y 15 cuadros por segundo; el video final será guardado con el nombre de mi-video.mp4 usando el codec de video h264 y el codec de audio lamemp3; se usará la configuración ultrafast de captura del codec para reducir el uso del CPU.

Simple, ¿cierto? :P.

Al capturar el video uso la configuración ultrafast y un bitrate constante de 4096 kbps debido a que mi PC no es muy poderosa pero como resultado el archivo final puede ser muy grande (por ejemplo, tengo un archivo de ~40 minutos que pesa 1.2 GB). Para reducir el tamaño del archivo acostumbro volverlo a comprimir una vez que he terminado la grabación usando el método de 2 pass encoding para controlar el tamaño del archivo final. Para reducir el tamaño de un video usando el método de 2 pass encoding, uso los siguiente comandos:

monstruosoft@PC:~$ avconv -i mi-video.mp4 -c:v libx264 -preset medium -b:v 800k -pass 1 -an -f null -
monstruosoft@PC:~$ avconv -i mi-video.mp4 -c:v libx264 -preset medium -b:v 800k -pass 2 -c:a copy mi-video-recomprimido.mkv

De esta forma se puede reducir el tamaño de los videos capturados sin tener una pérdida notable en la calidad del video. Por ejemplo, un video capturado con un bitrate de video de 4096 kbps con un peso de ~590 MB fue reducido a ~130 MB usando los comandos anteriores. Dependiendo del tipo de material que estés grabando puedes incluso usar un bitrate más bajo.

Este método para grabar la pantalla ha probado ser útil para lo que necesitaba pero tiene un pequeño detalle y es que el audio y el video pueden no estar perfectamente sincronizados. Dependiendo del tipo de captura que estés realizando, esto puede ser un problema. He leído que el FFmpeg no tiene este problema así que tal vez haga la prueba en otro post. De momento, si sabes como solucionarlo en el Libav, deja un comentario ;).

En mi caso, el audio y el video están fuera de sincronía por un con una diferencia constante de tiempo; es decir, si aplicas un retraso a la pista de audio en tu reproductor favorito, puedes corregir el problema de sincronización. También puedes corregir la sincronización en el archivo final usando las opciones del FFmpeg o Libav. Por ejemplo, para corregir el problema en el video recomprimido del ejemplo anterior, lo primero que hay que hacer es encontrar cual es el retraso que hay que aplicar (en mi caso lo hice usando el reproductor MPlayer y ajustando el retraso de la pista de audio con las teclas + y -); a continuación hay que usar el FFmpeg o Libav para aplicar el retraso; la forma de hacerlo la obtuve de esta página que explica de una forma muy clara la función del argumento -map. Básicamente, para aplicar un retraso de, por ejemplo, 1.5 segundos, hay que usar un comando como el siguiente:

monstruosoft@PC:~$ avconv -i video-recomprimido.mkv -itsoffset 1.5 -i video-recomprimido.mkv -map 0:0 -map 1:1 -acodec copy -vcodec copy video-sincronizado.mkv

Nota que este comando se aplica sobre el video recomprimido aunque se puede hacer también desde el paso incial. En este caso, ya que el video ya ha sido recomprimido, usamos el codec copy tanto para el audio como para el video para evitar que se vuelva a recodificar y de esta forma acelerar el proceso.

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s