JACK 音频连接工具包
- JACK 音频连接工具包 (或 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 中获得 dbus 支持,安装 jack2-dbus。
配置
根据您的用例和硬件,系统可能需要进一步配置,以允许 JACK 实现使用额外的资源或正常运行。
延迟
正在运行的 JACK 实例的延迟(即处理一个音频块所花费的时间)由其 每周期帧数
/采样率
比率定义。
以 jackd(1) § ALSA_BACKEND_OPTIONS 为例,这些参数分别由 -p
和 -r
标志定义。
每周期帧数
值,例如 1024,以进行初步测试,并尽可能降低。实时调度和附加资源
所有 JACK 实现都可以使用提升的实时调度优先级,这使它们比其他应用程序更频繁地使用 CPU 周期(例如,请参阅 jackd(1) § OPTIONS 中的 -P
)。
realtime-privileges 软件包提供了 realtime
系统组,该组被允许使用 sysctl 嵌入式配置文件提升的 rtprio
和无限制的 memlock
,并被允许更改系统的 /dev/cpu_dma_latency
文件,应用程序可以使用该文件来阻止 CPU 使用更高的 C 状态。
安装 realtime-privileges 软件包,并将您的用户 添加 到 realtime
组,以便能够使用高于默认值的实时调度优先级。
实时内核和高级修改
在需要极低延迟的情况下,可以使用有助于 实时内核补丁集 的内核(例如 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
)或使用支持通过库或 dbus 接口启动的图形前端来启动。
Pipewire-jack
Pipewire 的 JACK 实现不提供 jackd(1) 可执行文件或 dbus 集成。音频图由 pipewire.service
systemd 用户服务 启动。
JACK 实现的比较
下表列出了 JACK API 的当前实现及其不同的功能集。
名称 | 维护 | 语言 | SMP 支持 | Jackd 可执行文件 | Dbus 集成 | Systemd 集成 | 火线支持 | 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 控制 GUI 的比较
下表列出了 JACK 的控制 GUI 及其不同的功能以及对 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 音频连接工具包的多通道音频混音器应用程序。
- Patchage — 基于 JACK 和 ALSA 的音频和 MIDI 系统的模块化跳线盘。
- PatchMatrix — 流矩阵样式的 JACK 跳线盘。
- QjackCtl — 用于控制 JACK 声音服务器守护进程的简单 Qt 应用程序。
- RaySession — 音频会话管理器,带有跳线盘和 NSM 支持。
- Studio-Controls — 带有 USB 设备和 PulseAudio 桥接的 JACK 音频设置实用程序。
使用 MIDI 设备
JACK 可以很好地处理一个声卡,以及任意数量的 MIDI 设备(例如通过 USB 连接)。如果您启动 JACK 并想使用 MIDI 键盘或合成器或其他纯 MIDI 设备,则必须使用合适的声卡(实际输出或输入 PCM 声音的声卡)启动 JACK。完成此操作后,您可以连接 MIDI 设备。例如,使用 QjackCtl (qjackctl),单击连接按钮,您将在驱动程序下找到您的设备,列在 JACK-MIDI 或 ALSA-MIDI 下。
对于 JACK-MIDI,您可能需要在 QjackCtl 设置 > 设置 中将 MIDI 驱动程序 设置为 seq 或 raw。这应该使您的 MIDI 设备出现在 MIDI 选项卡下。如果您启用 设置 > 显示 > 启用客户端/端口别名,然后 启用客户端/端口别名编辑(重命名),您还可以更改客户端的名称(从通用的 “midi_capture_1” 到更具描述性的名称)。
对于 ALSA-MIDI,请确保在 QjackCtl 设置 > 杂项 中打开 启用 ALSA 音序器支持。这将在 QjackCtl 连接 窗口中添加 ALSA 选项卡,您的 MIDI 控制器将显示在该选项卡中。
为了将 ALSA-MIDI 桥接到 JACK-MIDI,您可以考虑使用 a2jmidid (a2jmidid)。以下命令会将所有可用的 ALSA MIDI 端口导出到 JACK MIDI 端口
$ a2j_control --ehw && a2j_control --start
它们将在 QjackCtl 的 MIDI 选项卡下标记为 “a2j” 客户端可见。您可以通过将以下内容添加到 QjackCtl 设置 > 选项 > 启动后执行脚本 来自动启动 a2jmidid:/usr/bin/a2j_control --ehw && /usr/bin/a2j_control --start
- 问: JACK-MIDI 和 ALSA-MIDI 之间有什么区别?
- 答: 前者具有改进的定时和采样精确的 MIDI 事件对齐。它扩展甚至可能取代后者,但在这一点上它们都共存。
要安装一些 M-Audio MIDI 键盘,您将需要固件软件包 midisport-firmwareAUR。此外,snd_usb_audio 模块必须可用。有关特定 USB MIDI 设备的更多信息,请参阅 https://alsa.opensrc.org/USBMidiDevices。
基于 Shell 的示例设置
JACK2 可以直接使用 jackd 可执行文件启动,也可以使用基于 D-Bus 的 jack_control 二进制文件控制。jack_control 使通过 shell 脚本启动和配置 JACK2 变得容易。请注意,您必须安装 jack2-dbus 软件包才能使用 jack_control。对于 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 实例,其他程序可以使用它。以下是每行代码的详细信息。在发现您自己的最佳配置时,使用 QjackCtl 的 GUI 和非 D-Bus JACK2 版本进行试错很有帮助。
基于 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 khz 采样率。碰巧与此卡配合得非常好。有些卡仅支持 44100,许多卡支持更高的采样率。采样率越高,延迟越低,但对您的卡和 CPU 的要求越高,并且软件也必须支持这一点。
$ jack_control dps nperiods 2
设置 JACK 以使用 2 个周期。2 适用于主板、PCI、PCI-X 等;3 适用于 USB。
$ jack_control dps period 64
设置 JACK 以使用每周期 64 帧。较低的值延迟较小,但此脚本中的设置提供了 2.67 毫秒的延迟,这在硬件压力不太大的情况下非常低。如果使用 USB 声音系统,则最好尝试 32。小于 3-4 毫秒的任何值都应该适用于实时合成和/或 FX,5 毫秒是人可以检测到的最小值。QjackCtl 会告诉您您的表现如何;在空载时,这意味着没有连接客户端,您会希望 CPU 使用率最高为 3-5%,如果您无法在没有 xruns 的情况下获得该值(红色数字表示系统无法跟上需求),则您将必须改进您的硬件。
$ sleep 10
等待上述操作完成。
$ a2j_control --ehw && a2j_control --start
启动 ALSA 到 JACK MIDI 的桥接。适用于混合使用通过 ALSA 而不是 JACK 接收 MIDI 输入的应用程序。
$ sleep 10
等待上述操作完成。
$ qjackctl &
加载 QjackCtl。GUI 配置告诉它在系统托盘中运行。它会很好地拾取由 D-Bus 启动的 JACK 会话,并且非常流畅。它维护跳线盘、这些应用程序和任何其他要手动启动的启用 JACK 的应用程序之间的连接。跳线盘是使用手动 GUI 设置的,但是当应用程序启动时,QjackCtl 本身会自动创建在跳线盘中预先配置的连接。
基于 GUI 的示例设置
此示例设置利用更注重 GUI 的 JACK 配置和管理
- 安装 jack2 和 jack2-dbus。
- 安装 qjackctl,并告诉您的 GUI 窗口/桌面系统在启动时运行它。
- 确保 QjackCtl 被告知
- 使用 D-Bus 接口,
- 在启动时运行,
- 将其配置保存到默认位置,
- 在应用程序启动时启动 JACK 音频服务器,
- 启用系统托盘图标,以及
- 启动时最小化到系统托盘。
- 重启。
- 登录后,您将在系统托盘中看到 QjackCtl。左键单击它。
- 调整 QjackCtl GUI 中的设置以降低延迟。帧大小、帧缓冲区和比特率设置都会影响延迟。较大的帧大小会降低延迟,较低的帧缓冲区会降低延迟,较高的比特率设置会降低延迟,但所有这些都会增加声卡和 CPU 的负载。大约 5 毫秒的延迟对于直接监听乐器或麦克风是理想的,因为延迟在更高的延迟下开始变得明显。
另一种基于 GUI 的设置
如果您将 JACK 用于要求苛刻的任务,但偶尔使用,则可以在使用 QjackCtl 时暂停正在运行的 pulseaudio 会话。在初始配置中,修改 “设置” > “高级” 子菜单中的 “服务器前缀” 选项,使其声明
pasuspender -- jackd
关闭 QjackCtl 后,pulseaudio 会话应恢复正常。提示由 此帖子 提供。
与 ALSA 友好相处
要允许 Alsa 程序在 jack 运行时播放,您必须使用 alsa-plugins 安装 alsa 的 jack 插件。
并通过编辑(或创建)/etc/asound.conf(系统范围设置)来启用它,如果您有一个简单的 2 声道设置,则添加以下行
# convert alsa API over jack API # use it with # % aplay foo.wav # use this as default pcm.!default { type plug slave.pcm "jack" hint.description "Jack Audio" }
如果您有不同数量的输出/输入通道,或者您的前两个通道不是您希望路由音频的通道,则不能使用来自 /etc/alsa/conf.d/50-jack.conf
的预定义 jack pcm 源,而是类似这样的
pcm.!jack { type jack # If "mpv --ao:alsa ..." gives you this error: # [ao/alsa] Unable to set buffer time near: Invalid argument # uncomment the following to allow non-jack-aligned period size: #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。
另一种(更强大但绝对更复杂)方法是配置和使用 ALSA 回环设备,方法是加载 snd-aloop
内核模块,如 本文 所述。这种 snd-aloop 方法也可用于将 Wine 的 ALSA 输出桥接到 JACK,如 [3] 中所述。
GStreamer
GStreamer 需要 gst-plugins-good 软件包才能与 JACK 一起使用,该软件包包含添加 JACK 播放支持的 jackaudiosink 插件。
更多信息(已过时):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#通过 JACK 的 PulseAudio
已知 Cadence 和其他 JACK GUI 应用程序会将值写入 ~/.pulse/daemon.conf
。这些值会覆盖任何系统范围的默认值,从而导致意外行为(例如,音量平坦)。有关如何更新这些配置,请参阅 PulseAudio#配置。
火线
为了防止 ALSA 干扰您的火线设备,您必须将所有火线相关的内核模块列入黑名单。这也阻止 PulseAudio 使用火线。创建以下文件
/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 上提供的最新列表。
现在您可以卸载您加载的火线模块或重启。
网络/远程音频
JACK 可以配置为通过网络将音频数据发送到“主”机,然后由主计算机将音频输出到物理设备。这对于混合来自多台“从”计算机的音频非常有用,无需额外的电缆或硬件混音器,并尽可能长时间地保持音频路径为数字信号(因为带数字输入的硬件混音器非常罕见)。
配置非常简单,但是它需要支持组播流量的网络(即,必须在托管网络交换机上启用 IGMP 侦听),并且它要求所有机器运行相同的 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
如果您像上面一样将 -c
选项传递给 jack_load
,那么远程系统现在将能够播放音频。
故障排除
启动时出现 “Cannot lock down memory area (Cannot allocate memory)” 消息
请参阅 Realtime process management#Configuring 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 或任何本机支持的采样率。这允许 jack 将音频发送到系统,而无需重新采样。在使用 jack_control
的 jack2 中,可以通过以下方式完成:
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:自动连接到可写入客户端 (启用)