
我注意到這種情況發生在我的 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