Eu resolvi este problema da seguinte forma:
Primeiro, carregue o módulo snd-aloop
:
sudo modprobe snd-aloop
Isso criará um novo dispositivo chamado Loopback
:
± % cat /proc/asound/cards !10017
0 [PCH ]: HDA-Intel - HDA Intel PCH
HDA Intel PCH at 0xc1814000 irq 60
1 [HDMI ]: HDA-Intel - HDA Intel HDMI
HDA Intel HDMI at 0xc1810000 irq 61
2 [Loopback ]: Loopback - Loopback
Loopback 1
A partir das informações mostradas acima, temos que criar dois dispositivos hw
:
-
hw:0,0
(PCH é minha principal placa de som). -
hw:2,1
(o dispositivo virtualLoopback
).
Normalmente, hw
dispositivos têm o formato: hw:X,Y
. Para nossos propósitos, parece que Y
para o cartão principal é sempre 0
enquanto para Loopback
temos Y
igual a 1
.
Agora, para fazer todo esse trabalho, precisamos de um arquivo ~/.asoundrc
com o seguinte:
pcm.!default {
type asym
playback.pcm "LoopAndReal"
#capture.pcm "looprec"
capture.pcm "hw:X1,Y1"
}
pcm.looprec {
type hw
card "Loopback"
device 1
subdevice 0
}
pcm.LoopAndReal {
type plug
slave.pcm mdev
route_policy "duplicate"
}
pcm.mdev {
type multi
slaves.a.pcm pcm.MixReale
slaves.a.channels 2
slaves.b.pcm pcm.MixLoopback
slaves.b.channels 2
bindings.0.slave a
bindings.0.channel 0
bindings.1.slave a
bindings.1.channel 1
bindings.2.slave b
bindings.2.channel 0
bindings.3.slave b
bindings.3.channel 1
}
pcm.MixReale {
type dmix
ipc_key 1024
slave {
pcm "hw:X1,Y1"
rate 48000
#rate 44100
periods 128
period_time 0
period_size 1024 # must be power of 2
buffer_size 8192
}
}
pcm.MixLoopback {
type dmix
ipc_key 1025
slave {
pcm "hw:Loopback,0,0"
rate 48000
#rate 44100
periods 128
period_time 0
period_size 1024 # must be power of 2
buffer_size 8192
}
}
Modifique hw:X1,Y1
com os valores da sua placa principal (no meu caso hw:0,0
).
Você pode testar se essa configuração funciona reproduzindo algo em seu computador. Se você ouvir, então está bem. Agora vamos jogar algo no computador e gravá-lo deste dispositivo virtual com ffmpeg
:
ffmpeg -f alsa -i hw:X2,Y2 -c:a libmp3lame -b:a 256k -vn capture.mp3
Em que hw:X2,Y2
precisa ser substituído pelo dispositivo Loopback
, neste caso
hw:2,1
.
Suponho que usar arecord
também funcione.