透過調整 ALSA 配置修復 Ubuntu 24.04 中的聲音失真問題

Ubuntu 24.04 上的聲音失真可能源自於多個層面:應用程式、PipeWire、WirePlumber、ALSA、核心驅動程式或音訊硬體本身。實用的解決方法是先確定受影響的設備,然後一次更改一個緩衝區或設備設定。在標準的 Ubuntu 24.04 桌面系統中,PipeWire 位於 ALSA 之上,而 WirePlumber 管理 ALSA 設備,因此大多數使用者應該先調整透過 WirePlumber 公開的 ALSA 屬性,然後再取代系統的預設 ALSA 配置。

Ubuntu 24.04 最初搭載的是 PipeWire 1.0.4,而 Ubuntu 目前的 Noble 軟體包仍然使用 WirePlumber 0.4.17 版本,而不是更新的 0.5 版本配置格式。版本差異至關重要,因為 WirePlumber 0.4 使用了 Lua 片段~/.config/wireplumber/main.lua.d/。您在目前上游文件中看到的較新wireplumber.conf.d語法適用於 WirePlumber 0.5 及更高版本。複製任何配置之前,請務必檢查已安裝的版本。

官方參考資料:Ubuntu 24.04 LTS 發行說明、Ubuntu 的 WirePlumber Noble 更新軟體包、WirePlumber 0.4 ALSA 設定參考和ALSA PCM 外掛參考。

快速參考:首先應該嘗試什麼

症狀首次實際檢查潛在調整
CPU負載下出現劈啪聲確認水槽位置正確,並注意是否有漏水。測試較大的ALSA週期大小,例如1024或2048幀。
僅在一個 USB DAC 上出現失真確定確切的ALSA/PipeWire節點僅將該規則套用至該節點;避免全域規則。
設備從空閒狀態喚醒時發出的噪音靜默數秒後再次重複操作。增加或停用該特定節點的掛起逾時時間
僅支援 ALSA 的舊版應用程式存在的問題aplay使用或明確 PCM測試應用程式使用每個使用者~/.asoundrc的plug/dmix
單一取樣率下的失真測試 44.1 kHz 和 48 kHz 材料建議使用硬體支援的取樣率,並讓 PipeWire 在需要時重新取樣。

1. 識別 ALSA 硬體和音訊協定棧。

首先列出播放設備,並檢查哪個音訊伺服器處於活動狀態。不要想當然地認為那hw:0,0就是你的揚聲器;HDMI、USB 耳機、網路攝影機和擴充座的卡號在每次啟動後都可能發生變化。

aplay -l
wpctl status
pactl info
wireplumber --version
pipewire --version
Ubuntu 終端機顯示 aplay -l 指令的輸出,其中包含板載類比設備和 HDMI 播放設備。

說明:此aplay -l清單將板載類比播放設備與 HDMI 分開,這有助於避免對錯誤的卡片套用 ALSA 調整。

如果pactl info報告顯示“PulseAudio (on PipeWire)”,這在 Ubuntu 24.04 上是正常的。 PulseAudio 相容的音訊介面由 PipeWire 提供。對於標準的 Ubuntu 24.04/Noble 版本,wireplumber --version通常應該顯示 0.4.x 系列,除非您安裝了其他版本。

2. 變更配置前,請確認失真狀況

與其根據隨機的網路影片來判斷變化,不如使用可重複的測試方法。使用一段短的 WAV 檔案speaker-test或一首已知的音樂曲目,可以使前後對比更有意義。同時,檢查類比輸出、HDMI、藍牙和 USB 是否都會出現相同的問題。如果只有一條路徑受到影響,則將修復範圍縮小到該路徑。

speaker-test -c 2 -t wav
aplay /usr/share/sounds/alsa/Front_Center.wav

對於 USB 設備,核心會將串流資訊暴露在/proc/asound/. 特定路徑因卡而異,因此/proc/asound/cards請先檢查,不要盲目複製卡號。

Ubuntu 終端顯示 ALSA PCM 流訊息,包括 48000 Hz 取樣率、雙聲道和 S16_LE 格式。

說明:ALSA 串流資訊可以顯示播放串流的活動取樣率、頻道數和取樣格式;卡號取決於硬體。

3.備份當前使用者配置

在編輯任何內容之前,請務必保留所有現有的 ALSA 或 WirePlumber 覆蓋設定。使用者層級的變更比編輯根目錄下的檔案更安全/usr/share,因為軟體包升級可能會取代系統檔案。

cp -a ~/.asoundrc ~/.asoundrc.backup 2>/dev/null || true
mkdir -p ~/.config/wireplumber/main.lua.d
cp -a ~/.config/wireplumber/main.lua.d ~/.config/wireplumber/main.lua.d.backup 2>/dev/null || true

如果您之前從為 WirePlumber 0.5 編寫的指南中複製了配置,請在 Ubuntu 24.04 上進行測試之前將其刪除或移開。 WirePlumber 0.4 和 0.5 使用不同的設定格式。

4. 透過 WirePlumber 0.4 調整 ALSA 緩衝區行為

在 Ubuntu 24.04 上,這通常是 ALSA 層級上最相關的調整,因為 WirePlumber 會建立和配置基於 ALSA 的 PipeWire 節點。 WirePlumber 的上游文件將其描述api.alsa.period-size為以取樣為單位的週期大小,以及api.alsa.headroom硬體指標和軟體指標之間的額外緩衝。大多數 USB 設備被視為批次設備,週期大小會影響中斷頻率和緩衝行為。

建立使用者規則:

nano ~/.config/wireplumber/main.lua.d/51-alsa-tuning.lua

使用僅針對問題輸出節點的規則。首先使用 `getNodeName`wpctl status或 `getNodeName`取得節點名稱pw-cli list-objects Node。然後參考以下範例:

local rule = {
  matches = {
    {
      { "node.name", "matches", "alsa_output.*" },
    },
  },
  apply_properties = {
    ["api.alsa.period-size"] = 1024,
    ["api.alsa.headroom"] = 0,
  },
}

table.insert(alsa_monitor.rules, rule)

不要將 1024 視為通用的神奇數值。它只是一個保守的測試點。如果失真持續存在,請依序比較 512、1024 和 2048 這三個值。較大的週期可以提高某些系統對調度延遲的容忍度,但會增加延遲;較小的週期可以降低延遲,但會增加中斷頻率,並且可能在負載較高的機器上暴露欠載問題。請保留能夠穩定運行的最小值。

如果裝置的記憶體對映 I/O 發生故障,WirePlumber 也會暴露出來api.alsa.disable-mmap。上游文件明確指出這是一種相容性回退機制,並指出讀取/寫入存取速度較慢,因此除非效能下降與記憶體映射行為明顯相關,否則請勿啟用此功能。

["api.alsa.disable-mmap"] = true,

另一個針對特定裝置的選項是session.suspend-timeout-seconds:如果 DAC 每次喚醒時都會出現爆音或失真,可以嘗試延長超時時間,或0停用該節點的掛起功能,這有助於找出原因。停用掛起功能會使 ALSA 裝置保持忙碌狀態,因此這是一種權衡,而不是預設建議。

5. 僅當應用程式確實直接使用 ALSA 時才使用 .asoundrc 檔案。

對於繞過 PipeWire 直接開啟 ALSA PCM 的舊應用程式來說,按使用者設定~/.asoundrc可能很有用。它也可用於測試固定取樣率或軟體混音行為。但是,全域覆蓋 ALSA 預設值可能會幹擾 PipeWire ALSA 插件,因此請盡可能使用命名 PCM,而不是取代預設值pcm.!default。

例如,ALSA 的dmix插件支援明確的 `<type>` rate、period_size`<value>` 和buffer_size`<value>` 值。一個命名的測試 PCM 可以如下所示:

pcm.stable_test {
    type plug
    slave.pcm "stable_dmix"
}

pcm.stable_dmix {
    type dmix
    ipc_key 2048
    ipc_key_add_uid true
    slave {
        pcm "hw:0,0"
        rate 48000
        period_time 0
        period_size 1024
        buffer_size 4096
    }
}

替換hw:0,0為實際的卡片和設備aplay -l。然後在不更改系統預設設定的情況下進行測試:

aplay -D stable_test /usr/share/sounds/alsa/Front_Center.wav
在 Ubuntu 系統上使用 GNU nano 編輯使用者 .asoundrc 文件,該文件使用硬體 PCM 音訊格式,取樣率為 48000 Hz,週期大小為 1024,緩衝區大小為 4096。

標題:每個使用者可以定義固定的 ALSA 參數以進行受控測試;應謹慎使用.asoundrc直接目標,因為它繞過了自動格式轉換。hw

ALSA 專案指出,dmix除非在其從屬定義中指定值,否則其基本配置是固定的,而plug插件可以執行格式和速率轉換。因此,對於實驗而言,將已命名的plugPCM 與單獨調校的dmixPCM 結合使用比強制每個程式直接開啟原始硬體更安全。

6. 重新啟動使用者音訊服務並重新測試

更改 WirePlumber 規則後,請重新啟動使用者音訊堆疊。請先關閉正在使用音訊的應用程式。

systemctl --user restart wireplumber pipewire pipewire-pulse

然後重複使用更改前相同的測試材料。開啟「設定」>「聲音」,並確保仍已選擇預期的輸出裝置和設定檔。

Ubuntu 設定中的聲音面板顯示已選擇內建揚聲器,並啟用了類比立體聲輸出設定檔。

說明:重新啟動音訊服務後,請驗證 Ubuntu 是否仍選擇預期的輸出裝置和設定文件,然後再判斷失真問題是否已解決。

如何判斷調整是否有效

  • 同一個測試檔案重複播放,沒有出現劈啪聲、嗡嗡聲、削波聲或短暫的斷音。
  • 設備閒置一段時間後喚醒,失真現像不會再出現。
  • 普通桌面應用程式、瀏覽器和視訊通話仍然使用預期的輸出設備。
  • 延遲在您的使用場景下是可以接受的;音樂播放比即時監控或遊戲更能容忍緩衝。
  • 即使登出並重新登入或重新啟動電腦,該修復程式仍然穩定有效。

當 ALSA 調整並非正確的解決方法時

如果故障現像明顯是硬體削波、線纜鬆脫、類比輸入過載、USB 集線器故障或揚聲器損壞,請勿繼續增加緩衝區大小。此外,請檢查混音器電平alsamixer;僅在接近 100% 音量時出現的失真可能是增益問題,而不是調度問題。

如果問題出現在內核或韌體更新之後,請先從 GRUB 選單測試其他支援的內核,然後再建立越來越複雜的音訊規則。如果只有藍牙受到影響,請重點檢查藍牙編解碼器/設定文件,而不是 ALSA 週期設定。如果只有 HDMI 受到影響,請先驗證 HDMI 設定檔和接收器/顯示器。

回滾檢查清單

  • 刪除或重新命名~/.config/wireplumber/main.lua.d/51-alsa-tuning.lua。
  • 從備份中恢復~/.asoundrc,或刪除僅用於測試的檔案。
  • 重新啟動wireplumber,,pipewire和pipewire-pulse。
  • 重新運行wpctl status並speaker-test確認預設行為已恢復。

結論

對於 Ubuntu 24.04,建議先使用針對性的 WirePlumber 0.4 ALSA 規則,而不是進行大範圍的系統級.asoundrc替換。確定具體的輸出節點,每次只更改一個屬性,並在每次更改後比較相同的測試音訊。週期大小 1024 是一個合理的診斷起點,但正確的值取決於設備和工作負載。保留disable-mmap、暫停變更和自訂dmixPCM,僅在測試明確指向特定行為時才使用。

留下評論

如何在不破壞依賴關係的情況下將 Debian 12 遷移到 Testing 版本

如何在不破壞依賴關係的情況下將 Debian 12 遷移到 Testing 版本

將 Debian 12 Bookworm 系統移轉到 Debian Testing,減少依賴項的意外情況。了解支援的 Bookworm 到 Trixie 遷移路徑、APT 檢查、模擬和復原保障措施。

如何將 SLES 15 機器註冊到 SUSE Manager Offline

如何將 SLES 15 機器註冊到 SUSE Manager Offline

使用同步通道、引導儲存庫、啟動金鑰和經過驗證的 Salt 引導工作流程,無需 Internet 存取即可將 SLES 15 註冊到 SUSE Manager。

如何修復 Ubuntu 24.04 系統睡眠後 Wi-Fi 斷開連線的問題

如何修復 Ubuntu 24.04 系統睡眠後 Wi-Fi 斷開連線的問題

解決 Ubuntu 24.04 掛起後 Wi-Fi 斷開的問題:更新、檢查無線電區塊和 NetworkManager、測試省電模式、檢查日誌並驗證修復。

透過調整 ALSA 配置修復 Ubuntu 24.04 中的聲音失真問題

透過調整 ALSA 配置修復 Ubuntu 24.04 中的聲音失真問題

透過診斷 ALSA 設備並安全地調整 WirePlumber 緩衝區、取樣率和直接 ALSA 設置,修復 Ubuntu 24.04 中的劈啪聲、嗡嗡聲和失真聲音。

如何在啟用安全啟動的 SLES 15 上安裝自訂核心模組

如何在啟用安全啟動的 SLES 15 上安裝自訂核心模組

學習如何對自訂 SLES 15 核心模組進行簽名,將其憑證註冊到 MOK,在安全啟動下載入它,驗證結果,以及處理核心更新。

SLES 15 KVM 虛擬化設定與虛擬機器自動啟動指南

SLES 15 KVM 虛擬化設定與虛擬機器自動啟動指南

在 SLES 15 上設定 KVM,配置 libvirt 網路和存儲,建立虛擬機,啟用自動啟動,並在主機重新啟動後驗證可靠啟動。

How to Configure a WireGuard Point-to-Site VPN Server on Debian 12

How to Configure a WireGuard Point-to-Site VPN Server on Debian 12

Configure a WireGuard point-to-site VPN on Debian 12 with wg-quick, IPv4 forwarding, nftables NAT, client profiles, systemd startup, and verification.

如何加固 SLES 15 以符合 STIG 標準:安全的 OpenSCAP 工作流程

如何加固 SLES 15 以符合 STIG 標準:安全的 OpenSCAP 工作流程

在生產推廣之前,根據目前的 DISA STIG 對 SLES 15 進行審核,審查 OpenSCAP 的調查結果,測試補救措施,並記錄例外情況。

如何在 SUSE Linux Enterprise Server 上設定 SAP HANA 記憶體限制

如何在 SUSE Linux Enterprise Server 上設定 SAP HANA 記憶體限制

了解如何在 SUSE Linux Enterprise Server 上設定 SAP HANA 全域和語句記憶體限制,將 HANA 限制與 SUSE MemoryLow 進行比較,並安全地驗證每個變更。

如何安全地設定 Gooroom OS 瀏覽器隔離設定

如何安全地設定 Gooroom OS 瀏覽器隔離設定

了解 Gooroom OS 瀏覽器隔離的工作原理,準備受信任且被封鎖的 URL 策略,協調 GPMS 配置,並驗證您的建置中的設定。