專業音頻 - Arch Linux 中文维基

跳至內容

# 專業音頻

出自 Arch Linux 中文维基

相關文章

- /示例
- /開發
- /硬體
- 音頻系統
- JACK
- PipeWire
- 實時內核
- envy24control

翻譯狀態：

- 本文（或部分內容）譯自 Professional audio，最近一次同步於 2025-11-18，若英文版本有所更改，則您可以幫助同步與翻譯更改的內容。
- 您可以在 ArchWiki 的對應頁面找到本文翻譯的原始修訂歷史。
- 本文可能與英文原文存在出入。

該文章描述了如何將你的系統針對多軌錄音，混音，回放或是合成音頻應用進行配置。 這類活動通常使用術語「專業音頻」進行描述，並相對需要較低的延遲。

相對於視頻剪輯或遊戲，該類應用通常不需要高端硬體。更多信息請參考 The Right Computer System for Digital Audio 一文。

提示：如果你在找的是 GNU/Linux 作曲指南，可前往 LinuxMusicians 論壇進行查找。

## 開始

高級 Linux 聲音體系（ALSA）是 Linux 內核的一部分，並在 Arch Linux 的驅動及接口中是默認的音頻系統。ALSA 在完成默認的 Arch Linux 安裝流程後應當可以開箱即用。如果出現異常，你需要在進行下一步前先排清問題。

我已正確配置好聲音系統了嗎？

    $ speaker-test

  進一步排障可參考 ALSA 。

在多數情況下，默認的 Arch Linux 內核已能滿足低延遲應用。優化系統配置只有在你遇到了音頻丟失，或是你確實需要/想要極低延遲的情況下再進行。

為了完成優化工作，你可能需要配置一個實時內核。

儘管有些專業音頻軟體可以直接使用 ALSA，但該文章提到的大多數軟體都屬於 JACK Audio Connection Kit（又稱 JACK）客戶端。因此，你需要根據下方描述安裝並配置一個可用的音頻伺服器。

提示：如果你剛開始使用 Arch Linux，完成了安裝指南且想要立刻開始作曲，可以安裝 pro-audio包組 軟體包組及 realtime-generic-setupAUR 並重啟。參考 #僅使用 PipeWire 一節進行快速配置並查找適合你的音樂製作#軟體。

## 選擇音頻伺服器

音頻硬體無法同時播放來自多個應用的聲音。雖然理論上 ALSA 可以被配置為混合來自多個應用的聲音，但這方面的工作通常會交由音頻伺服器來處理。

單獨使用 ALSA 時難以實現低延遲，無法協調多個音頻應用的實時播放、同時播放以及維持同一速率等，並且無法簡單通過連接客戶端的方式在多個應用間傳輸音頻流，因此在這一場景下，你需要一個專業音頻級的音頻伺服器：

- PipeWire 在音頻方面同時取代了 JACK 和 PulseAudio。除本文涉及內容外，它同時可以處理視頻路由。

  注意：目前尚不明確 PipeWire 是否僅適用於日常使用，而不建議在專業場景中使用。

- JACK Audio Connection Kit（JACK）專門針對專業音頻的需要進行開發，並已在全球範圍內獲得長期應用，因此其非常成熟和穩定。大部分專業音頻應用都針對 JACK API 進行開發。

音頻伺服器的配置很大程度上由使用場景、工作流及應用交互限制所決定。JACK 設計為在不同應用間傳輸音頻，並在維持低延遲下通過客戶端的同步執行來同時訪問同一音頻硬體。它對應的 PipeWire 替代品提供了適用於大多數情況的伺服器。

以下為將要介紹的音頻伺服器配置的模型：

     #仅使用 PipeWire     #PipeWire 作为 JACK 的客户端     #仅使用 JACK
    ┌──────────────┐          ┌──────────────┐        ┌──────────────┐
    │ Applications │          │ Applications │        │ Applications │
    ├──────────────┤          ├──────────────┤        ├──────────────┤
    │   PipeWire   │          │ PipeWire+JACK│        │     JACK     │
    ├──────────────┤          ├──────────────┤        ├──────────────┤
    │     ALSA     │          │     ALSA     │        │     ALSA     │
    └──────────────┘          └──────────────┘        └──────────────┘

### 僅使用 PipeWire

新的 PipeWire 框架通過更優秀的簡潔性取代了 JACK 及其它音頻伺服器。因此，建議先嘗試在默認 Arch Linux 內核下使用僅 PipeWire 配置，並通過安裝 pipewire-jack包 為 JACK 客戶端提供支持。

對於專業音頻應用，你同時需要使用 Pro Audio profile 及 PulseAudio 的混音器 pavucontrol包。

### PipeWire 作為 JACK 的客戶端

通過安裝 pipewire-jack-client包，PipeWire 也可以被用作 JACK 的客戶端。詳細內容請參考 PipeWire。

### 僅使用 JACK

在通用性的原則下，你可以將 JACK 與實時內核搭配系統配置以達到進階應用所需的低延遲。使用 JACK 作為唯一的音頻伺服器時，需要所有音頻交互應用都作為 JACK 客戶端運行。

不幸的是，一些流行的桌面應用（例如火狐）以及大多數遊戲都取消了或是根本不支持 JACK。因此，該配置僅適合作為專業音頻系統的獨立設備，此時不支持 JACK 的軟體影響可以忽略不計。如果你仍需使用到不支持 JACK 的軟體，可以在完成下列設置後參考專業音頻/示例#高級音頻伺服器配置。在安裝和運行 JACK 前，請確保它可以訪問到你的音頻設備。

PulseAudio 或者其它軟體在占用我的設備嗎？

    $ lsof +c 0 /dev/snd/pcm* /dev/dsp*

或者

    $ fuser -fv /dev/snd/pcm* /dev/dsp*}}

如果你的音頻設備沒有顯示出來，它可能是在被 PulseAudio 占用（可能是由其它軟體作為需求包安裝）。如果你不打算使用專業音頻/示例#PulseAudio+JACK，可以將 PulseAudio 連帶其它軟體一起移除，以使其釋放音頻設備。

JACK 版本 1 已處於 「逐漸淘汰」[1] 階段中，其不支持對稱多處理（SMP），缺乏 D-Bus 及 Systemd 整合，因此建議使用官方軟體源中的版本 2 jack2包。若你準備用一個 JACK 圖形控制界面或是 Systemd 用戶服務 來 啟動 audio graph，也請安裝 jack2-dbus包。

  更多細節參見 JACK Audio Connection Kit#Comparison of JACK implementations

JACK 的文章中描述了一個圖形化的和一個命令行的示例作為一個對於你的情況的參考。 JACK 的參數值在 #JACK 參數中有討論，也可能取決於在後面的#優化系統配置章節中提到的其他的系統因素。

## JACK 參數

注意：以下指南用於在運行#僅使用 JACK或 /示例#PulseAudio+JACK 聲音伺服器的環境下，如何找到在使用 JACK 的同時不出現音頻中斷（xruns）的最佳參數。鑑於具體參數會隨著硬體不同，是否使用了#實時內核，是否應用了某些#優化系統配置等條件更改，不能將下文參數作為通用配置。

此處的目標為根據你當前使用的硬體，找到緩衝區大小和處理周期數的最佳搭配，可以先從 Frames/Period = 256 開始。對於板載和 USB 設備，在降低這兩者前先試試 Periods/Buffer = 3。常用的值有：256/3, 256/2, 128/3, 128/2。

另外，採樣率也需要與硬體設備匹配，你可以通過以下命令查看設備支持的採樣率選項：

    $ cat /proc/asound/card0/codec#0

將 card0 和 codec#0 替換為你的設備對應的值；在輸出結果中，在 Extended ID 中找到 rates 和 VRA 的值。目前常見的採樣率值為 48000 Hz，另外比較常見的值有 44100 Hz,96000 Hz 和 192000 Hz。

在重點關注錄製或與外部設備進行調度的情況下，基本上必須使用 realtime 參數。另外，你可能會有需要設置最大優先級（至少比 `/etc/security/limits.d/99-realtime-privileges.conf` 中設定的系統限制低 10；最大值是預留給設備自己的）。

使用你找到的參數啟動 jack，如下所示：

    $ /usr/bin/jackd -R -P89 -dalsa -dhw:0 -r48000 -p128 -n2

可以使用 qjackctl包，cadenceAUR，patchageAUR 和 studio-controls-gitAUR 通過圖形界面來監控 JACK 的狀態和修改配置。

注意：配置好 JACK 後，建議使用多個不同的音頻軟體來驗證你的配置。例如，假設 JACK 在 LMMS 上出現 xrun 問題，當問題出在後者上時不要花費過多時間排障。

  建議閱讀 Linux Magazine article (2006) 來理解 JACK 參數調優

## 驗證延遲

JACK 參數在很大程度上影響著往返延遲（RTD）。在本文中，這表示音頻信號從錄製，處理到回放這一過程的總耗時。下一部分將介紹影響 RTD 的各個來源相關背景，如果你已了解這一概念，可直接跳到 #測量延遲一節，或是完全跳過該部分。

### 延遲來源

假設有一標準的歌手錄音場景。歌手的聲音以聲速通過空氣傳播到麥克風並被捕獲。接下來，通過模數轉換使得捕獲的電信號可以被計算機進行數位訊號處理。最後，通過數模轉換將信號傳到歌手的耳機進行回放監聽，與舞台監聽系統的使用場景類似。

在這一場景中，有五個對 RTD 影響最大的延遲源，並按如下順序出現：

1. 聲音從歌手的嘴通過空氣進行傳播
2. 模數轉換
3. 數位訊號處理
4. 數模轉換
5. 聲音通過空氣傳播到歌手的耳朵

由於在技術上，必須在錄音及回放過程中保持特定距離才能獲得理想的聲音，因此很難對第一個及最後一個延遲源進行改善。另外，在近距離進行錄製並使用耳機進行回放時，由聲音傳播造成的延遲通常在個位數毫秒範圍內，對人類而言難以察覺。所以，需要通過優化其它延遲源來降低 RTD。

### 轉換延遲

理論上，JACK 通過在採樣過程中使用固定值（包括幀，周期及採樣率）並對模數轉換過程中的音頻數據進行緩存來保持低延遲，反之亦然。採樣過程中的延遲可以用以下公式描述：

  Lc = n / f

Lc：毫秒（ms）為單位的採樣延遲，n：幀或緩衝大小（從 16 開始的 2 的倍數），f：赫茲（Hz）為單位的採樣率。

回放延遲同時用到了周期值：

  Lp = n * p / f

Lp：毫秒（ms）為單位的回放延遲，n：幀或緩衝大小（從 16 開始的 2 的倍數），p: 周期值，f：赫茲（Hz）為單位的採樣率。

如之前所說，音頻接口的性能決定了可用的參數搭配，具體的配置需要你進行試錯。雖然需要在防止 xrun 及低延遲間進行取捨，但現在的音頻接口基本都可以通過高採樣率（通常到 192 KHz）來滿足該需求。在數字域中，JACK 客戶端之間的音頻流延遲幾乎為零，因此在測量延遲時可忽略不計[2]。

  更多信息可參考 ALSA 維基的FramesPeriods 一節。

### 測量延遲

在完成#JACK 參數配置後，你可能會想驗證下當前 RTD。例如，在幀或緩存大小 n = 128，周期值 p = 2，採樣率 f = 48000 時，採樣延遲大約為 Lc = 2,666... ms，回放延遲大約為 Lp = 5,333... ms，加起來總往返延遲 RTD = 8 ms。

注意：根據聲速可計算出該延遲值與舞台上使用距表演者耳朵距離在 2 m 到 3 m 之間的揚聲器的典型監聽情況相當。有過舞台經歷的表演家通常已習慣該延遲。

由 Fons Adriaensen 編寫的 jack_delay包 工具可以在單個回放通道播放一個測試音，並在單個錄製通道上進行捕獲來，通過測量信號的相位差來估計整個鏈的往返延遲。建議使用合適的線纜將音頻接口的輸入和輸出通道連一起，或是參照 JACK 延遲測試將音響和麥克風靠近放一起。

例如，在一台僅配置 JACK 的設備上，將 playback_1 和 capture_1 （名稱根據設備不同可能會改變）用線纜連接起來運行 `jack_delay`，並根據上文描述的參數得到以下輸出：

    $ jack_delay -O system:playback_1 -I system:capture_1

    capture latency  = 128
    playback_latency = 256
    Signal below threshold...
    Signal below threshold...
    Signal below threshold...
      422.507 frames      8.802 ms total roundtrip latency
           extra loopback latency: 38 frames
           use 19 for the backend arguments -I and -O
      422.507 frames      8.802 ms total roundtrip latency
           extra loopback latency: 38 frames
           use 19 for the backend arguments -I and -O
      422.506 frames      8.802 ms total roundtrip latency
           extra loopback latency: 38 frames
           use 19 for the backend arguments -I and -O
      422.507 frames      8.802 ms total roundtrip latency
           extra loopback latency: 38 frames
           use 19 for the backend arguments -I and -O
    <output omitted>

根據輸出的提示，可以使用 `-I 19` 和 `-O 19` 參數對 JACK 進行進一步優化，以補償鏈中額外的迴環延遲：

    $ /usr/bin/jackd -R -P89 -dalsa -dhw:0 -r48000 -p128 -n2 -I19 -O19

  更多信息可參考 Ardour 文檔中的 延遲與延遲補償一節。

## 實時內核

這篇文章的某些內容需要擴充。

原因：Real-time kernel support was merged into Linux 6.12. How does it afftect this section? (在 Talk:專業音頻 中討論)

"實時" 這一概念在作業系統中的定義為：操作的結果可以在固定時間內得出，只有在更廣的意義上才是「與現實時間同步」，例如：用戶在輸入後可以立即產生相應的聲音。這個案例稱為「低延遲」，而達成它的操作這篇文章的主要目標之一。

從一段時間前開始，默認的 Linux 內核（Arch Linux 的初始內核默認帶 `CONFIG_PREEMPT=y` 選項）已被證明適用於低延遲操作。作業系統中對延遲的定義為：從硬體中斷的開始，到對應的中斷線程開始運行的時間。不幸的是，某些硬體的驅動會導致更高的延遲。因此，根據你的硬體、驅動和需求，你可能需要一個滿足實時計算標準的內核。

### 優勢與劣勢

Ingo Molnar 和 Thomas Gleixner 創造的 RT_PREEMPT 補丁集是對於軟/硬實時應用而言非常有意思的選項，涵蓋了從專業音頻到工業控制等範圍。大多數專注於音頻的 Linux 發行版都啟用了該補丁集。一個可實時搶占的內核也將使調整 IRQ 處理線程的優先級成為可能，並有助於確保幾乎不受負載影響的流暢音頻。

注意：目前，在實時內核上使用某些應用會有些已知限制，通常與 虛擬化（例如 Xen 和 KVM）相關。如果你同時需要使用這類功能，可以考慮在默認 Arch Linux 內核外同時安裝實時內核，並在 引導加載程序 創建另一個入口以按需啟動到對應的內核。

### 安裝

安裝 linux-rt包 或是 linux-rt-lts包 包。

### 編譯

如果你要將自己的內核編譯為實時內核，請記住，移除模塊或選項並不等同於精簡內核。雖然內核映像的體積會減小，但現代的計算機系統以不再像 1995 年那時對大小敏感了。

  更多信息可參考如何正確配置帶 PREEMPT_RT 的 Linux 。

不論如何，你必須要確保：

- Timer Frequency 設為 1000Hz（`CONFIG_HZ_1000=y`；不使用 MIDI 可以無視該項）
- 禁用 APM（`CONFIG_APM=n`；在某些硬體上會產生問題 - 在 x86_64 中為默認配置）

如果你真的想要一個輕量的系統，我們建議你用你自己的方法通過 static /devs 部署。無論如何，你都該設置你的 CPU 架構。為合適的硬體選擇 "Core 2 Duo" 可以得到較好的優化，但對於較差的硬體就不是很明顯了。

（實時）內核的常見問題：

- 超線程（如果懷疑是它導致的問題，可以在 UEFI 設置中將其禁用）

## 優化系統配置

注意：* 優化不是萬能的——效果很大取決於你的環境：對某些系統，優化是必需的，而對大多數用戶而言是不需要的。首先嘗試使用標準的 Arch Linux 內核；如果你對結果不滿意再考慮優化。比如你認為你的延遲或是系統穩定性可以進一步提高。

- 可以創造性一些，嘗試不同的設置。
- 實踐是唯一標準——在應用設置前後都要衡量性能

你可以參考下列常見的系統優化方式：

- 將 CPU 調頻調速器設至 performance
- 配置 pam_limits（例如安裝 realtime-privileges包 並將用戶添加至 `realtime` 組）
- 使用 `threadirqs` 內核參數（參考 [3]）- 實時內核已默認啟用該參數
- 使用實時內核
- 添加 `noatime` 至 fstab（參考性能優化#掛載選項）
- 通過在啟動階段執行下列命令來提高最大 RTC 中斷請求頻率（默認為 64 Hz）：

    # echo 2048 > /sys/class/rtc/rtc0/max_user_freq
    # echo 2048 > /proc/sys/dev/hpet/max-user-freq

- 降低系統的 swappiness 值（即交換頻率，默認為 `60`），例如：將該值設為 `10` 可讓系統在試圖交換到硬碟前等待更長時間。More precisely, it makes the kernel to prefer keeping all applications in RAM instead of swapping background applications out. 該值可通過執行 `sysctl vm.swappiness=10` 實時更改（詳情請參考 sysctl(8)），或是通過修改配置文件將設置持久化（參考 sysctl.d(5)），具體如下：

    /etc/sysctl.d/90-swappiness.conf

    vm.swappiness = 10

- 將 inotify 跟蹤用戶的最大文件數量（默認為 `524288`）提升到如 `600000` 有助於同時需要處理大量文件的程序（例如 DAW）。該值可通過執行 `sysctl fs.inotify.max_user_watches=600000` 臨時更改，或是通過單獨的配置文件將設置持久化：

    /etc/sysctl.d/90-max_user_watches.conf

    fs.inotify.max_user_watches = 600000

你可能也會想最大化 PCI 音效卡的 PCI 延遲計時器，並為所有 PCI 外設提高延遲計時器（默認為 64）：

    $ setpci -v -d *:* latency_timer=b0
    # setpci -v -s $SOUND_CARD_PCI_ID latency_timer=ff

例如 `SOUND_CARD_PCI_ID=03:00.0`。

可通過以下方式獲取 SOUND_CARD_PCI_ID：

    $ lspci -nnd ::04xx

    03:00.0 Multimedia audio controller [0401]: Creative Labs SB Audigy [1102:0004] (rev 05)
    03:01.0 Multimedia audio controller [0401]: VIA Technologies Inc. VT1720/24 [Envy24PT/HT] PCI Multi-Channel Audio Controller [1412:1724] (rev 01)

## 小技巧

- 在錄製時禁用 Wi-Fi，並關閉如瀏覽器等不需要的應用。很多人報告稱禁用 Wi-Fi 可提高 JACK 的性能穩定性。

- 有些 USB 音頻硬體在 USB 3 接口下工作會出現問題，在該情況下請嘗試 USB 2/1 接口。

- IRQ 有可能會導致問題出現。舉個例子，如果顯示硬體占用了總線，就會導致系統 I/O 路徑被不必要地中斷。具體內容請參考 FFADO IRQ Priorities How-To。如果你在使用實時或較新的內核，那可以使用 rtirq包 來調整 IRQ 處理線程的優先級。

- 不要或謹慎使用 irqbalance 守護進程 [4]。

- 如果你要在 JACK 2 上使用多個音頻設備，alsa_in 和 alsa_out 可將額外設備涵蓋在一起，並在 JACK 接線面板上作為多個輸出顯示。

- 有些（守護）進程會導致 xruns 出現。如果你不需要該進程，直接殺掉就行，無需多問。

    $ ls /var/run/daemons
    $ top # or htop, ps aux, whatever you are comfortable with
    $ killall -9 $processname
    # systemctl stop $daemonname

- 如果你碰到了大量 xruns 問題，尤其是使用了 nvidia包 的情況下，請禁用 GPU 節流。這一步可通過顯卡控制面板或英偉達的「prefer maximum performance」選項（感謝 Frank Kober 在 LAU 發布的文章 [5]）解決。

## 軟體

Arch Linux 提供了 pro-audio包組 軟體包組，其中包含了所有（准）專業音頻相關應用。pro-audio 包組中的軟體都屬於 JACK 客戶端，另外 lv2-plugins包組，ladspa-plugins包組，dssi-plugins包組，vst-plugins包組 和 clap-plugins包組 也是 pro-audio 的子包組。

提示：參考 Pacman/提示和技巧#查詢軟體包 來列出包組成員，以及 Pacman#安裝包組 來安裝包組。

部分軟體包的信息及簡介可於應用程式列表/多媒體#音頻獲取。特別是數字音頻工作站、聲音特效、音樂 Tracker、音頻合成環境和音頻生成器幾類，它們提供了用於錄製、混音、母帶及音頻設計的一系列工具示例。其它類別包括作譜工具、音頻編輯器、音頻轉換器及 DJ 軟體。

（尚）未包含在官方倉庫的軟體可通過 proaudio 獲取。瀏覽軟體包列表來查找你需要的應用，或是通過 GitHub 提出你的軟體需求。

## 硬體

多數音效卡和音頻硬體都不需要安裝特殊軟體包或進行額外設置，只需將 JACK 配置到目標硬體即可。

並不是所有硬體都這樣，針對特殊硬體請查閱分類:聲音，/硬體以及 Envy24control#Supported cards 來獲取更多信息。

## 獲取幫助

### 郵件列表

- Arch Linux Pro-audio 關於實時多媒體相關的討論，其中包括（准）專業音頻及視頻。
- Linux Audio User 與 Linux 專業音頻相關的郵件列表，有更高的活躍度及大規模的用戶和開發者群體關注。

### IRC

- #archlinux-proaudio - Arch Linux 專業音頻頻道
- #lau - Linux 音頻相關用戶頻道
- #jack - JACK 音頻系統相關的開發及支持
- #lv2 - LV2 插件格式相關的開發及支持
- #ardour - Ardour DAW 相關的討論及支持
- #opensourcemusicians - 開源軟體音樂家的大型討論頻道

## 參考

- 專業音頻 - 配置基於 Arch Linux 的專業音頻環境指南
- lv2-plugins-aur-metaAUR — 提供許多 LV2 插件
- awesome-linuxaudio - 適用於 Linux 平台的專業音/視頻及現場製作環境的軟體和資源清單
- 多媒體及遊戲 / Arch Linux 論壇
- 實時 - Linux 基金會的 PREEMPT_RT 補丁維基

分類：​

- 聲音

專業音頻
新增話題