JACK 音频连接工具包

来自 ArchWiki
(重定向自 Jack)

来自 Wikipedia:JACK 音频连接工具包

JACK 音频连接工具包 (或 JACK;一个递归首字母缩略词) 是一个专业的声音服务器守护程序,它为实现其 API 的应用程序之间的音频和 MIDI 数据提供实时、低延迟的连接。

安装

JACK API 有三种不同的实现:jackAURjack2pipewire-jack。 有关概述,请参阅#JACK 实现方案的比较

安装 上述软件包之一。 为了获得 32 位应用程序的支持,另请从 multilib 仓库安装 lib32-jack2lib32-pipewire-jack 软件包(分别)。

要获得官方的 JACK 示例客户端和工具,安装 jack-example-tools

为了在 jack2 中获得替代的 ALSA MIDI 支持,安装 a2jmidid

为了使 jack2 支持 dbus安装 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 组,以便能够使用高于默认值的实时调度优先级。

实时内核和高级修改

在需要非常低延迟的情况下,可以使用促进 实时内核补丁集 的内核(例如 linux-rtlinux-rt-lts)。 有关更多信息和其他高级修改,请参阅专业音频

注意: JACK 上游建议大多数用户不需要 实时内核 [1]

启动音频图

不同的 JACK 实现有不同的启动音频图的方式。

Jack

Jack1 仅支持通过 jackd(1) 可执行文件启动,或使用支持通过库接口启动的图形前端之一。

Jack2

Jack2 支持通过 jackd(1) 可执行文件、jack_control 脚本(由 jack2-dbus 软件包提供)、jack@.service systemd 用户服务(有关配置文档,请参阅 /etc/jack/example.conf)或使用支持通过库或 dbus 接口启动的图形前端之一来启动。

警告: 仅使用 jackd(1)jackdbus/jack_control 之一来启动音频图。 混合使用两者可能会导致非常混乱的结果!

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-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 音频连接套件的多通道音频混音器应用程序。
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 设备,则必须使用合适的声卡(实际输出或输入 PCM 声音的声卡)启动 JACK。完成此操作后,您可以连接 MIDI 设备。例如,使用 QjackCtl (qjackctl),您单击连接按钮,您将在 JACK-MIDI 或 ALSA-MIDI 下找到您的设备,具体取决于驱动程序。

对于 JACK-MIDI,您可能需要在 QjackCtl 设置 > 设置 中将 MIDI 驱动程序 设置为 seqraw。 这应该使您的 MIDI 设备出现在MIDI 选项卡下。如果您启用设置 > 显示 > 启用客户端/端口别名,然后启用客户端/端口别名编辑(重命名),您还可以更改客户端的名称(从通用的“midi_capture_1”更改为更具描述性的名称)。

对于 ALSA-MIDI,请确保在 QjackCtl 设置 > 杂项 中打开 启用 ALSA 音序器支持。 这将在 QjackCtl 连接 窗口中添加 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 设置 > 选项 > 启动后执行脚本 来自动启动 a2jmidid: /usr/bin/a2j_control --ehw && /usr/bin/a2j_control --start

注意: 在 QjackCtl 中连接 MIDI 键盘控制器时,请确保先全部展开,然后将所需的输出端口(在可读客户端下方)连接到输入端口(在可写客户端下方)。 作为快捷方式,如果您选择可写客户端而不是单个端口作为目标,它应该连接其下方当前显示的所有输出端口。
  • 问: 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 实例,其他程序可以利用它。 每个行的详细信息如下。 当发现您自己最佳配置时,使用带有非 D-Bus JACK2 版本的 QjackCtl GUI 进行试错很有帮助。

基于 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 配置和管理

  • 安装 jack2jack2-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 一起使用,该软件包包含 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 GUI 应用程序会将值写入 ~/.pulse/daemon.conf。 这些值会覆盖任何系统范围的默认值,从而启用意外的行为(例如,平面音量)。 有关如何更新这些配置,请参阅 PulseAudio#Configuration

火线

为了防止 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 中可用的最新列表。

现在您可以卸载已加载的火线模块或重新启动。

网络 / 远程音频

本文或本节已过时。

原因: 本节未涵盖 jackAUR/ jack2 netJACK 实现之间的差异,并且未涵盖 zita-njbridgejacktrip。(在 Talk:JACK Audio Connection Kit 中讨论)

可以将 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_controljack2 中,这可以通过以下方式完成:

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:自动连接到可写客户端 (启用)

另请参阅