JACK Audio Connection Kit
來自 維基百科的 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 選項指定。
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 實現啟動音頻圖的方式各不相同。
Jack
Jack1 只支持通過 jackd(1) 可執行文件,或通過支持庫接口啟動功能的圖形前端啟動。
Jack2
Jack2 支持通過 jackd(1) 可執行文件、jack_control 腳本(由 jack2-dbus包 提供)、jack@.service systemd用戶服務(配置說明見 /etc/jack/example.conf),或支持庫接口及 D-Bus 接口的圖形前端啟動。
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 及其音頻圖交互的應用程式
- Cadence — 一組有助於音頻製作的工具,可檢查系統、管理 JACK、調用其他工具並調整系統設置。
- Carla — 功能完善的插件宿主,支持多種音頻驅動和插件格式。
- Jack Mixer — 適用於 JACK Audio Connection Kit 的多聲道音頻混音器。
- Patchage — 基於 JACK 和 ALSA 的模塊化音頻及 MIDI 接線面板。
- PatchMatrix — 採用矩陣形式呈現連接關係的 JACK 接線面板。
- QjackCtl — 用於控制 JACK 音頻伺服器守護進程的簡易 Qt 應用程式。
- RaySession — 具有接線面板並支持 NSM 的音頻會話管理器。
- Studio-Controls — 提供 USB 設備和 PulseAudio 橋接功能的 JACK 音頻配置工具。
使用 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 控制器將顯示在其中。
要將 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 自動啟動。
- 問: 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 模塊,或重啟計算機。
網絡/遠程音頻
可以配置 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:自動連接到可寫客戶端(啟用)