短音頻播放已靜音,需要在後台預熱或輔助音頻
我注意到這發生在我的 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 秒,則再次“離開”。如果我在媒體播放器的後台播放音樂文件,則不會發生此問題。僅當電腦不播放任何聲音時才會發生。
如何解決這個問題?(除了讓 PC 在後台的守護程序中播放聽不見的聲音以使其始終處於預熱狀態)
僅使用 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
打開pulseaudio時也會發生同樣的情況。通過 HDMI 播放時,它會在兩個測試案例中重現。更新 2
雖然我很懶惰,但我還沒有向 ALSA 開發人員報告這個問題,但是,我創建了一個使用者 systemd 單元:
[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
.
假設接收聲音系統需要在輸出聲音之前“喚醒”,並且它只在接收到初始批次的聲音數據後才這樣做,如果這在接收聲音系統中無法修復,則丟棄第一批,一種解決方法是連續輸出靜音,例如使用
play
fromsox
:play -n
編輯
有了它在 Windows 上工作的附加資訊,以及音效卡(“英特爾公司設備”)和編解碼器(“通用”)都無法通過名稱辨識的資訊,也可能是一些驅動程序問題。編解碼器中有一個“保持活動啟用”(KAE)位,可能需要設置,可能由混音器控制,但我對此知之甚少。
向 ALSA 開發人員送出錯誤,提供
lspci -nn
資訊和cat /proc/asound/card*/codec\#*
. (您也可以將後者的輸出放入 pastebin 並使用連結編輯您的問題,以便我查看)。