答案1
最简单的方法是使用 Pulseaudio。 (你可以使用 ALSA 来做到这一点,但配置起来会很痛苦。)
所有产生声音的东西都会在当前输出上自动混合(Pulseaudio 术语中的“接收器”),因此您无需担心混合。您可以使用 控制卷pavucontrol
,它会通过应用程序名称记住最后一个卷。您可以使用paplay
命令行播放 wav 文件,但任何其他音频播放器也可以。
如果您的接收器是单声道的,则会自动转换为单声道。如果您无法为此配置本地 RaspPi 接收器(我不知道,我没有 RaspPi),您可以添加一个“伪”接收器
pactl load-module module-null-sink sink_name=whatever
或者如果事实证明您需要在 Pulseaudio 中重新映射module-remap-sink
(见下文,我自己还没有尝试过)。
该接收器或本地 RaspPi 接收器将有一个关联的.monitor
源,您可以使用它将其分发到icecast等。
您可以将 hw:1 输入设置为您选择的接收器的永久提要:
pacmd load-module module-loopback source="alsa_input.name_of_hw_1" sink="whatever_or_local_sink"
您可以列出可用的接收器名称
pacmd list-sinks | grep name:
作为参数,使用不带尖括号的名称。
我认为这就是基础知识。了解可用的 Pulseaudio模块,并且pacmd help
会告诉您如果您不想使用pavucontrol
.
编辑为了阿尔萨斯:
首先,阅读有关可用的插件。您将需要一个“虚拟声卡”来将音频路由到 darkice 等。这是一个内核模块,所以请执行类似的操作
sudo modprobe snd-aloop pcm_substreams=2
/etc/modprobe.d
用于测试,并在工作时放入文件。假设环回是hw:3,*,*
.
在虚拟声卡的输入端,您需要类似的东西
dmix "main_in" --> 插头 (slave.channels = 1) --> hw:3,0,0
然后你就可以aplay -D main_in sound.wav
运行
alsaloop -C hw:0 -P main_in
将其连接到音频采集器。
在虚拟声卡的输出端,类似
硬件:3,1,0 --> dsnoop“main_out”
并再次在本地音频输出上监视它
alsaloop -C main_out -P local_audio_out
然后您可以darkice
直接在 上运行 VU 表main_out
。 BTW,arecord -D main_out -d 0 -vv /dev/null
是一个很好的测试 VU 计。
请阅读上面链接中有关语法的详细信息,我不打算尝试这个。箭头-->
表示插件的主从关系。延迟可能会很可怕,因为一次环回会穿过内核空间和大量用户空间应用程序。
如果 Pulseaudio 不适合您,另一种选择是jack
,但我没有配置它的经验。