Linux

linux (Debian) 中 HDMI 音頻輸出的破裂和爆裂聲

  • September 7, 2021

問題描述

我正在嘗試讓音頻在我的 Linux 安裝中正常工作。然而,每次音頻信號變為零時,即使只有大約半秒,當它恢復時,我會聽到揚聲器發出咔噠聲/爆裂聲。這在聆聽沒有持續背景噪音的音源時最為明顯,其中每次角色開始或停止說話時以及任何時候暫停或重新開始音樂播放時都會發生咔嗒聲。雖然典型的現代電影永遠不會完全無聲,但某些類型的內容,例如脫口秀或一鍵通語音通信軟體,已被徹底破壞。

系統硬體和軟體設置

我已經建構了一台帶有 Intel i5 處理器的媒體 PC。主機板是華碩 Prime B560M-A,使用的顯示器是 LG CX 系列 OLED。我正在使用 Debian 測試(Bullseye)和 Pulseaudio,這是 Debian 的預設設置。

聲音通過 HDMI1 向外發送,電視通過其音頻回傳通道 (ARC) 將其轉發到 Harman Kadron AVR (171S)。Pulseaudio 輸出模式為“HDMI1 數字立體聲”,啟用了多種直通音頻格式。

問題隔離和推測原因

似乎 Debian 中的音頻系統省電(或其他)功能在檢測到完全靜音時會立即關閉音頻信號。這會導致 AVR 關閉其音頻輸出,從而產生咔嗒聲。當聲音恢復時,反過來也會發生同樣的情況。

我可以通過觀察 AVR 中的音頻格式指示器來確認這一點。當我從放大器切換到信號源時,它會顯示正在接收的格式。如果有信號,AVR 會顯示“2/0/0 48kHz ARC”(用於正常 PCM)或類似 3/2/1 48kHz ARC(用於 DTS)的資訊。在Debian中,當我在音量為零的任何時候切換到ARC輸入時,接收器顯示“— ARC”,表示完全沒有信號。確實,當信號達到零時,它似乎立即被殺死。

我怎麼知道這是 Linux/Debian 問題

此時仍有多種選擇。如果 AVR 僅接收到零,則可能是 AVR 本身正在關閉,也可能是電視在僅接收到零時停止發送任何信號。但是,電視處於最簡單的直通模式,我可以通過 Playstation 4 控制台測試相同的設置來將問題隔離到 Debian。

在完全相同的情況下,當 PS4 完全沒有聲音播放時,AVR 仍然報告“2/0/0 ARC”。當音頻播放停止或繼續時,沒有任何破裂和爆裂聲。即使用 PS4,音頻信號永遠不會完全中斷。

我嘗試了什麼?

我已經在這個網站和整個網際網路上搜尋了有類似問題的人,並找到了以下建議。

這已設置為 0:

/sys/module/snd_hda_intel/parameters/power_save

這已設置為 N:

/sys/module/snd_hda_intel/parameters/power_save_controller

這些更改已永久生效:

root@mycomputername|/etc/modprobe.d:cat audio_disable_powersave.conf
options snd-hda-intel power_save=0 power_save_controller=N

我已在某些位置關閉了pulseaudio中的靜音空閒接收器

/etc/pulse/default.pa
/etc/pulse/system.pa

通過註釋掉該行:

### Automatically suspend sinks/sources that become idle for too long
#load-module module-suspend-on-idle

此更改後,Pulseaudio 已重新啟動。

我還通過將其設置為 Y 在 hdmi 輸出模組中啟用了靜默流:

/sys/module/snd_hda_codec_hdmi/parameters/enable_silent_stream

它以與上述模組設置相同的方式永久化。

此外,我已經禁用了 Alsamixer 的“自動靜音模式”,儘管這應該沒有任何影響,因為我認為它與耳機插孔有關。

一些消息來源還建議通過 aplay 發送零流以保持信號有效。我已經通過使用:

aplay /dev/zero -f S16_LE

以上都沒有任何效果。按下暫停總是會立即產生點擊,輸出中的任何靜音總是會產生立即點擊。在此之後檢查 AVR 信號模式總是顯示它根本沒有收到任何信號。

我完全束手無策,想不出其他可以嘗試的方法,並且非常感謝任何實際解決此問題的人的幫助。

最後,我沒有找到滿意的答案,而且我的情況似乎沒有好的解決方案,可能是因為 AVR 中的自動化。目前尚不清楚為什麼 PS4 能夠保持信號有效,但至少以下內容是相同的:

/usr/bin/play -qn synth sin 10 gain -191

它低於我的揚聲器的靈敏度和它的低頻截止頻率。如果它處於活動狀態,我可以在不聽到流行音樂的情況下暫停音樂。

(編輯):沒有人提供更好的解決方案,因此,我接受了這個答案。此外,為了使答案更普遍有用,值得注意的是,如果您的信號輸出數據格式是 16 位而不是 32 位,請使用:

/usr/bin/play -qn synth sin 10 gain -95

引用自:https://unix.stackexchange.com/questions/663403