使用 arecord、parec 或 jackd 播放或监控音频输入的理想方式是什么?

使用 arecord、parec 或 jackd 播放或监控音频输入的理想方式是什么?

尽管我尽力在 arecord 之后将输出通过管道传输到 tee 中,但我还是无法将录制的音频输入传输到我的音频设备(一个由 alsa 驱动的 hifiberry 和托管在树莓派上的 adc)上,安装并设置pulseaudio 并利用 parec,如下所示以及 jackd 和 jack_capture。

我的任务的关键图:

线路电平音频 -> ADC -> PCM/Wav 文件 -> DAC -> 线路电平音频。

问题是在录制过程中不会播放任何输出。

我正在录制线路电平输入并想听听。延迟并不重要,但我预计延迟为 200 毫秒或更短。

我已经成功地实现了这个令人难以置信的黑客解决方案,该解决方案只是在一个终端窗口中“arecord”并在另一个终端窗口中“aplay”(有效),但这不可能是我的问题的解决方案。

使问题更加复杂的是,我在谷歌上搜索这一问题的尝试惨遭失败,因为谷歌认为我只是试图将一个应用程序的输出捕获到文件中。我不是。我想监控声卡的输入。在 Apple 的 Logic Pro 中,这被称为“软件监控”——我认为这很容易。我也看到过它被称为“play-through”,但也许这是别的东西。

我对pulseaudio 抱有希望——他们说这只是“源和汇”。

我确实成功地用pulseaudio的parec、alsa的arecord和jackd + jack_capture录制了pcm文件。我显然错过了一些明显的东西。

parec -d alsa_input.platform-soc_sound.stereo-fallback | sox -t raw -b 16 -e signed -c 2 -r 44100 - /mnt/audio/pulsetest.wav

显然,我的操作系统和硬件可以“双工”,因为我可以同时进行录音和播放。

可以这样做还是我应该继续使用 arecord 和 aplay?

答案1

请尝试类似的东西

pacmd load-module module-loopback source="alsa_input.platform-soc_sound.stereo-fallback" sink="alsa_output.whatever"

其中“alsa_output.whatever”是线路输出接收器的实际名称。您可以看到水槽

pacmd list-sinks | grep name:

我认为“环回”是一个专门用于捕获系统音频的术语

“环回”是一个通用术语,用于将某些输出发送回某些输入。您有一个用于网络的环回接口 ( lo)、真实 LAN 设备上的环回功能、ALSA 环回驱动程序和 Pulseaudio 环回模块,可能还有更多。

我在脉冲配置中设置了默认样本格式和速率

不要这样做,Pulseaudio 会重新采样。不要搞乱其他任何东西,只需建立module-loopback从源到接收器的连接即可。

事情应该如此简单。

很简单。我不知道你在做什么让事情变得困难。

我想我应该拿出一个嗅探器来探测芯片,看看 alsa 在做什么。

这是一件有趣的事情(特别是在真正的 PC 上,使用 Intel HDA 驱动程序 - 在 RaspPi 上,这非常无聊),但由于您正在处理 Pulseaudio 级别,而不是 ALSA,因此可能没有帮助。由于您有工作aplayarecord,这不应该是问题。


如果您有额外的要求(您在问题中从未提及)让源和接收器使用 96k/24 位,那么这将是 Pulseaudio 中的一个旅程:Pulseaudio 设计为以合理的方式运行 ALSA 硬件源/接收器默认值,然后根据需要在流式传输时进行上采样/下采样。摆弄 Pulseaudio 内部结构来改变这一点是很棘手的。

看看模块环回文档:您可以使用额外参数设置所需的速率和格式(这就是您应该做的),但不能保证源和接收器最终会处于此模式,并且 Pulseaudio 不会在某处进行重新采样。

你也没有说这个要求从何而来;如果你想使用RaspPi做专业级音频处理(DAW,数字音频工作站),那么JACK是比Pulseaudio更好的选择。但这一切都取决于您的情况。

也就是说,如果你module-loopback和 一起跑步parec --rate=96000 --format=s24le,那么当然它无法更改正在运行的接收器上的比特率和格式,但如果您已经获得了所需的格式和比特率,那么就不用管它并高兴了。

是的,使用 Pulseaudio,您可以将来自源的多个流以及多个流放入接收器中。

相关内容