Grabar vídeo con audio interno y micrófono con ffmpeg en debian

El otro día me hicieron una pregunta, como podía grabar el audio interno del escritorio y el micrófono a la vez, en este caso mi respuesta fue con pulseaudio y ffmpeg, aunque la cuestión era grabar vídeo con audio interno y micrófono con ffmpeg en debian.

Pues bien para ello tenemos que tener instalado pulseaudio, no voy a explicar como hacerlo, solo el concepto de capturar el audio interno y micrófono y también tenemos que tener ffmpeg.

Para proceder a capturar el audio crearemos un modulo nulo module-null-sink el cual envía toda la salida a /dev/null, lo creamos así:

pactl load-module module-null-sink sink_name=conmimodulo

ahora dentro del modulo creado “conmimodulo” nombre descriptivo vamos a añadir la entrada de audio del micrófono de esta forma:

pactl load-module module-loopback source="alsa_input.usb-PixArt_Imaging_Inc._A4_TECH_PC_Cam-02-Cam.analog-mono" sink=conmimodulo

Una vez cargado este modulo cargaremos la salida de audio del escritorio de la misma manera:

pactl load-module module-loopback source="alsa_output.pci-0000_00_14.2.analog-stereo.monitor" sink=conmimodulo

Para saber que fuente escoger lo podemos ver así:

pacmd list-sources   esta es la salida del micrófono

index: 1
name: <alsa_input.usb-PixArt_Imaging_Inc._A4_TECH_PC_Cam-02-Cam.analog-mono>
driver: <module-alsa-card.c>
flags: HARDWARE HW_MUTE_CTRL HW_VOLUME_CTRL DECIBEL_VOLUME LATENCY
state: RUNNING
suspend cause:
priority: 9049
volume: mono: 44647 /  68% / -10,00 dB
balance 0,00
base volume: 9619 /  15% / -50,00 dB
volume steps: 65537
muted: no
current latency: 0,42 ms
max rewind: 0 KiB
sample spec: s16le 1ch 48000Hz
channel map: mono
Mono
used by: 2
linked by: 2
fixed latency: 99,94 ms
card: 1 <alsa_card.usb-PixArt_Imaging_Inc._A4_TECH_PC_Cam-02-Cam>
module: 7
properties:
alsa.resolution_bits = "16"
device.api = "alsa"
device.class = "sound"
alsa.class = "generic"
alsa.subclass = "generic-mix"
alsa.name = "USB Audio"
alsa.id = "USB Audio"
alsa.subdevice = "0"
alsa.subdevice_name = "subdevice #0"
alsa.device = "0"
alsa.card = "2"
alsa.card_name = "A4 TECH PC Cam"
alsa.long_card_name = "PixArt Imaging Inc. A4 TECH PC Cam at usb-0000:00:12.2-1, high speed"
alsa.driver_name = "snd_usb_audio"
device.bus_path = "pci-0000:00:12.2-usb-0:1:1.2"
sysfs.path = "/devices/pci0000:00/0000:00:12.2/usb1/1-1/1-1:1.2/sound/card2"
udev.id = "usb-PixArt_Imaging_Inc._A4_TECH_PC_Cam-02-Cam"
device.bus = "usb"
device.vendor.id = "093a"
device.vendor.name = "Pixart Imaging, Inc."
device.product.id = "2700"
device.product.name = "A4 TECH PC Cam"
device.serial = "PixArt_Imaging_Inc._A4_TECH_PC_Cam"
device.form_factor = "webcam"
device.string = "hw:2"
device.buffering.buffer_size = "9594"
device.buffering.fragment_size = "2398"
device.access_mode = "mmap"
device.profile.name = "analog-mono"
device.profile.description = "Mono Analógico"
device.description = "A4 TECH PC Cam Mono Analógico"
alsa.mixer_name = "USB Mixer"
alsa.components = "USB093a:2700"
module-udev-detect.discovered = "1"
device.icon_name = "camera-web-usb"
ports:
analog-input-mic: Micrófono (priority 8700, latency offset 0 usec, available: unknown)
properties:
device.icon_name = "audio-input-microphone"
active port: <analog-input-mic>

Para ver los sinks

pacmd list-sinks   este es el que he creado para realizar el vídeo con el nombre conmimodulo

index: 5
name: <conmimodulo>
driver: <module-null-sink.c>
flags: DECIBEL_VOLUME LATENCY FLAT_VOLUME DYNAMIC_LATENCY
state: RUNNING
suspend cause:
priority: 1000
volume: front-left: 65536 / 100% / 0,00 dB, front-right: 65536 / 100% / 0,00 dB
balance 0,00
base volume: 65536 / 100% / 0,00 dB
volume steps: 65537
muted: no
current latency: 9,05 ms
max request: 3 KiB
max rewind: 3 KiB
monitor source: 6
sample spec: s16le 2ch 44100Hz
channel map: front-left,front-right
Estéreo
used by: 2
linked by: 5
configured latency: 20,00 ms; range is 0,50 .. 2000,00 ms
module: 28
properties:
device.description = "Salida Nula"
device.class = "abstract"
device.icon_name = "audio-card"

Y para ver las fuentes:

pacmd list-modules

 

Bueno como podemos observar se nos han dado unos indices y creado los modulos, proseguimos para grabar el vídeo .

El vídeo lo grabaremos de la siguiente forma y lo adaptaremos a lo que queramos grabar

ffmpeg -f x11grab -s 1280x1005 -r 25 -i :0.0+1280,19 -f pulse -i conmimodulo.monitor -ac 2 -b:v 25000k -y conmimodulo.avi

bien indicamos a ffmpeg que queremos grabar el escritorio indicando x11grab con un tamaño de 1280×1005 este sera el tamaño del vídeo y siempre se tiene que ajustar al tamaño que podemos grabar si hubiese puesto 1006 un pixel mas este seria el resultado:

[x11grab @ 0x155cc80] Capture area 1280x1006 at position 1280.19 outside the screen size 2560x1024
:0.0+1280,19: Invalid argument

He indicado que quiero grabar 25 FPS  y la región a grabar esta ubicada en :0.0+1280,19 pues bien empezando desde las coordenadas 0.0 grábame a partir de la 1280,19 que significa, pues grábame la pantalla de la derecha 1280 a partir del pixel 19, osea elimina la barra superior, el error anterior indica el tamaño de mi escritorio 2560×1024 del cual solo grabaremos 1280×1006 empezando por el pixel 1280,19, si queremos saber las coordenadas podemos utilizar xwininfo, queda claro, ¿no?.

Seguimos indico que utilice pulse y en este caso que utilice conmimodulo.monitor en estereo (-ac 2) con una velocidad de salida de bits de 25000k aceptamos sobreescribir conmimodulo.avi

Para ver si funciona vamos a grabar un vídeo en este caso uno incrustado dentro del otro.

 

Para visualizarlo he utilizado mplayer.

mplayer conmimodulo.avi

Eso es todo.