混合两个音频流的说明

混合两个音频流的说明

对于广播设置,我想将输入设备中的音频与 .wav 文件中的音频混合。 .wav 文件包含介绍、等待或退出音乐,我想在广播期间的某个时间点将其添加到音乐中。

以下设置是目标: 在此输入图像描述

需要多个步骤:

  1. 添加/混合两个流
  2. 转换为单声道(或者也许这应该首先完成)
  3. 将流拆分为广播流和 VU 表
  4. 将流发送到本地音频输出

我很确定这一定是可能的,但我在互联网上找不到任何解决方案。深入研究 alsa 的 .asoundrc 尚未产生任何结果。似乎 alsa dmix 做了一些混合,但不是我想要的......

我真的不知道从哪里开始。

有人可以解释一下吗?部分解决方案也很好!

答案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,但我没有配置它的经验。

相关内容