我注意到这种情况发生在我的 ArchLinux PC 和我的 ArchLinux MacBook 上。我需要通过短音频获取应用程序通知,我发现这不是通知应用程序的问题,而是系统本身的问题,而且它发生在两个截然不同的系统中。
当我播放一个简短的音频文件时,就像paplay /usr/share/sounds/freedesktop/stereo/message.oga
我第一次播放时没有听到它一样。
如果我按顺序再次播放它,我会听到它并且播放正确,我始终按顺序重复它。
如果我等待大约 10 秒再次播放,它就会静音(就像一开始一样):只有在热身时才会发出声音。
也会发生同样的情况aplay /usr/share/sounds/alsa/Front_Left.wav
,但由于它的音调较长,因此问题仅发生在文件的开头。起初我只听到“t left”,缺少“fron”。随后我听到了完整而清晰的声音:“左前”。如果我等 10 秒,就会再次“离开”。
如果我在媒体播放器的后台播放音乐文件,则不会出现此问题。仅当计算机不播放任何声音时才会发生这种情况。
如何解决这个问题? (除了让电脑在后台守护进程中播放听不见的声音以保持其始终预热之外)
仅使用 alsa 时问题依然存在的相关测试会话:
~ ❯❯❯ sudo mv /usr/bin/pulseaudio /usr/bin/pulseaudio.bak
~ ❯❯❯ pulseaudio.bak --kill
W: [pulseaudio.bak] main.c: Couldn't canonicalize binary path, cannot self execute.
~ ❯❯❯ paplay /usr/share/sounds/freedesktop/stereo/message.oga
Connection failure: Connection refused
pa_context_connect() failed: Connection refused
~ ❯❯❯ ps axu | grep -i pulse
francis+ 31563 0.0 0.0 10796 2144 pts/2 S+ 14:35 0:00 grep --color=auto -i pulse
~ ❯❯❯ aplay -D plughw:0,7 /usr/share/sounds/alsa/Front_Left.wav
Playing WAVE '/usr/share/sounds/alsa/Front_Left.wav' : Signed 16 bit Little Endian, Rate 48000 Hz, Mono
~ ❯❯❯ aplay -l
**** List of PLAYBACK Hardware Devices ****
card 0: PCH [HDA Intel PCH], device 0: Generic Analog [Generic Analog]
Subdevices: 1/1
Subdevice #0: subdevice #0
card 0: PCH [HDA Intel PCH], device 1: Generic Digital [Generic Digital]
Subdevices: 1/1
Subdevice #0: subdevice #0
card 0: PCH [HDA Intel PCH], device 3: HDMI 0 [HDMI 0]
Subdevices: 1/1
Subdevice #0: subdevice #0
card 0: PCH [HDA Intel PCH], device 7: HDMI 1 [HDMI 1]
Subdevices: 1/1
Subdevice #0: subdevice #0
~ ❯❯❯ lspci -nn | grep -i audio
00:1f.3 Audio device [0403]: Intel Corporation Device [8086:a2f0]
更新
Linux内核4.11.2之后,ALC1220 编解码器位于:
~ ❯❯❯ aplay -l
**** List of PLAYBACK Hardware Devices ****
card 0: PCH [HDA Intel PCH], device 0: ALC1220 Analog [ALC1220 Analog]
Subdevices: 1/1
Subdevice #0: subdevice #0
card 0: PCH [HDA Intel PCH], device 1: ALC1220 Digital [ALC1220 Digital]
Subdevices: 1/1
Subdevice #0: subdevice #0
card 0: PCH [HDA Intel PCH], device 3: HDMI 0 [HDMI 0]
Subdevices: 1/1
Subdevice #0: subdevice #0
card 0: PCH [HDA Intel PCH], device 7: HDMI 1 [HDMI 1]
Subdevices: 1/1
Subdevice #0: subdevice #0
card 0: PCH [HDA Intel PCH], device 8: HDMI 2 [HDMI 2]
Subdevices: 1/1
Subdevice #0: subdevice #0
card 0: PCH [HDA Intel PCH], device 9: HDMI 3 [HDMI 3]
Subdevices: 1/1
Subdevice #0: subdevice #0
我已连接耳机并设法仅使用aplay
但不同的方式重现该问题:
~ ❯❯❯ aplay -D plughw:0,0 /usr/share/sounds/alsa/Front_Left.wav
~ ❯❯❯ aplay -D plughw:0,0 /usr/share/sounds/purple/alert.wav
~ ❯❯❯ aplay -D plughw:0,0 /usr/share/sounds/alsa/Front_Left.wav
~ ❯❯❯ aplay -D plughw:0,0 /usr/share/sounds/purple/alert.wav
...
我必须播放驻留在不同目录中的不同音频文件,如果播放一个然后播放另一个,则两个播放都会在开始时被剪切,播放之间的间隔并不重要。如果一个文件被播放一次,之后播放同一目录中的文件将不会重现该问题,也不会等待它“冷却”(我已经等了1分钟)。paplay
打开脉冲音频时也会发生同样的情况。通过 HDMI 播放时,它在两个测试用例中都能重现。
更新2
尽管我很懒,但我还没有向 ALSA 开发人员报告这一点,但是,我已经创建了一个用户系统单元:
[Unit]
Description=Continuous silence
[Service]
ExecStart=/usr/bin/play -qn
[Install]
WantedBy=default.target
只需将其保存到~/.config/systemd/user/continuous-silence.service
并使用 启用它即可systemctl --user enable continuous-silence
。
答案1
假设接收声音系统在输出声音之前需要“唤醒”,并且它只这样做后接收初始批次的声音数据,丢弃第一批,如果在接收声音系统中无法修复此问题,解决方法是连续输出静音,例如使用play
from sox
:
play -n
编辑
根据它在 Windows 上运行的附加信息,以及声卡(“英特尔公司设备”)和编解码器(“通用”)均无法通过名称识别的信息,也可能是某些驱动程序问题。编解码器中有一个“保持活动启用”(KAE)位,也许需要通过混音器控制来设置它,但我对此了解不够。
向 ALSA 开发人员提交错误,提供lspci -nn
信息以及cat /proc/asound/card*/codec\#*
. (您也可以将后者的输出放入粘贴箱并使用链接编辑您的问题,以便我可以查看)。
答案2
当我开始采用杰克音频连接套件和脉冲音频插孔(而不是裸露的脉冲音频)时,我的另一个修复发生了。
答案3
通过遵循 wiki 关于如何设置低延迟音频的方式修复
- 遵循 wiki 上的第 1.1 节https://wiki.archlinux.org/title/Professional_audio
- 不要安装 linux-rt AUR 内核
- 完成第 1.1 节后重新启动应该可以消除延迟
- 如果没有,则继续 wiki 的其余部分并配置 JACK