有没有一种简单的、独立于应用程序的方法来在给定的声卡上录制音频?
假设我插入 USB 耳机,显示为/dev/snd/foo
.
然后我使用缩放或Skype或任何其他应用程序拨打电话。
如果应用程序不允许本地录制,我可以在声卡级别独立录制音频吗?
我正在使用 alsa,并且我(天真地)想象可能有一些基础设施可以附加到或“镜像”声卡并将音频转储到文件中?我需要录制两个通道(麦克风、扬声器),所以可能需要一些混合?
我的操作系统是 Debian 10,我正在使用 alsa(不是 pulseaudio)
是的 !有 !
您正在寻找的是简单地记录声卡的输出。
最简单的方法可能是将其输出连接到其输入…… aloop alsa 驱动程序将提供一种无线方式。
A/ 所以首先确保驱动程序已加载并适当初始化:
arecord -l
可以告诉你这一点,显示(在我的系统上):当然,根据您的实现,卡 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/ 开始定义准别名
这个例子与我自己的系统有关:
aplay -L
)然后继续使用环回设备:
2/ 你当然想要混音器
对于ipc_key选择任何唯一的共享内存密钥(使用
ipcs -ma
您选择的未使用的进行检查)。period_size 和 buffer_size 值取决于您对延迟(值越低,延迟越低)和系统性能(值越低,XRun 概率越高)的期望3/当然你希望一切都像以前一样工作(没有conf)
这将在所有支持选择音频输出设备的应用程序上定义 alsa 默认设备。
我们现在需要的是定义一个能够将其输入复制到硬件声音设备和环回设备的伪设备。这要归功于 alsa 的多插件。
4/ 将音频路由到硬件声音设备并复制到环回
请注意,您可能更喜欢 slaves.a.pcm "dmixer",而不是 slaves.a.pcm "MAUDIO"
对于商品,定义一个别名:
D/我们走吧!
如果您选择配置系统范围,则关闭并重新启动;如果您选择配置用户自己的 .asoundrc,则注销登录。从那时起,在任何允许您选择首选音频输出设备的诚实音频应用程序下,您应该能够选择“Alsa Playback & Record”设备,然后在命令行上开始播放:
E/哈!这适用于玩家 A、B、C,但不适用于 D、E、F 应用程序
不幸的是,许多次优应用无法让您选择所需的输出设备。特别是浏览器。因为它们将输出到 alsa 默认 pcm,所以您需要调整配置文件并更改 pcm.!default 描述,如上详述,如下所示:
F / FTS!这仍然不适用于 Firefox 和 Chrome。
1/铬
老实说……我不能说,因为我用的是铬。除非指定 --alsa-output-device 选项,否则 Chromium 将默认为 pulseaudio 输出。所以,应该尝试启动 chrome
--alsa-output-device='default'
并听听它是否有效,它确实达到了我目前的 chromium 962/火狐
无论出于何种原因,Firefox 决定授予 pluseaudio 特权,因此 AFAIK 无法使用官方二进制文件来解决这个问题。但是,从源代码构建 Firefox,有一些 make 选项可以构建 alsa 后端。我不知道如何在 Debian 下实现这一点,但这几乎肯定是可能的。我只能说它适用于我当前的 91.4.0 版本。
学分:由于 OP 需要权威来源,因此此答案中的所有内容均来自:
选择
声音服务器可以作为上述 alsa 摆弄的可行替代方案。(以牺牲一些处理能力为代价)几十年来,首选的声音服务器始终是Jack Audio Connection Kit。Pulseaudio 从未设法竞争。
但是……这是另一个故事。
评论后的附加信息
1/ 采样率
snd-aloop 驱动程序本身不受任何固定采样率的限制。如果需要,它的任何子设备都可以以不同的采样率运行。
但是,第一个打开子设备的应用程序将确定交叉配对子设备的采样率(因为没有进行转换)。
实际上,这意味着播放应用程序以 PBSource Hz 输出,录制应用程序将以 PBSource Hz 采样率捕获样本。
如果这不方便,需要重新采样,它将代表录音应用程序。
ffmpeg 可以即时实现这一点,桌面录制应用程序也是如此(很可能要感谢 ffmpeg)
实际上,这也意味着用于将声音推送到硬件声音设备的伪设备将以 PBSource Hz 对其输入进行采样。
确实可能与声音设备(固定)HW hz 采样率不匹配,这会导致声音不佳。
Alsa 提供了两种方法来克服这个问题,或者通过:
甚至可以通过 defaults.pcm.rate_converter 的定义来选择首选的重采样算法。