我在 Raspberry Pi 上运行了一些 Python 文件,这些文件会产生声音 (pygame)。我想在播放这些声音时录制它们。
这些是所列设备的输出arecord
:
pi@raspberrypi:~ $ arecord -l
**** List of CAPTURE Hardware Devices ****
card 1: Loopback [Loopback], device 0: Loopback PCM [Loopback PCM]
Subdevices: 8/8
Subdevice #0: subdevice #0
Subdevice #1: subdevice #1
Subdevice #2: subdevice #2
Subdevice #3: subdevice #3
Subdevice #4: subdevice #4
Subdevice #5: subdevice #5
Subdevice #6: subdevice #6
Subdevice #7: subdevice #7
card 1: Loopback [Loopback], device 1: Loopback PCM [Loopback PCM]
Subdevices: 8/8
Subdevice #0: subdevice #0
Subdevice #1: subdevice #1
Subdevice #2: subdevice #2
Subdevice #3: subdevice #3
Subdevice #4: subdevice #4
Subdevice #5: subdevice #5
Subdevice #6: subdevice #6
Subdevice #7: subdevice #7
我尝试了几种录制播放声音的选项arecord
,但无法捕捉系统声音。这根本就不可能,还是还有其他解决方案?
答案1
你没说,但假设你不使用 Pulseaudio。
ps axu | grep pulse
确保你真的未运行 Pulseaudio。如果运行,则以下操作将不起作用。
您modprobe snd_bcm2835
没有创建问题中显示的环回设备。因此,您在某个地方有一个modprobe snd-aloop
,要么您创建了它然后忘记了它,要么它存在于某个配置中。
为了验证,请同时执行aplay -l
和arecord -l
,在两种情况下都应在卡 1 上显示两个设备。
现在让我们测试一下回送设备是否正常工作。找到一个大的 WAV 文件(例如“music.wav”),打开两个终端并执行
aplay -vv -D hw:1,0,0 music.wav
在一个终端,然后
arecord -vv -D hw:1,1,0 -f S16_LE -r 44100 -c 2 /dev/null
在另一个中。参数必须与您的 WAV 文件的格式相匹配。您应该看到 的 VU 表aplay
与 的 VU 表同步移动arecord
。
最后,告诉你的 Python 程序将其用作hw:1,0,0
声音输出设备,不管你的 Python 程序如何工作以及它们需要什么信息来实现这一点。
或者创建一个~/.asoundrc
(每个 Linux 用户)或/etc/asound.conf
(系统范围)并添加如下条目
pcm.!default { type hw card 1 }
ctl.!default { type hw card 1 }
假设snd-aloop
始终将其加载到卡 1 中,并祈祷您的 Python 程序使用它default
作为默认输出。
然后您可以按照上面所述从环回设备的另一端进行录制。
注意:这是一个虚拟的“声卡”,您不会听到通过此“卡”播放和录制的任何声音。如果您想同时收听和录制,我建议您运行 Pulseaudio,这样会容易得多。