alsa:记录给定声卡上的所有内容

alsa:记录给定声卡上的所有内容

是否有一种简单的、独立于应用程序的方法来在给定的声卡上录制音频?

假设我插入了 USB 耳机,它显示为/dev/snd/foo

然后我使用 Zoom 或 Skype 或任何其他应用程序拨打电话。

如果应用程序不允许本地录音,我可以在声卡级别独立录制音频吗?

我正在使用 alsa,我(天真地)想象可能有一些基础设施可以附加到或“镜像”声卡并将音频转储到文件?我需要录制两个通道(麦克风、扬声器),所以可能需要一些混音?

我的操作系统是 Debian 10,我使用的是 alsa (不是pulseaudio)

答案1

是否有一种简单的、独立于应用程序的方法来在给定的声卡上录制音频?

是的 !有 !

您正在寻找的是简单地记录声卡的输出。

最简单的方法可能是将其输出连接到输入......一个循环alsa驱动将提供无线方式。

答/ 因此,首先确保驱动程序已加载并适当初始化:

arecord -l可以告诉你这一点,显示(在我的系统上):

card 0: 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 0: 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

当然,根据您的实现,卡 ID 可能与上面的列表不同。

如果您没有获得该输出,则可能是因为驱动程序未加载,因此 fire : modprobe snd-aloop

如果您仍然不成功,请确保在内核 .config 文件中选择驱动程序(grep for CONFIG_SND_ALOOP)

B/ 基本上确保它按预期工作

该驱动程序提供一对交叉连接的设备,形成全双工环回声卡。打开一个设备的第一个应用程序将强制尝试打开另一个设备的第二个应用程序使用其已建立的参数。因此,不进行速率、格式或通道号转换。这样做的结果是,您必须首先启动播放应用程序。因此,让我们确保它按预期工作:

1/找到任何 .wav 文件并将其播放到卡 0 设备 0 子设备 0 :aplay -D hw:0,0,0 whatever.wav

2/从关联的交叉连接设备卡0设备1子设备0记录:arecord -D hw:0,1,0 record.wav

当然,您可能需要根据您的配置调整卡 ID。

3/通过在 alsa 默认设备上播放 record.wav 确保它正常工作:aplay record.wav。如果您听不到任何声音,这可能是因为一些基本的 alsa 配置错误。 (如果需要我可以详细说明)

当然,像这样工作(将播放定向到环回,输出不会发送到您的默认播放设备,因此您在录制时将听不到任何声音。无论如何,这可以通过某些特定的 alsa 配置实现。

C/ 让音频在您耳中播放并启用录音

警告! :这将是工作中最困难的部分,因为 alsa 配置文件始终需要......魔法的重要部分。

为此,您需要从头开始构思 /etc/asound.conf 文件(如果您的配置适用于系统范围)或 $HOME/.asoundrc (如果配置适用于您的唯一用户),以便创建几个虚拟声音设备。

1/开始定义准别名

pcm.MAUDIO{
    type hw
    card M2496
    device 0
    subdevice 0
    nonblock true}

ctl.MAUDIO{
    type hw
    card M2496}

这个例子与我自己的系统相关:

  • MAUDIO(选择您想要的任何内容)充当别名,以供将来参考硬件声音设备,
  • M2496 来自与我首选的声音播放硬件设备关联的 CARD=M2496(您应该根据您的输出进行调整aplay -L
  • nonblock true 因为您不希望 Alsa 锁定与声卡设备驱动程序关联的字符特殊文件 (/dev/snd/pcmwhatever)。 (所以比任何其他应用程序也可以在需要时打开它)

然后继续使用环回设备:

pcm.loopin {
    type plug
    slave.pcm "hw:Loopback,0,0"
}

pcm.loopout {
    type plug
    slave.pcm "hw:Loopback,1,0"
}

2/ 当然你需要一个搅拌机

pcm.dmixer{
    type dmix
    ipc_key 219345
    slave{
        pcm MAUDIO
        format S32_LE
        period_size 1024
        buffer_size 4096 }}

为了ipc_key选择任何唯一的共享内存密钥(检查ipcs -ma您选择的那个是否未被使用)。 period_size 和 buffer_size 值取决于您对延迟的期望(值越低,延迟越低)和系统性能(值越低,XRun 的概率越高)

3/ 当然你希望一切都像以前一样工作(无配置)

pcm.!default{
    type plug
    slave.pcm "dmixer"
    hint{
        show on
        description "Alsa Default Device"}}

这将定义所有允许选择音频输出设备的应用程序上描述的 alsa 默认设备。

我们现在需要的只是定义一个伪设备,能够将其输入复制到硬件声音设备和环回设备。这要归功于 alsa 的插入。

4/ 将音频路由到硬件声音设备并复制到环回

pcm.multi {
    type route;
    slave.pcm {
        type multi;
        slaves.a.pcm "MAUDIO";
        slaves.b.pcm "loopin";
        slaves.a.channels 2;
        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;
    }

    ttable.0.0 1;
    ttable.1.1 1;
    ttable.0.2 1;
    ttable.1.3 1;
}

请注意,您可能更喜欢slaves.a.pcm“dmixer”,而不是slaves.a.pcm“MAUDIO”

对于商品,定义一个别名:

pcm.pbnrec {
    type plug
    slave.pcm "multi"
    hint{
        show on
        description "Alsa Playback & Record"}}

D/我们走吧!

如果您选择配置系统范围,则关闭并重新启动;如果您选择配置用户自己的 .asoundrc,则注销登录。从那时起,在任何允许您选择首选音频输出设备的诚实音频应用程序下,您应该能够选择“Alsa Playback & Record”设备,然后在命令行上开始播放:

  • “循环”设备上的 arecord
  • 如果希望重新采样/其他文件格式,请在“循环”设备上使用 ffmpeg。
  • 启动任何更方便的录音桌面实用程序,例如大胆

E/哈!这适用于玩家 A、B、C,但不适用于 D、E、F 应用程序

不幸的是,许多次优应用程序无法让您选择所需的输出设备。特别是浏览器。因为它们将输出到 alsa 默认 pcm,所以您需要调整配置文件并更改 pcm.!default 描述,如下所示:

pcm.!default {
    type plug
    slave.pcm "pbnrec"
}

F/FTS!这仍然不适用于 Firefox 和 Chrome。

1/铬合金

说实话……我不能说,因为我使用了。 Chromium 将默认为脉冲音频输出,除非指定 --alsa-output-device 选项。所以,应该尝试启动 chrome--alsa-output-device='default'并听听它是否有效,它确实符合我当前的 chromium 96

2/火狐浏览器

无论出于何种严重原因,Firefox 决定授予 pluseaudio 特权,因此据我所知,没有办法使用官方二进制文件来解决这个问题。然而,从源代码构建 Firefox 时,有一些 make 选项可以启用 alsa 后端的构建。我不知道如何在 Debian 下实现这一点,但这几乎肯定是可能的。我只能说它适用于我当前的 91.4.0 版本。


学分:由于OP想要权威来源,所以这个答案中的所有内容都是从以下内容详细阐述的:


选择

声音服务器可以作为上面描述的 alsa fiddles 的可行替代方案。 (以一些处理能力为代价)数十年来,声音服务器始终是首选插孔音频连接套件。Pulseaudio 从未参与过竞争。

但是……这是另一个故事了。


评论后的附加信息

1/ 采样率

snd-aloop 驱动程序本身不受任何固定采样率的限制。如果需要,它的任何子设备都可以以不同的采样率运行。
但是,第一个打开子设备的应用程序将确定交叉配对子设备的采样率(因为未完成转换)。

实际上,这意味着播放应用程序以 PBSource Hz 输出,录制应用程序将以 PBSource Hz 采样率捕获样本。
如果这不方便,需要重新采样,它将代表录音应用程序。
ffmpeg 可以动态实现这一点,桌面录音应用程序也是如此(很可能要归功于 ffmpeg)

实际上,这也意味着用于将声音推送到硬件声音设备的伪设备将以 PBSource Hz 对其输入进行采样。
确实可能与声音设备(固定)HW hz 采样率不匹配,这会导致音质不佳。
Alsa 提供了两种方法来克服这个问题:

  • 使用速度插件将强制重采样到给定频率。这在某种程度上不是最理想的,因为 alsa 随后会系统地重新采样。 (即使源的采样率和给定的采样率相同)
  • 使用混合插件(参见上文§C-2,3)将自动重新采样,但仅在需要时进行。

人们甚至可以通过 defaults.pcm.rate_converter 的定义选择首选的重采样算法。

相关内容