专业音频

来自 ArchWiki

本文介绍如何配置您的系统以进行录制、混音和回放音频,以及如何使用它来合成和生成声音。这些活动都归属于“专业音频”(pro audio)的范畴,并且通常需要低延迟性能。

与视频制作或游戏相比,大多数应用程序不需要那么多高端硬件。几乎所有 2012 年末之后生产的计算机都可以针对专业音频进行优化。请参阅 Ardour 手册中关于数字音频的正确计算机系统页面以获取更多信息。

注意:如果您正在寻找关于如何在 GNU/Linux 上实际制作音乐的指南,请搜索 LinuxMusicians 论坛。

入门

在阅读声音系统文章后,您可能会意识到高级 Linux 声音架构或 ALSA 是 Linux 内核的一部分,并用作 Arch Linux 上默认声音系统的驱动程序和接口。ALSA 应该在默认 Arch 安装中开箱即用。如果不是这种情况,您必须先解决问题才能继续进行。

但是,“没有声音”很可能是 ALSA 混音器配置中一个简单的取消静音通道问题。如果您正在使用多个音频设备(例如 USB 音频接口,并请记住集成声卡),您可能需要设置默认声卡

我是否正确设置了声音?

$ speaker-test
请参阅 ALSA 进行故障排除。

在大多数用例中,原版 Arch Linux 内核足以实现低延迟操作。只有当您遇到音频掉线(也称为故障)或者您需要(或想要)达到超低延迟操作时,才需要应用进一步的#系统配置

为了完成优化,这些超低延迟操作可能需要您设置#实时内核

虽然一些专业音频软件可以直接与 ALSA 一起工作,但稍后提到的#应用程序中的大多数是 JACK 音频连接套件或 JACK 客户端。因此,您将需要安装和设置即将概述的可用声音服务器之一。

提示:但是,如果您是 Arch Linux 的新手,刚刚完成安装指南并且迫不及待地想开始制作音乐,请安装 pro-audio 软件包组以及 realtime-generic-setupAUR 并重新启动。请参阅#仅 PipeWire 部分以进行快速设置,并找到您的#应用程序以进行音乐和声音制作。

系统配置

注意:关于最佳实践和系统配置的信息质量差异很大(并且在许多地方已过时甚至相互矛盾)。虽然对于某些系统和设置,更高级别的优化是必要的,但对于大多数用户来说情况并非如此。首先尝试使用原版 Arch Linux 内核进行标准设置。只有当您需要延迟更低、稳定性更高的设置时,才开始考虑优化!

您可能需要考虑以下常见的系统优化

# echo 2048 > /sys/class/rtc/rtc0/max_user_freq
# echo 2048 > /proc/sys/dev/hpet/max-user-freq
  • swappiness(也称为交换频率,默认为 60)降低到例如 10 将使系统在尝试交换到磁盘之前等待更长时间(请参阅 wikipedia:Paging#Swappiness)。这可以通过 sysctl vm.swappiness=10(请参阅 sysctl(8))动态完成,也可以使用配置文件(请参阅 sysctl.d(5))永久设置,例如
/etc/sysctl.d/90-swappiness.conf
vm.swappiness = 10
  • 将文件上的最大监视数(默认为 524288)增加到例如 600000,inotify 为您的用户跟踪这些监视数,这可以帮助需要许多文件句柄的应用程序(例如 DAW)。这同样可以通过 sysctl fs.inotify.max_user_watches=600000 动态完成,或者在专用配置文件中完成
/etc/sysctl.d/90-max_user_watches.conf
fs.inotify.max_user_watches = 600000

您可能还希望最大化 PCI 声卡的 PCI 延迟计时器,并提高所有其他 PCI 外围设备的延迟计时器(默认为 64)。

$ setpci -v -d *:* latency_timer=b0
# setpci -v -s $SOUND_CARD_PCI_ID latency_timer=ff

例如:SOUND_CARD_PCI_ID=03:00.0

SOUND_CARD_PCI_ID 可以这样获得

$ lspci | grep -i audio
03:00.0 Multimedia audio controller: Creative Labs SB Audigy (rev 03)
03:01.0 Multimedia audio controller: VIA Technologies Inc. VT1720/24 [Envy24PT/HT] PCI Multi-Channel Audio Controller (rev 01)

选择声音服务器

声音硬件无法同时播放来自多个应用程序的声音。虽然理论上可以将 ALSA 配置为在软件中混合应用程序,但这通常留给声音服务器来完成。由于 ALSA 单独无法轻松实现低延迟,也无法同步多个音频应用程序以按时播放、同时启动、以相同的速度等,并且因为它不能通过简单地将所有客户端连接在一起来共享应用程序之间的音频流,因此您不仅需要任何声音服务器,还需要专业音频级的服务器。

其中有三个,其中两个是为专业音频设计的

  • PulseAudio 是用于播放和多媒体的标准服务器之一,例如视频、浏览器、音乐和游戏。它并非为专业音频而设计,并且缺乏实现低延迟和同步应用程序的能力。
  • JACK 的开发考虑了专业音频的所有需求,并且已经在世界各地使用了多年,因此非常稳定和成熟。专业音频应用程序是为 JACK API 编写的。
  • PipeWire 是 JACK 和 PulseAudio 的音频部分的同时替代品。它应该被认为是日常使用而不是“如此专业音频”用例的良好候选者。它还处理视频路由,本文未对此进行描述。

声音服务器的设置很大程度上取决于用例以及某些应用程序交互的工作流程和功能。JACK 音频连接套件旨在通过提供客户端的同步执行同时保持恒定的低延迟,从而在应用程序之间共享音频并同时访问音频设备。它的 PipeWire 替代品为大多数用例提供了足够的服务。

此布局说明了要讨论的声音服务器设置的层模型

 #PipeWire-only   #PipeWire-as-JACK-Client   #JACK-only

 ┌──────────────┐    ┌──────────────┐    ┌──────────────┐
 │ Applications │    │ Applications │    │ Applications │
 ├──────────────┤    ├──────────────┤    ├──────────────┤
 │   PipeWire   │    │ PipeWire+JACK│    │     JACK     │
 ├──────────────┤    ├──────────────┤    ├──────────────┤
 │     ALSA     │    │     ALSA     │    │     ALSA     │
 └──────────────┘    └──────────────┘    └──────────────┘

仅 PipeWire

较新的 PipeWire 框架为了简单起见,取代了 JACK 以及其他声音服务器。因此,建议首先选择仅 PipeWire 设置,通过安装 pipewire-jack 并使用原版 Arch Linux 内核来实现对 JACK 客户端的支持。

对于专业音频用途,您还必须选择专业音频配置文件,安装并使用 pavucontrol,PulseAudio 的混音器。点击链接并阅读 PipeWire 的页面。

PipeWire 作为 JACK 客户端

PipeWire 也可以通过安装 pipewire-jack-client 用作 JACK 客户端。这在 PipeWire 的页面中进行了解释。

仅 JACK

多功能性的原则允许您使用 JACK 和#实时内核以及进一步的#系统配置来实现低延迟,以用于称为仅 JACK 设置的高级用例。使用 JACK 作为唯一的声音服务器要求任何旨在进行交互和音频设备访问的软件都作为 JACK 客户端运行。

不幸的是,流行的桌面应用程序(如 Firefox 或大多数游戏)要么放弃了 JACK 支持,要么从未实现它。因此,此设置应适用于专用的专业音频系统,在其中可以忽略非 JACK 软件。如果您仍然需要使用无法连接到 JACK 的软件,请在按照此处描述的设置进行操作后,参考 Professional audio/Examples#高级声音服务器设置。在安装和运行 JACK 之前,您应确保它可以访问您的音频设备。

PulseAudio 或其他程序是否占用了我的设备?

$ lsof +c 0 /dev/snd/pcm* /dev/dsp*

$ fuser -fv /dev/snd/pcm* /dev/dsp*

如果您的音频设备未列出,则可能是 PulseAudio 正在使用它(PulseAudio 可能是作为另一个应用程序的依赖项安装的)。如果您不打算使用 Professional audio/Examples#PulseAudio+JACK,请将这些程序与 PulseAudio 一起删除,以便 PulseAudio 释放您的音频设备。

由于 JACK 版本 1 计划“逐步淘汰” [2],不支持对称多处理 (SMP),缺少 D-BusSystemd 集成,因此您需要使用版本 2,该版本在官方存储库中以 jack2 软件包的形式提供。如果您要使用 JACK 控制 GUISystemd 用户服务启动音频图,还要安装 jack2-dbus

更多详细信息请参见 JACK 音频连接套件#JACK 实现的比较

关于 JACK 的文章描述了基于 GUI 的示例设置和基于 shell 的示例设置,作为您自己场景的参考点。JACK 的参数值在#JACK 参数部分进行了详细讨论,并且可能取决于上面#系统配置部分涵盖的其他系统因素。

JACK 参数

注意:以下指南应支持找到最佳参数值,以便在使用#仅 JACK/Examples#PulseAudio+JACK 声音服务器设置类型时运行 JACK 而不会出现音频掉线 (xruns)。由于硬件、是否使用#实时内核以及是否应用进一步的#系统配置等方面的差异,因此没有通用的预设。

这里的目的是找到缓冲区大小和周期的最佳组合,考虑到您拥有的硬件。帧/周期 = 256 是一个合理的起点。对于板载和 USB 设备,在降低这两个值之前,请尝试周期/缓冲区 = 3。常用值包括:256/3、256/2、128/3、128/2。

此外,采样率必须与硬件采样率匹配。要检查您的设备支持哪些采样率和比特率

$ cat /proc/asound/card0/codec#0

根据您拥有的设备替换 card0codec#0。您将在 Extended ID 中查找 ratesVRA。当今许多设备的常用采样率为 48000 Hz。其他常用速率包括 44100 Hz、96000 Hz 和 192000 Hz。

几乎总是,当涉及到使用外部设备进行录音或音序时,实时是必须的。此外,您可能需要设置最大优先级(至少比 /etc/security/limits.d/99-realtime-privileges.conf 中定义的系统限制低 10;最高优先级是为设备本身设置的)。

使用您刚刚找到的选项启动 jack

$ /usr/bin/jackd -R -P89 -dalsa -dhw:0 -r48000 -p128 -n2

qjackctlcadenceAURpatchageAURstudio-controls-gitAUR 都可以用作 GUI 来监视 JACK 的状态并简化其配置。

注意:设置 JACK 后,尝试不同的音频应用程序来测试您的配置结果。例如,如果问题出在后者,请不要花费数天时间尝试排除 LMMS 的 JACK xrun 问题。
进一步阅读:Linux Magazine 文章(2006 年)关于 JACK 参数查找的基本理解

延迟验证

JACK 参数对于控制往返延迟 (RTD) 最为重要。在本文的上下文中,这是音频信号被录制、处理和播放回放所花费的总时间。下一小节处理关于延迟来源的理论背景,这些延迟来源加起来构成了 RTD。如果您已经熟悉这一点,您可以转到#测量延迟以验证您的 RTD 或完全跳过本节。

延迟来源

考虑歌手表演的典型录音情况。声音通过麦克风捕获,因为它以声速在空气中传播。模数转换使计算机能够记录电信号以进行数字信号处理。最后,数模转换返回信号以在歌手的耳机中播放,用于类似于舞台监听系统的使用。

在该录音情况下,有五个重要的延迟来源构成 RTD,并按以下顺序发生

  1. 声音从歌手口中通过空气传播
  2. 模数转换
  3. 数字信号处理
  4. 数模转换
  5. 声音通过空气传播到歌手的耳朵

第一个和最后一个延迟来源很难改变,因为从技术上讲,在录音或播放期间创建预期声音需要一定的距离。此外,当使用更近的麦克风进行捕捉和使用耳机进行监听时,声音传播延迟通常在几微秒范围内,人类无法察觉。因此,RTD 最小化的目标是减少其他延迟来源。

转换延迟

理论上,JACK 通过对要转换为模数和数模的音频使用固定值(帧、周期、采样率)进行采样缓冲来维持恒定的低延迟。捕获过程中发生的延迟由以下公式描述

Lc = n / f

Lc:捕获延迟,以毫秒 (ms) 为单位;n:帧或缓冲区(2 的倍数,从 16 开始);f:采样率,以赫兹 (Hz) 为单位。

播放延迟也使用周期值

Lp = n * p / f

Lp:播放延迟,以毫秒 (ms) 为单位;n:帧或缓冲区(2 的倍数,从 16 开始);p:周期;f:采样率,以赫兹 (Hz) 为单位。

正如之前已经说过的那样,音频接口的功能定义了工作组合。您必须经过反复试验才能找到一个设置。当然,这是 xrun 预防和实现低延迟之间的权衡,但最近的音频接口可以在高采样率(高达 192 kHz)下使用,以满足该要求。数字域中 JACK 客户端的音频通量约为零,因此对于延迟测量可以忽略不计 [3]

有关更多信息,请参阅 ALSA wiki 中的 FramesPeriods

测量延迟

设置#JACK 参数后,您可能需要验证上面描述的 RTD。例如,使用帧或缓冲区大小 n = 128,周期值 p = 2,采样率 f = 48000 会导致捕获延迟约为 Lc = 2,666... 毫秒,播放延迟约为 Lp = 5,333... 毫秒,总往返延迟为 RTD = 8 毫秒

注意:根据空气中声速的方程,此延迟值与舞台上使用扬声器的典型监听情况相当,扬声器到表演者耳朵的距离在 2 米到 3 米之间。习惯于舞台监听的表演者通常习惯于这种延迟。

Fons Adriaensen 的 jack_delay 实用程序通过从播放通道发出测试音调并在捕获通道再次捕获它们来测量 RTD,以测量相位差,从而估计信号通过整个链条所花费的往返时间。使用适当的电缆连接音频设备的输入和输出通道,或按照 JACK 延迟测试的描述,将扬声器靠近麦克风。

例如,对于仅 JACK 设置运行 jack_delay,使用端口 playback_1capture_1 之间的电缆连接(描述可能因您的硬件而异)来闭合环路,以及之前讨论的值会产生以下见解

$ jack_delay -O system:playback_1 -I system:capture_1
capture latency  = 128
playback_latency = 256
Signal below threshold...
Signal below threshold...
Signal below threshold...
  422.507 frames      8.802 ms total roundtrip latency
       extra loopback latency: 38 frames
       use 19 for the backend arguments -I and -O
  422.507 frames      8.802 ms total roundtrip latency
       extra loopback latency: 38 frames
       use 19 for the backend arguments -I and -O
  422.506 frames      8.802 ms total roundtrip latency
       extra loopback latency: 38 frames
       use 19 for the backend arguments -I and -O
  422.507 frames      8.802 ms total roundtrip latency
       extra loopback latency: 38 frames
       use 19 for the backend arguments -I and -O
<output omitted>

正如输出所示,可以通过使用参数 -I 19-O 19 来完成 JACK 的进一步优化,以补偿链中报告的额外环回延迟。

$ /usr/bin/jackd -R -P89 -dalsa -dhw:0 -r48000 -p128 -n2 -I19 -O19
更多详细信息可以在 Ardour 手册中关于延迟和延迟补偿的页面中找到。

实时内核

操作系统上下文中的“实时定义为计算结果在固定的时间段内可用。仅在更广泛的意义上,它才意味着“时间与现实同时运行”,例如,立即响应音乐用户输入而产生声音。后者称为“低延迟”,其设置是本文的主要目标之一。

不久前,库存 Linux 内核(带有 CONFIG_PREEMPT=y,Arch Linux 原版内核中的默认设置)已被证明足以满足低延迟操作。在操作系统上下文中,延迟是指硬件中发生中断的时刻与相应的中断线程开始运行的时刻之间的时间。不幸的是,某些设备驱动程序可能会引入更高的延迟。因此,根据您的硬件、驱动程序和要求,您可能需要具有硬实时功能的内核。

优点和缺点

Ingo Molnar 和 Thomas Gleixner 的 RT_PREEMPT 补丁是硬实时和固实时应用的有趣选择,范围从专业音频到工业控制。大多数特定于音频的 Linux 发行版都应用了此补丁。实时可抢占内核还将使调整 IRQ 处理线程的优先级成为可能,并有助于确保音频平滑,几乎不受负载的影响。

注意:目前,将实时内核与其他特定应用程序一起使用存在已知限制,这些限制通常与虚拟化(例如 XenKVM)相关。如果您也需要这些功能,请考虑除了原版 Arch Linux 内核之外还安装实时内核,并创建一个辅助引导加载程序条目,以便按需启动相应的内核。

安装

安装 linux-rtlinux-rt-lts 软件包。

编译

如果您要使用实时内核补丁集 编译自己的内核,请记住删除模块/选项并不等同于“更精简、更高效”的内核。诚然,内核映像的大小减小了,但在今天的系统中,它不像 1995 年那样是一个大问题。

有关更多一般说明,请参阅 HOWTO setup Linux with PREEMPT_RT properly

无论如何,您还应确保

  • 定时器频率设置为 1000Hz (CONFIG_HZ_1000=y; 如果您不做 MIDI,可以忽略此项)
  • APM禁用 (CONFIG_APM=n; 某些硬件有问题 - x86_64 中的默认设置)

如果您真的想要一个精简的系统,我们建议您走自己的路,并部署一个带有静态 /devs 的系统。但是,您应该设置您的 CPU 架构。为合适的硬件选择“Core 2 Duo”将允许进行大量的优化,但不如您降低规模那么多。

(实时)内核的一般问题

  • 超线程(如果您怀疑,请在 UEFI 设置中禁用)

技巧和窍门

  • 禁用 Wi-Fi 并关闭录音时不需要打开的任何程序,例如浏览器。许多人报告说禁用 Wi-Fi 可以提高 JACK 性能的可靠性。
  • 据知,某些 USB 音频硬件在插入 USB 3 端口时无法正常工作,因此请尝试使用 USB 2/1 端口。
  • IRQ 问题可能会发生并导致问题。一个例子是视频硬件保留总线,导致系统 I/O 路径中不必要的中断。请参阅 FFADO IRQ Priorities How-To 中的讨论。如果您有实时内核或最近的内核,则可以使用 rtirq 来调整 IRQ 处理线程的优先级。
  • 不要使用 irqbalance 守护程序,或者谨慎使用 [4]
  • 如果您需要将多个音频设备与 JACK2 一起使用,则可以使用 alsa_inalsa_out 实用程序来包装额外的设备并在 JACK 补丁面板中显示为输出。
  • 某些守护程序/进程可能会意外导致 xruns。如果您不需要它 - 杀死它。无需多问。
$ ls /var/run/daemons
$ top # or htop, ps aux, whatever you are comfortable with
$ killall -9 $processname
# systemctl stop $daemonname
  • 如果您遇到大量 xruns,尤其是在使用 nvidia 时,请禁用您的 GPU 节流。这可以通过卡的控制小程序完成,对于 NVIDIA,它是“首选最大性能”(感谢 Frank Kober[5] 在 LAU 中的帖子)。

应用程序

Arch Linux 提供了软件包组 pro-audio,其中包含所有相关的(半)专业应用程序。pro-audio 软件包组中的所有应用程序都是 JACK 客户端。此外,lv2-pluginsladspa-pluginsdssi-pluginsvst-pluginsclap-plugins 都是 pro-audio 组的子组。

提示:有关列出成员的信息,请参阅 Pacman/技巧和窍门#列出软件包,有关安装软件包组的信息,请参阅 Pacman#安装软件包组

关于一些应用的概述和简要信息,请参见应用列表/多媒体#音频。特别是数字音频工作站音频效果器音乐音轨器类别,以及音频合成环境声音发生器,提供了专业音频软件的示例,例如用于录音、混音、母带处理和声音设计。其他类别包括乐谱编辑软件音频编辑器音频转换器DJ软件。

在官方仓库中尚未提供的软件包可以在proaudio中找到。浏览软件包列表以找到您需要的应用程序,或通过GitHub请求打包您所需的应用程序。

硬件

大多数声卡和音频设备无需额外配置或软件包即可工作,只需将 JACK 设置为使用所需的设备即可。

并非所有设备都如此,请查看Category:Sound/Hardware以及Envy24control#Supported cards,了解这些特殊情况。

获取帮助

邮件列表

  • Arch Linux 专业音频 讨论关于实时多媒体,包括(半)专业音频和视频。
  • Linux 音频用户 Linux 专业音频相关的邮件列表,流量大,用户和开发者订阅社区庞大。

IRC

  • #archlinux-proaudio - Arch Linux 专业音频频道
  • #lau - 通用 Linux 音频用户频道
  • #jack - 与 JACK 音频系统相关的开发和支持
  • #lv2 - 与 LV2 插件格式相关的开发和支持
  • #ardour - 关于 Ardour DAW 的讨论和支持
  • #opensourcemusicians - 大型通用 OSS 音乐家讨论频道

参见