跳至內容

JACK Audio Connection Kit

出自 Arch Linux 中文维基

來自 維基百科的 JACK Audio Connection Kit 條目:

JACK Audio Connection Kit(簡稱 JACK,是一個遞歸縮寫)是一種專業音頻伺服器守護進程,可在實現其 API 的應用程式之間為音頻和 MIDI 數據提供實時、低延遲的連接。

安裝

JACK API 有三種不同的實現:jackAUR、jack2包 和 pipewire-jack包。概覽請參閱 #JACK 實現的比較。

安裝上述軟體包之一。若需支持 32 位應用程式,還應從 multilib 倉庫中分別安裝 lib32-jack2包 或 lib32-pipewire-jack包。

要使用 JACK 官方示例客戶端和工具,請安裝 jack-example-tools包。

要為 jack2包 提供另一種 ALSA MIDI 支持方式,請安裝 a2jmidid包。

要讓 jack2包 支持 D-Bus,請安裝 jack2-dbus包。

配置

根據使用場景和硬體情況,系統可能需要進一步配置,才能使 JACK 實現獲得額外資源或正常運行。

延遲

運行中的 JACK 實例的延遲(即處理一個音頻數據塊所需的時間)由 frames per period(每周期幀數)與 sample rate(採樣率)的比值決定。

以 jackd(1) § ALSA_BACKEND_OPTIONS 為例,這兩個參數分別由 -p 和 -r 選項指定。

注意:根據硬體和系統配置的不同,過低的延遲可能導致音頻中斷(也稱為 Xruns)。 建議先採用相對較高的 frames per period 值(例如 1024)進行測試,再儘可能逐步降低。

實時調度與額外資源

所有 JACK 實現都可以使用更高的實時調度優先級,使其比其他應用程式更頻繁地獲得 CPU 執行時間(例如參見 jackd(1) § OPTIONS 中的 -P)。

realtime-privileges包 軟體包提供 realtime 系統用戶組。通過 sysctl 配置片段,該組可使用更高的 rtprio 優先級和無限制的 memlock,也允許修改系統的 /dev/cpu_dma_latency 文件;應用程式可藉此阻止 CPU 進入較深的 C 狀態。

安裝 realtime-privileges包,並將用戶加入 realtime 組,以便使用高於默認值的實時調度優先級。

實時內核與高級調整

當需要極低延遲時,可以使用realtime kernel(例如 linux-rt包 或 linux-rt-lts包)。有關更多信息及其他高級調整,請參閱 專業音頻。

注意:JACK 上游項目表示,大多數用戶並不需要realtime kernel。[1]

啟動音頻圖

不同 JACK 實現啟動音頻圖的方式各不相同。

Jack

Jack1 只支持通過 jackd(1) 可執行文件,或通過支持庫接口啟動功能的圖形前端啟動。

Jack2

Jack2 支持通過 jackd(1) 可執行文件、jack_control 腳本(由 jack2-dbus包 提供)、jack@.service systemd用戶服務(配置說明見 /etc/jack/example.conf),或支持庫接口及 D-Bus 接口的圖形前端啟動。

警告:啟動音頻圖時,只能選擇 jackd(1) 或 jackdbus/jack_control 其中一種方式。混用兩種方式可能導致非常混亂的結果!

Pipewire-jack

PipeWire 的 JACK 實現不提供 jackd(1) 可執行文件,也不集成 D-Bus。音頻圖由 pipewire.service systemd用戶服務啟動。

JACK 實現的比較

下表列出了當前的 JACK API 實現及其功能差異。

名稱 維護狀態 語言 SMP 支持 jackd 可執行文件 D-Bus 集成 Systemd 集成 FireWire 支持 ALSA MIDI 支持 多音效卡支持 網絡支持
jackAUR 停止維護 C 否 是 否 否 ALSA/libffado包 內置 jack-example-tools包 netJACK1/ jacktrip包/ zita-njbridge包
jack2包 活躍 C/C++ 是 是 是 是 ALSA/libffado包 內置/ a2jmidid包 [2] 內置/jack-example-tools包 netJACK2/ jacktrip包/ zita-njbridge包
pipewire-jack包 活躍 C/C++ 是 否 否 是 ALSA 內置 內置 jacktrip包/ zita-njbridge包

JACK 控制圖形界面的比較

下表列出了用於控制 JACK 的圖形界面,以及它們的功能和對不同 JACK 實現的支持情況。

名稱 啟動/停止 jack1 啟動/停止 jack2 啟動/停止 pipewire-jack 接線面板 保存音頻圖連接 支持 new-session-manager包
cadenceAUR 否 是 否 是(Catia) 否(不支持通過 Claudia 使用 LADISH) 否
carla包 否 否 否 是 是 是
patchageAUR 否 否 否 是 否 否
patchmatrix包 否 否 否 是 否 否
qjackctl包 是 是 否 是 是 否
raysessionAUR 否 否 否 是 是 是
studio-controls-gitAUR 是 是 否 否 否 否

提示與技巧

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

原因:缺少通過 jack-example-tools包 中的 jack_load 使用內部客戶端的說明。 (在 Talk:JACK Audio Connection Kit 中討論)

與 JACK 及其音頻圖交互的應用程式

  • Cadence — 一組有助於音頻製作的工具,可檢查系統、管理 JACK、調用其他工具並調整系統設置。
https://kx.studio/Applications:Cadence || cadenceAUR
  • Carla — 功能完善的插件宿主,支持多種音頻驅動和插件格式。
https://kx.studio/Applications:Carla || carla包
  • Jack Mixer — 適用於 JACK Audio Connection Kit 的多聲道音頻混音器。
https://github.com/jack-mixer/jack_mixer || jack_mixer包
  • Patchage — 基於 JACK 和 ALSA 的模塊化音頻及 MIDI 接線面板。
https://drobilla.net/software/patchage || patchageAUR
  • PatchMatrix — 採用矩陣形式呈現連接關係的 JACK 接線面板。
https://git.open-music-kontrollers.ch/~hp/patchmatrix || patchmatrix包
  • QjackCtl — 用於控制 JACK 音頻伺服器守護進程的簡易 Qt 應用程式。
https://qjackctl.sourceforge.io/ || qjackctl包
  • RaySession — 具有接線面板並支持 NSM 的音頻會話管理器。
https://raysession.tuxfamily.org/ || raysessionAUR
  • Studio-Controls — 提供 USB 設備和 PulseAudio 橋接功能的 JACK 音頻配置工具。
https://github.com/ovenwerks/studio-controls/ || studio-controls-gitAUR

使用 MIDI 設備

JACK 能很好地處理一張音效卡,同時可以處理任意數量的 MIDI 設備(例如通過 USB 連接的設備)。 如果啟動 JACK 後希望使用 MIDI 鍵盤、合成器或其他純 MIDI 設備,就必須先讓 JACK 使用合適的音效卡(即實際能夠輸入或輸出 PCM 音頻的音效卡)。 完成上述步驟後即可連接 MIDI 設備。例如在 QjackCtl(qjackctl包)中單擊連接按鈕,便可根據使用的驅動,在 JACK-MIDI 或 ALSA-MIDI 下找到設備。

對於 JACK-MIDI,可以在 QjackCtl 的 Setup > Settings 中將 MIDI Driver 設置為 seq 或 raw,使 MIDI 設備出現在 MIDI 選項卡中。還可以在 Setup > Display > Enable client/port aliases 中啟用客戶端/埠別名,再啟用 Enable client/port aliases editing (rename),將通用名稱(如 "midi_capture_1")改成更易識別的名稱。

對於 ALSA-MIDI,應在 QjackCtl 的 Setup > Misc 中啟用 Enable ALSA Sequencer support。這會在 QjackCtl 的 Connect 窗口中添加 ALSA 選項卡,MIDI 控制器將顯示在其中。

注意:jack2包 默認不包含針對僅支持舊式 ALSA MIDI 的應用程式的橋接功能。因此,在上游實現相應功能之前,需要安裝 a2jmidid包。

要將 ALSA-MIDI 橋接至 JACK-MIDI,可以使用 a2jmidid(a2jmidid包)。以下命令會將所有可用的 ALSA MIDI 埠導出為 JACK MIDI 埠:

$ a2j_control --ehw && a2j_control --start

這些埠將在 QjackCtl 的 MIDI 選項卡中顯示為名為 "a2j" 的客戶端。 可以在 QjackCtl 的 Setup > Options > Execute script after Startup 中添加 /usr/bin/a2j_control --ehw && /usr/bin/a2j_control --start,使 a2jmidid 自動啟動。

注意:在 QjackCtl 中連接 MIDI 鍵盤控制器時,請先選擇 Expand All,然後將所需的 Output Ports(位於 Readable Clients 下)連接到 Input Ports(位於 Writable Clients 下)。也可以直接選擇可寫客戶端作為目標,而不逐一選擇埠,這樣會連接其下方當前顯示的所有輸出埠。
  • 問: JACK-MIDI 和 ALSA-MIDI 有什麼區別?
  • 答: 前者具有更好的時序精度,能夠讓 MIDI 事件與音頻採樣精確對齊。它擴展了後者,甚至可能取代後者,但目前兩者仍然共存。

要安裝某些 M-Audio MIDI 鍵盤,需要固件包 midisport-firmwareAUR,同時還必須提供 snd_usb_audio 內核模塊。

有關特定 USB MIDI 設備的更多信息,請參閱 USBMidiDevices 條目。

基於 Shell 的配置示例

JACK2 可以直接通過 jackd 可執行文件啟動,也可以通過基於 D-Bus 的 jack_control 程序控制。使用 jack_control 可以方便地通過 Shell 腳本啟動和配置 JACK2。注意,使用 jack_control 需要安裝 jack2-dbus包;使用 a2j_control 命令還需要安裝 a2jmidid包(更多信息請參閱 #使用 MIDI 設備)。

創建一個在登錄 X 時執行的 Shell 腳本:

start_jack.sh
#!/bin/sh

jack_control start
jack_control ds alsa
jack_control dps device hw:HD2
jack_control dps rate 48000
jack_control dps nperiods 2
jack_control dps period 64
sleep 10
a2j_control --ehw
a2j_control --start
sleep 10
qjackctl &

以上腳本會啟動可供其他程序使用的 JACK 實例。下面逐行解釋。在尋找適合自己的最佳配置時,可以使用未通過 D-Bus 啟動的 JACK2 版本,並藉助 QjackCtl 圖形界面反覆嘗試。

Shell 配置示例詳解

$ jack_control start

如果 JACK 尚未啟動,則將其啟動。

$ jack_control ds alsa

將 JACK 配置為使用 ALSA 驅動。

$ jack_control dps device hw:HD2

讓 JACK 使用名為 HD2 的 ALSA 兼容音效卡。可以使用 cat /proc/asound/cards 查看音效卡名稱。大多數 ALSA 教程和默認配置使用音效卡編號,但連接外部 MIDI 設備時編號可能讓人困惑,因此使用名稱更方便。

$ jack_control dps rate 48000

將 JACK 的採樣率設置為 48000 Hz。此設置恰好很適合這張音效卡。有些音效卡僅支持 44100 Hz,很多則支持更高採樣率。採樣率越高,延遲越低,但對音效卡、CPU 和軟體支持的要求也越高。

$ jack_control dps nperiods 2

將 JACK 設置為每緩衝區 2 個周期。對於主板集成音效卡、PCI、PCI-X 等設備,2 通常比較合適;對於 USB 設備,則可以使用 3。

$ jack_control dps period 64

將 JACK 設置為每周期 64 幀。幀數越少,延遲越低;此示例中的設置產生 2.67 ms 的延遲,既足夠低,又不會給相應硬體帶來太大壓力。如果使用 USB 音頻設備,可以嘗試 32 幀。對於實時合成和音頻效果處理,低於 3~4 ms 的延遲通常已經足夠;原文認為約 5 ms 是人類能察覺的最小延遲。QjackCtl 可幫助查看運行情況:在沒有客戶端連接的空載狀態下,CPU 使用率最好不超過 3%~5%。如果無法在避免 Xruns(表示系統處理能力跟不上需求的紅色數字)的同時達到這一目標,則需要改善硬體條件。

$ sleep 10

等待上述操作完成並穩定下來。

$ a2j_control --ehw && a2j_control --start

啟動 ALSA 到 JACK 的 MIDI 橋接。適合讓只支持通過 ALSA 接收 MIDI 輸入、不支持 JACK 的應用程式參與混音。

$ sleep 10

等待上述操作完成並穩定下來。

$ qjackctl &

啟動 QjackCtl。圖形界面配置可使它常駐系統托盤。它能夠順利識別由 D-Bus 啟動的 JACK 會話,並管理接線面板,即這些應用程式與隨後手動啟動的其他 JACK 應用程式之間的連接。接線面板通過圖形界面手動配置,但其中預先設置的連接會在相應應用程式啟動時由 QjackCtl 自動建立。

基於圖形界面的配置示例

此示例側重於通過圖形界面配置和管理 JACK。

  • 安裝 jack2包 和 jack2-dbus包。
  • 安裝 qjackctl包,並將其配置為隨圖形窗口/桌面系統啟動。
  • 確保在 QjackCtl 中設置以下選項:
    • 使用 D-Bus 接口;
    • 開機啟動;
    • 將配置保存至默認位置;
    • 在應用程式啟動時啟動 JACK 音頻伺服器;
    • 啟用系統托盤圖標;
    • 啟動時最小化至系統托盤。
  • 重啟計算機。
  • 登錄後,系統托盤中會出現 QjackCtl。左鍵單擊其圖標。
  • 在 QjackCtl 圖形界面中調整設置以降低延遲。幀大小、幀緩衝區和比特率都會影響延遲。原文指出,更大的幀大小、更小的幀緩衝區和更高的比特率有助於降低延遲,但都會增加音效卡和 CPU 的負擔。直接監聽樂器或麥克風時,延遲最好在約 5 ms,因為更高的延遲開始變得可察覺。

另一種基於圖形界面的配置方法

如果只是偶爾使用 JACK 執行高負載任務,可以在使用 JACK 時通過 QjackCtl 暫停正在運行的 PulseAudio 會話。對於初始配置,在 Settings > Advanced 子菜單中將 Server prefix 選項修改為:

   pasuspender -- jackd

關閉 QjackCtl 後,PulseAudio 會話應能正常恢復。此技巧來自這篇帖子。

與 ALSA 協同運行

要使 ALSA 程序能在 JACK 運行期間播放音頻,需要安裝 alsa-plugins包 中的 ALSA JACK 插件。

若使用簡單的雙聲道配置,還需要編輯(或創建)系統級配置文件 /etc/asound.conf,添加以下內容以啟用插件:

# 将 ALSA API 转换至 JACK API
# 使用方法
# % aplay foo.wav

# 将其设为默认设备
pcm.!default {
    type plug
    slave.pcm "jack"
    hint.description "Jack Audio"
}

如果輸入/輸出聲道數不同,或者最前面的兩個聲道不是需要輸出音頻的目標聲道,就不能使用 /etc/alsa/conf.d/50-jack.conf 中預定義的 JACK PCM 源,而應使用類似以下的配置:

pcm.!jack {
    type jack
    # 如果 "mpv --ao:alsa ..." 报错:
    # [ao/alsa] Unable to set buffer time near: Invalid argument
    # 取消下一行注释,以允许周期大小不与 JACK 对齐:
    #align_psize = 0
    playback_ports {
        0 system:playback_2
        1 system:playback_3
    }
}

pcm.!default {
    type plug
    slave.pcm "jack"
    hint.description "Jack Audio"
}

無需重啟計算機。只需編輯 ALSA 配置文件並啟動 JACK,即可使用。

請記得以普通用戶身份啟動。如果用戶 X 運行 jackd -d alsa,則用戶 Y 將無法使用該實例。

另一種更可靠但也更複雜的方法,是加載 snd-aloop 內核模塊,配置並使用 ALSA 迴環設備,具體說明參見這篇文章。如這裡所述,這種 snd-aloop 方法也能將 Wine 的 ALSA 輸出橋接到 JACK。

GStreamer

GStreamer 需要 gst-plugins-good包 軟體包才能使用 JACK。該軟體包包含 jackaudiosink 插件,可提供 JACK 音頻播放支持。

更多信息(已過時):https://jackaudio.org/faq/gstreamer_via_jack.html

PulseAudio

如果必須保留 PulseAudio(例如 gnome-settings-daemon包 等其他軟體包依賴它),則可能需要阻止它隨 X 自動啟動,以免搶占 JACK 使用的音頻設備。

編輯 /etc/pulse/client.conf,取消 "autospawn" 一行的注釋並將其設置為 "no":

;autospawn = yes
autospawn = no

如果希望兩者同時工作,請參閱:PulseAudio/Examples#PulseAudio through JACK。

已知 Cadence 和其他 JACK 圖形界面應用程式會向 ~/.pulse/daemon.conf 寫入配置。這些值會覆蓋系統級默認值,可能造成意外行為(例如平坦音量)。如何更新這些配置,請參閱 PulseAudio#Configuration。

FireWire

為防止 ALSA 干擾 FireWire 設備,需要將所有與 FireWire 相關的內核模塊列入黑名單。這也會阻止 PulseAudio 使用 IEEE 1394。創建以下文件:

/etc/modprobe.d/alsa-no-jack.conf
blacklist snd-fireworks
blacklist snd-bebob
blacklist snd-oxfw
blacklist snd-dice
blacklist snd-firewire-digi00x
blacklist snd-firewire-tascam
blacklist snd-firewire-lib
blacklist snd-firewire-transceiver
blacklist snd-fireface
blacklist snd-firewire-motu

此模塊列表在編寫時是 ALSA Firewire Improve Repository 中提供的最新版本。

現在可以卸載已加載的 FireWire 模塊,或重啟計算機。

網絡/遠程音頻

本文或本節內容已經過時。

原因: 本節未涵蓋 jackAUR 與 jack2包 的 netJACK 實現之間的差異,也未介紹 zita-njbridge包 或 jacktrip包。 (在Talk:JACK Audio Connection Kit討論)

可以配置 JACK,讓它通過網絡向一台「主機」發送音頻數據,再由主機將音頻輸出至實體設備。這可用於混合多台「從機」的音頻,而不需要額外線纜或硬體混音器,並儘可能延長音頻信號保持數字形式的傳輸路徑(因為帶數字輸入的硬體混音器非常少見)。

配置非常簡單,但網絡必須支持組播流量(即在可管理網絡交換機上啟用 IGMP Snooping),並且所有計算機都必須運行相同主版本的 JACK(JACK1 或 JACK2),因為這兩個版本的網絡協議互不兼容。對於 JACK2,需要加載 netmanager 模塊:

master$ jack_load netmanager -i -c

-i -c 選項指示 netmanager 將所有傳入連接自動映射到默認音頻設備。不使用這些選項時,每次建立傳入連接都必須手動映射。可以改用 -i -h 查看所有可用選項,但請注意,選項說明會列印到 jackd 伺服器輸出中,jack_load 命令本身不會顯示任何內容。

在客戶端,需要以網絡模式啟動 JACK:

slave$ jackd -d net

兩台計算機將建立連接,主機上會顯示新的音頻源:

master$ jack_lsp
system:playback_1
system:playback_2
remotehost:from_slave_1
remotehost:from_slave_2

如果如上所示向 jack_load 傳遞 -c 選項,遠程系統現在就可以播放音頻。

故障排除

啟動時提示「Cannot lock down memory area (Cannot allocate memory)」

請參閱 實時進程管理#配置PAM,並確認用戶屬於 realtime 用戶組。

jack2 和 qjackctl 錯誤

單擊 QjackCtl 的啟動按鈕時,仍然出現「Cannot allocate memory」和/或「Cannot connect to server socket err = No such file or directory」錯誤嗎?

請刪除 ~/.jackdrc、~/.config/jack/conf.xml 和 ~/.config/rncbc.org/QjackCtl.conf,終止 jackdbus 進程,然後重新開始配置。 (感謝 nedko)

還可以嘗試執行:

$ fuser /dev/snd/*

然後根據得到的 PID 檢查相應進程:

$ ps ax | grep [PID here]

這樣有望找到發生衝突的程序。

日誌中出現「ALSA: cannot set channel count to 1 for capture」錯誤

將 ALSA 輸入和輸出聲道數從 1 改為 2。

音頻出現噼啪聲或爆音

CPU 或音效卡的性能可能不足以承受當前的 JACK 設置。可以逐步降低比特率、減小幀大小,並增加每緩衝區的周期數,直到爆音消失。也可以嘗試將採樣率改為 44100 Hz 或設備原生支持的採樣率,使 JACK 無需重採樣便可向系統輸出音頻。在 jack2包 中使用 jack_control 可通過以下命令設置:

jack_control dps rate 44100

沒有聲音

如果所有功能看起來都正常——JACK 的界面能夠顯示音頻活動,PulseAudio 等其他程序也能輸出聲音——請檢查音效卡支持的最大採樣位深度。如果音效卡只支持 16 位採樣,那麼在告訴 JACK 不要使用更高位深度之前,可能完全聽不到聲音:

jack_control dps shorts true

如果安裝了 jack-example-tools包,可運行 jack_simple_client 向 JACK 輸出端發送測試音。

特定應用程式的問題

VLC:啟動 JACK 後沒有聲音

啟動 VLC 並修改以下菜單選項:

  • 工具 > 首選項
  • 顯示設置:全部
  • 音頻 > 輸出模塊 > 音頻輸出模塊:JACK 音頻輸出
  • 音頻 > 輸出模塊 > JACK:自動連接到可寫客戶端(啟用)

參見