我的音频一直有问题。当我捕获音频时,除非我指定正确的设备(见下文),否则我会捕获播放音频。因此,捕获的不是我的 USB 麦克风,而是通过耳机播放的声音。
我不确定发生了什么以及如何修复它。我正在使用 ALSA 和 Pulseaudio,我的 asound.conf 是 Pulseaudio 生成的默认文件。输出cat /proc/asound/cards
:
0 [PCH ]: HDA-Intel - HDA Intel PCH
HDA Intel PCH at 0xf7910000 irq 29
1 [NVidia ]: HDA-Intel - HDA NVidia
HDA NVidia at 0xf7080000 irq 17
2 [C01U ]: USB-Audio - Samson C01U
Samson Technologies Samson C01U at usb-0000:00:14.0-9, full speed
输出amixer -c0 contents
:https://pastebin.com/cyERFpPk
为了在测试麦克风时录制声音,我使用了 audacity,并将录音设备设置为,Samson C01U:USB Audio (hw:2,0): Front Mic:0
并使用 arecord 设置为arecord -d 2 -D hw:2,0 -f cd test.wav
。两者都从我的麦克风录制声音,但是当从播放声音时arecord
,它只通过耳机的左侧播放。
我还注意到了另一个问题。随着时间的推移(尤其是当我调整音频音量时),我开始在听音频时听到一些静电噪音。有时噪音非常微弱,有时又非常大。我从来没有遇到过这种情况。我可以通过重新启动 pulseaudio 来解决这个问题,但这样做很烦人。
我的/etc/asound.conf
:https://pastebin.com/2XSEhfHb。我没有~/.asoundrc
。
答案1
好的,快速概述一下事物的工作原理。
您的 Intel HDA 声卡与“编解码器”芯片有数字连接,该芯片包含 D/A 和 A/D 转换器、模拟混频器、模拟放大器和模拟开关。ALSA 具有声卡的内核驱动程序,并分配您可以看到的混频器元素来amixer
控制编解码器中的某些(但不是全部)内容。
您可以通过系统范围/etc/asound.conf
或每个用户使用“插件”配置 ALSA ~/.asoundrc
。
Pulseaudio 在 ALSA 上运行,并为应用程序提供统一的音频传输机制。它负责采样率转换等,这使得 Pulseaudio 比 ALSA 更易于使用(原则上)。标准配置是 Pulseaudio 为旧版 ALSA 应用程序提供了一个兼容层,其中包含以下条目
pcm.!default pulse
ctl.!default pulse
这些设置默认的 ALSA 输入和输出,使得 ALSA 应用程序被视为 Pulseaudio 应用程序。因此,当您使用arecord
或audacity
(而不是 ALSA 应用程序)与默认 ALSA 输入时,您实际上是在使用 Pulseaudio(您也可以使用parecord
直接访问 Pulseaudio)。但是当您选择 时hw:XXX
,您将直接从 ALSA 驱动程序进行录制。
pavucontrol
Pulseaudio 有自己的(非常灵活的)音频源和接收器概念。您可以使用(以及在许多桌面环境和类似的桌面面板上)查看(和修改)哪些应用程序连接到哪些源和接收器。
因此,如果您运行arecord
并使用pavucontrol
,它应该会显示并从属于 Intel HDA 声卡(通常是“内置音频模拟立体声”)的源进行记录。
为什么它会录制同时播放的声音?您必须更详细地查看编解码器(您可以使用 来做到这一点cat /proc/asound/card*/codec\#*
),但您的输出中有一个名为“环回混音”的混音器控件amixer
,并且已启用。所以我猜您的编解码器包含一个允许您录制当前输出的声音的功能。在 中禁用它alsamixer
,看看是否有任何变化。
如何设置它以自动从 Samson USB 麦克风录音?您可以在 ALSA 中配置默认值,但如果您想保留 Pulseaudio,则应改为配置 Pulseaudio。您可以在pavucontrol
应用程序运行时为每个应用程序选择音频源,Pulseaudio 会记住这些设置。您还可以通过单击“设置为后备”来设置默认音频源输入tab,或者pacmd set-default-source my_source
从命令行使用。pacmd list-sources | grep name:
将为您提供可用源的列表。在命令行上使用源名称时,请删除尖括号。
编辑
每个 Pulseaudio 接收器都有一个关联的.monitor
源。因此,由于某种原因,Pulseaudio 无法获取任何 ALSA 输入,因此无法生成相应的源,因此剩下的唯一源就是源.monitor
,它恰好输出当前播放的声音。因此编解码器中没有内部循环(尽管这可能其他录制当前播放的声音的方式)。
这意味着您必须调试为什么 Pulseaudio 无法创建与 ALSA 输入相对应的源,尽管它创建了一个dmix
接收器,但它也不应该创建 - 这应该是一个硬件接收器。
请提供/etc/asound.conf
和~/.asoundrc
作为第一步。在启动 Pulseaudio 之前,是否已经有程序在运行,这些程序直接使用 ALSA,并阻止 Pulseaudio 使用硬件输入/输出?
答案2
通过删除 pulseaudio 解决了播放音频被录制的问题