AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 686940
Accepted
400 the Cat
400 the Cat
Asked: 2022-01-19 20:41:52 +0800 CST2022-01-19 20:41:52 +0800 CST 2022-01-19 20:41:52 +0800 CST

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

  • 772

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

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

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

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

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

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

audio alsa
  • 1 1 个回答
  • 767 Views

1 个回答

  • Voted
  1. Best Answer
    MC68020
    2022-01-24T09:45:08+08:002022-01-24T09:45:08+08:00

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

    是的 !有 !

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

    最简单的方法可能是将其输出连接到其输入…… aloop alsa 驱动程序将提供一种无线方式。

    A/ 所以首先确保驱动程序已加载并适当初始化:

    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 可能与上述列表不同。

    如果您没有获得该输出,则可能是因为未加载驱动程序因此触发: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/当然你希望一切都像以前一样工作(没有conf)

    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”设备,然后在命令行上开始播放:

    • “loopout”设备上的记录
    • 如果希望重新采样/其他文件格式,则在“loopout”设备上使用 ffmpeg。
    • 启动任何更方便的音频录制桌面实用程序,例如audacity。

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

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

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

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

    1/铬

    老实说……我不能说,因为我用的是铬。除非指定 --alsa-output-device 选项,否则 Chromium 将默认为 pulseaudio 输出。所以,应该尝试启动 chrome--alsa-output-device='default'并听听它是否有效,它确实达到了我目前的 chromium 96

    2/火狐

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


    学分:由于 OP 需要权威来源,因此此答案中的所有内容均来自:

    • 官方 Alsa 项目 asoundrc 页面,
    • FFmpeg 官方维基

    选择

    声音服务器可以作为上述 alsa 摆弄的可行替代方案。(以牺牲一些处理能力为代价)几十年来,首选的声音服务器始终是Jack Audio Connection Kit。Pulseaudio 从未设法竞争。

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


    评论后的附加信息

    1/ 采样率

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

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

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

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

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

    • 9

相关问题

  • 如何检索给定轨道 ID 的音频通道、比特率和其他质量测量值

  • 无法设置内核模块参数

  • 将 MKV 内的音频转换为 AC3 或 DTS,保留 6.1 声道

  • Kali 无法识别我的声卡

  • 如何在 Arch Linux 上设置音频,支持多个程序同时发出音频而不创建 asoundrc?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    模块 i915 可能缺少固件 /lib/firmware/i915/*

    • 3 个回答
  • Marko Smith

    无法获取 jessie backports 存储库

    • 4 个回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    user12345 无法获取 jessie backports 存储库 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl 为什么大多数 systemd 示例都包含 WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve