专业音频
本文介绍如何配置您的系统以进行多轨录音、混音和音频回放,以及用于合成和生成声音。这些活动统称为专业音频(pro audio),通常需要低延迟性能。
与视频制作或游戏相比,大多数应用程序不需要如此高端的硬件。有关更多信息,请参阅数字音频的正确计算机系统。
入门指南
高级 Linux 声卡架构 (ALSA) 是 Linux 内核的一部分,用于 驱动程序和低级接口。在 Arch Linux 上,它被用作默认的 声卡系统。ALSA 在默认的 Arch Linux 安装中应该可以开箱即用。如果不是这种情况,您必须先解决问题,然后再继续。
我的声卡设置正确吗?
$ speaker-test
- 请参阅ALSA进行故障排除。
对于大多数用例,普通的 Arch Linux 内核足以实现低延迟操作。#优化系统配置仅在您遇到音频中断(也称为故障)或您需要(或想要)达到超低延迟操作时才需要。
要完成优化,这些超低延迟操作可能需要您设置一个#实时内核。
虽然一些专业音频软件可以直接与 ALSA 一起工作,但后面提到的#应用程序大多是 JACK Audio Connection Kit 或 JACK 客户端。因此,您需要安装和设置一个可用的 音频服务器,这些服务器将在下面概述。
选择音频服务器
声卡无法同时播放来自多个应用程序的声音。虽然 ALSA 理论上可以配置为在软件中混合应用程序,但这通常留给 音频服务器。
由于 ALSA 本身难以实现低延迟,并且无法同步多个音频应用程序以准时播放(同时开始、相同速度等),并且由于它无法通过简单地连接所有客户端来共享应用程序之间的音频流,因此您需要的不仅仅是任何音频服务器,而是专业音频级别的服务器。
- PipeWire 在音频部分是 JACK 和 PulseAudio 的替代品。它还处理视频路由,本文未在此讨论。
- 注意 目前尚不清楚 PipeWire 是否应该被视为仅适用于日常使用的良好选择,而不适用于专业音频用例。
- JACK Audio Connection Kit (JACK) 是为满足专业音频的所有需求而开发的,并且在全球范围内使用多年,因此非常稳定和成熟。大多数专业音频应用程序都是为 JACK API 编写的。
音频服务器的设置在很大程度上取决于用例以及工作流程和某些应用程序交互的能力。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作为JACK客户端
PipeWire 也可以通过安装 pipewire-jack-client 来用作 JACK 客户端。这在 PipeWire#在原生 JACK之上运行 PipeWire 中进行了说明。
仅 JACK
通用性原则允许您使用 JACK 和 #实时内核 以及 #优化系统配置 来实现低延迟,以应对称为“仅 JACK”设置的高级用例。将 JACK 用作唯一的音频服务器需要任何旨在交互和访问音频设备的软件都作为 JACK 客户端运行。
不幸的是,像 Firefox 这样的流行桌面应用程序或大多数游戏要么放弃了 JACK 支持,要么从未实现过。因此,此设置应用于专用的专业音频系统,其中非 JACK 软件可以被忽略。如果您仍需要使用无法连接到 JACK 的软件,请在按照此处描述的设置后,参考 专业音频/示例#高级音频服务器设置。在安装和运行 JACK 之前,应确保它能够访问您的音频设备。
PulseAudio 或其他程序正在占用我的设备吗?
$ lsof +c 0 /dev/snd/pcm* /dev/dsp*
或者
$ fuser -fv /dev/snd/pcm* /dev/dsp*
如果您的音频设备未列出,它可能被 PulseAudio 使用(它可能是作为另一个应用程序的依赖项安装的)。如果您不打算使用 专业音频/示例#PulseAudio+JACK,请卸载这些以及 PulseAudio,以使 PulseAudio 释放您的音频设备。
由于 JACK 1 版本计划“缓慢淘汰”[1],不支持 对称多处理 (SMP),缺乏 D-Bus 和 systemd 集成,您应该使用版本 2,它可通过 jack2 包获得。如果您将使用 JACK 控制 GUI 或 systemd 用户服务来启动音频图,请同时安装 jack2-dbus。
- 更多详情请参阅 JACK Audio Connection Kit#JACK 实现比较。
JACK 文章描述了一个基于 GUI 的和基于 Shell 的示例设置,作为您自己场景的参考点。JACK 的参数值在 #JACK 参数部分进行了详细讨论,并且可能取决于下面 #优化系统配置部分涵盖的其他系统因素。
JACK 参数
这里的目标是找到给定硬件的最佳缓冲区大小和周期组合。每周期帧数 = 256 是一个合理的起点。对于板载和 USB 设备,在降低两个值之前,请尝试每缓冲区周期数 = 3。常用的值是:256/3、256/2、128/3、128/2。
此外,采样率必须与硬件采样率匹配。要检查您的设备支持的采样率和比特率
$ cat /proc/asound/card0/codec#0
根据您的具体情况替换 card0 和 codec#0。您将寻找 rates 或 VRA 在 Extended ID 中。当今许多设备的常见采样率是 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
qjackctl、cadenceAUR、patchageAUR 和 studio-controls-gitAUR 都可用作 GUI 来监控 JACK 的状态并简化其配置。
- 进一步阅读:Linux Magazine 文章 (2006),用于对 JACK 参数查找的基本理解。
延迟验证
JACK 参数对于控制往返延迟 (RTD) 最为重要。在本文的上下文中,RTD 是音频信号被录制、处理和回放所花费的总时间。下一小节将讨论构成 RTD 的延迟理论背景。如果您已经熟悉了这一点,您可以转到 #测量延迟 来验证您的 RTD,或者完全跳过此部分。
延迟源
考虑一个典型的歌手表演录制场景。歌声通过麦克风被捕捉,并以声速在空气中传播。 模数转换使电信号能够被计算机录制以进行数字信号处理。最后,数模转换将信号转换回声音,在歌手的耳机中播放以进行监听,类似于舞台监听系统的使用。
在这种声音录制场景中,有五个重要的延迟源构成 RTD,并按以下顺序出现:
- 声音从歌手口中传播到空气。
- 模数转换。
- 数字信号处理。
- 数模转换。
- 声音传播到空气,到达歌手的耳朵。
第一个和最后一个延迟源很难改变,因为在录制或回放时,技术上需要一定的距离来产生预期的声音。此外,当使用近距离拾音进行捕捉,并使用耳机进行监听时,这两个声音传播延迟通常在几微秒的范围内,人类无法察觉。因此,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 客户端在数字域中的音频流大约为零,因此对于延迟测量来说可以忽略不计 [2]。
- 有关更多信息,请参阅 ALSA wiki 中的 FramesPeriods。
测量延迟
一旦您设置了#JACK 参数,您可能想验证上面描述的 RTD。例如,使用帧或缓冲区大小 n = 128,周期值 p = 2,采样率 f = 48000,捕获延迟约为 Lc = 2.666... ms,播放延迟约为 Lp = 5.333... ms,总往返延迟为 RTD = 8 ms。
Fons Adriaensen 的 jack_delay 实用程序通过播放通道发出测试音,并从捕获通道再次捕获它们来测量 RTD,以测量相位差来估算信号通过整个链所花费的往返时间。使用合适的线缆连接音频设备的输入和输出通道,或将扬声器靠近麦克风,如 JACK 延迟测试所述。
例如,在仅 JACK 设置中使用线缆连接端口 playback_1 和 capture_1(描述可能因您的硬件而异)来闭合环路,并使用之前讨论的值运行 jack_delay,会产生以下见解:
$ 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>
输出指示 JACK 的进一步优化可以通过使用参数 -I 19 和 -O 19 来完成,以补偿链中报告的额外环回延迟。
$ /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 发行版都应用了此补丁。实时可抢占内核还将使您可以调整中断处理线程的优先级,并有助于确保音频平稳运行,几乎不受系统负载的影响。
安装
安装 linux-rt 或 linux-rt-lts 包。
编译
如果您要编译自己的内核作为实时内核,请记住删除模块/选项并不等于一个“更精简、更强大”的内核。内核映像的大小确实减小了,但在当今的系统上,这不像 1995 年那样是一个问题。
- 有关更通用的说明,请参阅HOWTO 正确设置 Linux 和 PREEMPT_RT。
无论如何,您还应该确保
- 定时器频率 设置为 1000Hz (
CONFIG_HZ_1000=y;如果您不进行MIDI,可以忽略此项) - APM 被 禁用 (
CONFIG_APM=n;在某些硬件上存在问题 - x86_64 上默认为禁用)
如果您确实想要一个精简的系统,我们建议您走自己的路并部署一个带有静态 /dev 的系统。但是,您应该设置您的 CPU 架构。为适当的硬件选择“Core 2 Duo”将允许进行大量优化,但不会像向下扩展那样。
(实时)内核的一般问题
- 超线程(如果您怀疑,请在UEFI设置中禁用)
优化系统配置
- 优化不是万能药——效果 hardly 取决于您的环境:虽然对于某些系统和设置需要更高级别的优化,但对于大多数用户来说,情况并非如此。首先尝试使用普通 Arch Linux 内核的标准设置;只有当您对当前结果不满意时(例如,如果您认为您的延迟或系统稳定性可以改进)才考虑优化。
- 发挥创意,尝试不同的设置。
- 测量是唯一值得信赖的来源——务必先测量,再进行更改。
您可能需要考虑以下系统优化:
- 将 CPU 频率缩放管理器设置为 performance。
- 配置 pam_limits(例如,通过安装 realtime-privileges 并将您的用户添加到
realtime组)。 - 使用
threadirqs内核参数(有关参考,请咨询[3])- 由 实时内核默认强制执行。 - 使用实时内核。
- 将
noatime添加到 fstab(请参阅提高性能#挂载选项)。 - 通过在启动时运行以下命令来提高最高请求的 RTC 中断频率(默认为 64 Hz):
# echo 2048 > /sys/class/rtc/rtc0/max_user_freq # echo 2048 > /proc/sys/dev/hpet/max-user-freq
- 降低swappiness——交换频率,默认设置为
60——例如设置为10将使系统在尝试将内存交换到磁盘之前等待更长时间。更具体地说,它会使内核倾向于将所有应用程序保留在 RAM 中,而不是将后台应用程序交换出去。这可以通过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 -nnd ::04xx
03:00.0 Multimedia audio controller [0401]: Creative Labs SB Audigy [1102:0004] (rev 05) 03:01.0 Multimedia audio controller [0401]: VIA Technologies Inc. VT1720/24 [Envy24PT/HT] PCI Multi-Channel Audio Controller [1412:1724] (rev 01)
技巧与提示
- 禁用 Wi-Fi 并关闭录音时不需要的程序,例如浏览器。许多人报告禁用 Wi-Fi 导致 JACK 性能更可靠。
- 一些 USB 音频硬件插入 USB 3 端口时可能无法正常工作,请尝试 USB 2/1 端口。
- 可能出现 IRQ 问题并导致问题。一个例子是视频硬件占用总线,导致系统 I/O 路径中的不必要中断。请参阅 FFADO IRQ 优先级操作指南中的讨论。如果您有实时内核或较新的内核,可以使用 rtirq 来调整中断处理线程的优先级。
- 不要使用 irqbalance 守护程序,或者要小心使用 [4]。
- 如果您需要使用多个音频设备与 JACK2,可以使用 alsa_in 和 alsa_out 实用程序来包装额外的设备,并使其在 JACK 补丁 bay 中显示为输出。
- 某些守护程序/进程可能会意外导致 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 在 LAU 的帖子[5])。
应用程序
Arch Linux 提供了 pro-audio 软件包组,其中包含所有相关的(半)专业应用程序。pro-audio 软件包组中的所有应用程序都是 JACK 客户端。此外,lv2-plugins、ladspa-plugins、dssi-plugins、vst-plugins 和 clap-plugins 也是 pro-audio 组的子组。
在 List of applications/Multimedia#Audio 中可以找到一些应用程序的概述和简要信息。特别是 数字音频工作站、音频效果和音乐追踪器类别,以及音频合成环境和声音生成器提供了用于录音、混音、母带处理和声音设计的专业音频软件示例。其他类别包括 乐谱编辑器、音频编辑器、音频转换器和 DJ 软件。
官方仓库中尚未(或暂时)包含的软件包可以在 proaudio 中找到。浏览 软件包列表 以查找您需要的应用程序,或通过 GitHub 请求打包您所需的应用程序。
硬件
大多数声卡和音频设备无需额外配置或安装软件包即可工作,只需将 JACK 设置为使用所需的设备即可。
并非所有设备都能如此,对于这些特殊情况,请查看 Category:Sound,/Hardware 以及 Envy24control#Supported cards。
获取帮助
邮件列表
- Arch Linux Pro-audio 讨论实时多媒体,包括(半)专业音频和视频。
- Linux Audio User 与 Linux 专业音频相关的邮件列表,流量很大,用户和开发者订阅社区庞大。
IRC
- #archlinux-proaudio - Arch Linux 专业音频频道
- #lau - 通用 Linux 音频用户频道
- #jack - 与 JACK 音频系统相关的开发和支持
- #lv2 - 与 LV2 插件格式相关的开发和支持
- #ardour - 与 Ardour DAW 相关的讨论和支持
- #opensourcemusicians - 大型通用 OSS 音乐人讨论频道
参见
- 专业音频 基于 Arch Linux 的专业音频设置的综合指南
- lv2-plugins-aur-metaAUR — 提供许多 LV2 插件
- awesome-linuxaudio Linux 平台专业音频/视频/现场活动制作的软件和资源列表
- 多媒体和游戏 / Arch Linux 论坛
- 实时 Linux Foundation 关于 PREEMPT_RT 补丁的 wiki