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 实例的延迟(即处理一个音频块所花费的时间)由其 每周期帧数/采样率 比率定义。

jackd(1) § ALSA_BACKEND_OPTIONS 为例,这些参数分别由 -p-r 标志定义。

注意: 根据硬件和系统配置,非常低的延迟可能会导致音频丢失(又名 Xruns)。首先从合理的较高 每周期帧数 值(例如 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 集成 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 控制 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-toolsjack_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 实例,其他程序可以利用它。以下是每一行的详细信息。在发现您自己最佳配置时,使用 QjackCtl 的 GUI 和非 D-Bus JACK2 版本进行试错会很有帮助。

基于 Shell 的示例设置的详细信息

$ jack_control start

如果 JACK 尚未启动,则启动 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。

对于另一种(更强大但肯定更复杂)方法,是通过加载 snd-aloop 内核模块来配置和使用 ALSA 回环设备,如 本文 中所述。此 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/示例#通过 JACK 的 PulseAudio

已知 Cadence 和其他 JACK GUI 应用程序会将值写入 ~/.pulse/daemon.conf。这些值会覆盖任何系统范围的默认值,从而导致意外行为(例如,音量平坦)。有关如何更新这些配置,请参阅 PulseAudio#配置

Firewire

为了防止 ALSA 干扰您的 Firewire 设备,您必须将所有与 Firewire 相关的内核模块列入黑名单。这也阻止了 PulseAudio 使用 Firewire。创建以下文件

/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-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,则远程系统现在将能够播放音频。

故障排除

"无法锁定内存区域 (无法分配内存)" 启动时消息

请参阅 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:无法将捕获的通道数设置为 1" 日志中的错误

将 ALSA 输入和输出通道从 1 更改为 2

音频中的爆裂声或噼啪声

您的 CPU 或声卡太弱,无法处理 JACK 的设置。 降低比特率,降低帧大小,并以小增量提高帧周期,直到噼啪声停止。 您也可以尝试将采样率更改为 44100 或本机支持的任何值。 这允许 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:自动连接到可写客户端(启用)

另请参阅