Comando básico para grabar el/los escritorio/s con ffmpeg (Máxima calidad) + Audio

La posibilidad de grabar de manera exitosa el escritorio con ffmpeg va a depender del tamaño de nuestra pantalla y de los recursos del sistema. Hay que tener en cuenta que muchas computadoras no van a poder grabar correctamente a la vez que codifican, comprimen, etc. Por lo tanto se plantearan dos soluciones dependiendo de los recursos de cada uno.

Identificar qué entrada de audio se quiere utilizar (Alsa / PulseAudio)

## Alsa (Dos dispositivos, device 0 (hw:0) y Device 2 (hw:1))
arecord -l
**** List of CAPTURE Hardware Devices ****
card 0: PCH [HDA Intel PCH], device 0: ALC892 Analog [ALC892 Analog]
  Subdevices: 1/1
  Subdevice #0: subdevice #0
card 0: PCH [HDA Intel PCH], device 2: ALC892 Alt Analog [ALC892 Alt Analog]
  Subdevices: 1/1
  Subdevice #0: subdevice #0
 
 
## PulseAudio (Dos dispositivos, el 2 (output, es decir sonido saliente) y 3 input, normalmente un micrófono, sonido entrante)
pactl list short sources
2	alsa_output.pci-0000_00_1f.3.analog-stereo.monitor	module-alsa-card.c	s16le 2ch 44100Hz	RUNNING
3	alsa_input.pci-0000_00_1f.3.analog-stereo	module-alsa-card.c	s16le 2ch 44100Hz	RUNNING

Este comando realiza un vídeo del escritorio a la mejor calidad posible.

# Pulse audio. (El dispositivo se puede especificar por nombre o por número).
ffmpeg -f pulse -i default -f x11grab -s 1920x1080 -r 30 -i :0.0 -c:v libx264 video.mkv
ffmpeg -f pulse -i 2 -f x11grab -s 1920x1080 -r 30 -i :0.0 -c:v libx264 video.mkv # Sonido normal (salida de audio).
ffmpeg -f pulse -i alsa_input.pci-0000_00_1f.3.analog-stereo	 -f x11grab -s 1920x1080 -r 30 -i :0.0 -c:v libx264 video.mkv # Sonido de micrófono
 
# Alsa (El dispositivo se especificar usando su número)
ffmpeg -f alsa -i default -f x11grab -s 1920x1080 -r 30 -i :0.0 -c:v libx264 video.mkv
ffmpeg -f alsa -i hw:0 -f x11grab -s 1920x1080 -r 30 -i :0.0 -c:v libx264 video.mkv # Usando el dispositivo 0 que muestra "arecord -l".

Grabar el escritorio cuando en pruebas anteriores se ve el vídeo de escritorio muy acelerado y el audio entrecortado (falta de recursos). Para ello indicaremos que se use menos CPU y por lo tanto el tamaño del fichero será más grande, pero puede ser posteriormente comprimido.

# Pulse audio.
ffmpeg -f pulse -i default -f x11grab -s 1920x1080 -r 30 -i :0.0 -c:v libx264 -preset ultrafast -crf 0 -max_muxing_queue_size 4096 video.mkv
# Alsa.
ffmpeg -f alsa -i default -f x11grab -s 1920x1080 -r 30 -i :0.0 -c:v libx264 -preset ultrafast -crf 0 -max_muxing_queue_size 4096 video.mkv

NOTA: Si no se quiere grabar con audio se pueden obviar las opciones “-f alsa -i default” (o el dispositivo que se esté usando si no es “default”).

Es posible que el audio tenga un poco de retraso con respecto al vídeo, pero es algo que se puede corregir también con ffmpeg posteriormente una vez se tenga el fichero mkv. Consultar el enlace al final del artículo.

Si se ha usado el método “ultrafast” para evitar un alto consumo de recursos que impida la grabación en tiempo real, una vez se tiene el fichero mkv, este puede ser ya de nuevo codificado pero esta vez sin usar “ultrafast”. También se podría aprovechar para agregar otras opciones como la sincronización de sonido o cualquier otra.

ffmpeg -i video.mkv video_normal.mkv
 
du -hcs video*
35M video.mkv
2M video_normal.mkv

NOTA: Muchas televisiones no soportan ficheros MKV si no se aporta la siguiente opción “-pix_fmt yuv420p”. También muchas televisiones tienen problemas con codecs de sonidos, siendo el mp3 uno bien soportado. Por lo tanto si se quiere hacer le fichero mkv compatible con muchos dispositivos yo recomendaría este comando.

ffmpeg -i video.mkv -c:a libmp3lame -pix_fmt yuv420 video_normal.mkv
# Ejemplo del comando anterior pero adelantando el audio un segundo: Consultar enlace al final del post para entender el procedimiento.
ffmpeg -itsoffset 1 -i video.mkv -i video.mkv -map 0:0 -map 1:1 -c:a libmp3lame -pix_fmt yuv420 video_normal.mkv

Obtener la resolución por terminal.

xdpyinfo  | grep 'dimensions:'
xrandr | grep '*'

Grabar el escritorio cuando se tienen múltiples monitores.

# Identificar monitores y su resolución
xrandr | grep '*'
   1920x1080     60.00*+  50.00    59.94  
   1280x1024     60.02*+  75.02  
 
# La suma de esos dos monitores es 3200x1080 (1920 + 1280 = 3200)
 
# Grabar en vídeo el escritorio completo (sumando en este caso los dos monitores).
ffmpeg -f alsa -i default -f x11grab -s 3200x1080 -r 30 -i :0.0 video.mkv
 
# Grabar en vídeo únicamente la parte del escritorio que pertenece a la pantalla de 1280x1024 (a la derecha).
ffmpeg -f alsa -i default -f x11grab -s 1280x1024 -r 30 -i :0.0+1920,0 video.mkv

NOTA: Si se dispone de poca potencia de procesamiento, revisar opción ultrafast del principio del artículo.

Opciones del comando ffmpeg.

Localizar el dispositivo de Audio.

aplay -l

**** List of CAPTURE Hardware Devices ****
card 1: PCH [HDA Intel PCH], device 0: ALC892 Analog [ALC892 Analog]
  Subdevices: 1/1
  Subdevice #0: subdevice #0
card 0: PCH [HDA Intel PCH], device 2: ALC892 Alt Analog [ALC892 Alt Analog]
  Subdevices: 1/1
  Subdevice #0: subdevice #0

Ejemplo de dispositivo de audio: hw:1,0

card 1: PCH [HDA Intel PCH], device 0: ALC892 Analog [ALC892 Analog]

Ejemplo de dispositivo de audio: hw:0,2

card 0: PCH [HDA Intel PCH], device 2: ALC892 Alt Analog [ALC892 Alt Analog]

Cortar el vídeo (Primeros 5 minutos).

mencoder -ss 00:00:00 -endpos 00:05:00 -oac copy -ovc copy video.mkv -o primeros_5min.mkv

Comprimir y transformar a flv. Ajustar el valor https://trac.ffmpeg.org/wiki/Encode/H.264#crfCRF según las compresión deseada.

ffmpeg -i video.mkv -c:v libx264 -crf 30 video.flv
 
# -crf 30
du -m video.mkv video.flv
23	video.mkv
14	video.flv

Subir volumen con ffmpeg (-af “volume=X”): https://trac.ffmpeg.org/wiki/How%20to%20change%20audio%20volume%20up-down%20with%20FFmpeg

# Volumen triplicado.
ffmpeg -thread_queue_size 1024 -f alsa -i default -thread_queue_size 1024 -f x11grab -s 1920x1080 -r 30 -i :0.0 -af "volume=3" video.mkv

Problemas de sincronización al grabar sonido.

Press [q] to stop, [?] for help
[alsa @ 0x5594d2cba0e0] ALSA buffer xrun.
[x11grab @ 0x5594d2cbc700] Thread message queue blocking; consider raising the thread_queue_size option (current value: 8)
[alsa @ 0x5594d2cba0e0] Thread message queue blocking; consider raising the thread_queue_size option (current value: 8)
[alsa @ 0x5594d2cba0e0] ALSA buffer xrun.
[alsa @ 0x5594d2cba0e0] ALSA buffer xrun.B time=00:00:01.70 bitrate=1690.4kbits/s    
[alsa @ 0x5594d2cba0e0] ALSA buffer xrun.B time=00:00:02.41 bitrate=1247.6kbits/s    
[alsa @ 0x5594d2cba0e0] ALSA buffer xrun.B time=00:00:03.46 bitrate= 893.0kbits/s

Solución: Agregar la opción “-thread_queue_size”.

ffmpeg -thread_queue_size 1024 -f alsa -i default -thread_queue_size 1024 -f x11grab -s 1920x1080 -r 30 -i :0.0 video.mkv

Comandos útiles de ffmpeg: https://www.busindre.com/comandos_ffmpeg_utiles