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.
- -f alsa -i default: Sonido Alsa, puede que se tenga que cambiar por pulse en determinados casos o indicar el dispositivo (ej. hw:0,1).
- -f x11grab: Se le indica que grabe el escritorio.
- -s 1920×1080: Se le indica la resolución, en nuestro caso fullHD.
- -r 30: Establece framerate.
- -i :0.0: Display que queremos grabar (se podría usar la variable $DISPLAY)
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