专业音频
本文介绍如何配置您的系统以进行音频录制、混音和回放,以及如何使用它来合成和生成声音。这些活动统称为专业音频(pro audio),通常需要低延迟性能。
与视频制作或游戏相比,大多数应用程序不需要那么多的高端硬件。几乎所有 2012 年末之后生产的计算机都可以针对专业音频进行优化。请参阅 Ardour 手册中关于数字音频的正确计算机系统页面以获取更多信息。
入门
阅读声音系统文章后,您可能已经意识到高级 Linux 声音架构或 ALSA 是 Linux 内核的一部分,并在 Arch Linux 上用作默认声音系统的驱动程序和接口。ALSA 应该在默认 Arch 安装中开箱即用。如果不是这种情况,您必须先解决问题才能继续进行。
但是,“没有声音”很可能是 ALSA 混音器配置中简单的取消静音通道问题。如果您正在使用多个音频设备(例如 USB 音频接口,并请记住集成声卡),您可能需要设置默认声卡。
我是否正确设置了声音?
$ speaker-test
- 请参阅 ALSA 进行故障排除。
在大多数用例中,原版 Arch Linux 内核足以满足低延迟操作。只有当您遇到音频掉线(也称为卡顿)或者您需要(或想要)达到超低延迟操作时,才需要进一步应用 #系统配置。
为了完成优化,这些超低延迟操作可能需要您设置 #实时内核。
虽然一些专业音频软件可以直接与 ALSA 配合使用,但稍后提到的 #应用程序 大多数是 JACK 音频连接套件或 JACK 客户端。因此,您需要安装和设置即将概述的可用声音服务器之一。
系统配置
您可能需要考虑以下常见的系统优化
- 将 CPU 频率调节器设置为 performance。
- 配置 pam_limits(例如,通过安装 realtime-privileges 并将您的用户添加到 realtime 组)。
- 使用 threadirqs 内核参数(请参阅 [1] 以供参考)- 默认情况下由实时内核补丁集强制执行。
- 使用实时内核补丁集。
- 将 noatime 添加到 fstab(请参阅 提高性能#挂载选项)。
- 通过在启动时运行以下命令来增加最高请求的 RTC 中断频率(默认为 64 Hz)
# echo 2048 > /sys/class/rtc/rtc0/max_user_freq # echo 2048 > /proc/sys/dev/hpet/max-user-freq
- 将交换性(也称为交换频率,默认为 60)降低到例如 10 将使系统等待更长时间才尝试交换到磁盘(请参阅 wikipedia:Paging#Swappiness)。这可以通过
sysctl vm.swappiness=10
(请参阅 sysctl(8)) 动态完成,也可以使用配置文件 (请参阅 sysctl.d(5)) 永久设置,例如
/etc/sysctl.d/90-swappiness.conf
vm.swappiness = 10
- 将 inotify 为您的用户跟踪的文件最大监视数(默认为 524288)增加到例如 600000,可以帮助需要许多文件句柄的应用程序(例如 DAWs)。这也可以通过
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 也可以用作 JACK 客户端,通过安装 pipewire-jack-client。这在 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 可能是作为另一个应用程序的依赖项安装的)。如果您不打算使用 专业音频/示例#PulseAudio+JACK,请删除这些以及 PulseAudio,以便让 PulseAudio 释放您的音频设备。
由于 JACK 版本 1 计划“逐步淘汰” [2],不支持对称多处理 (SMP),缺乏 D-Bus 和 Systemd 集成,您应该使用版本 2,该版本在官方存储库中作为 jack2 软件包提供。如果您要使用 JACK 控制 GUI 或 Systemd 用户服务来启动音频图,也请安装 jack2-dbus。
- 更多详情请参阅 JACK 音频连接工具包#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 最小化的目标是减少其他延迟来源。
转换延迟
理论上,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... ms 的捕获延迟和大约 Lp = 5,333... ms 的播放延迟,总往返延迟为 RTD = 8 ms。
jack_delay 实用程序由 Fons Adriaensen 开发,它通过发出测试音调到播放通道并在捕获通道再次捕获它们来测量 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>
正如输出所示,可以通过使用参数 -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 vanilla 内核中的 默认值)已被证明足以满足低延迟操作。在操作系统上下文中,延迟是硬件中发生中断的时刻与相应的中断线程开始运行的时刻之间的时间。不幸的是,某些设备驱动程序可能会引入更高的延迟。因此,根据您的硬件、驱动程序和要求,您可能需要具有 硬实时 功能的内核。
优点和缺点
Ingo Molnar 和 Thomas Gleixner 的 RT_PREEMPT 补丁是硬实时和固实时应用程序的有趣选择,范围从专业音频到工业控制。大多数特定于音频的 Linux 发行版都应用了此补丁。实时可抢占内核还将可以调整 IRQ 处理线程的优先级,并有助于确保流畅的音频,几乎不受负载的影响。
安装
安装 linux-rt 或 linux-rt-lts 软件包。
编译
如果您要使用 实时内核补丁集 编译您自己的内核,请记住,删除模块/选项并不等同于“更精简、更高效”的内核。诚然,内核映像的大小减小了,但在今天的系统中,这不像 1995 年那样是一个大问题。
- 有关更详细的通用说明,请参阅 HOWTO 正确设置带有 PREEMPT_RT 的 Linux。
无论如何,您还应确保
- 定时器频率设置为 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 优先级操作指南 中的讨论。如果您有实时内核或最近的内核,您可以使用 rtirq 来调整 IRQ 处理线程的优先级。
- 不要使用 irqbalance 守护程序,或者小心使用 [4]。
- 如果您需要将多个音频设备与 JACK2 一起使用,则可以使用 alsa_in 和 alsa_out 实用程序来包装额外的设备,并在 JACK patchbay 中显示为输出。
- 某些守护程序/进程可能会意外导致 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])。
- 您可能想阅读更多关于 ALSA 的内容:https://www.volkerschatz.com/noise/alsa.html
应用
Arch Linux 提供了软件包组 pro-audio,其中包含所有相关的(半)专业应用程序。pro-audio 软件包组中的所有应用程序都是 JACK 客户端。此外,lv2-plugins、ladspa-plugins、dssi-plugins、vst-plugins 和 clap-plugins 是 pro-audio 组的子组。
关于一些应用的概述和简要信息,请参见应用列表/多媒体#音频。特别是数字音频工作站、音频效果和音乐音轨器类别,以及音频合成环境和声音发生器,提供了专业音频软件的示例,例如用于录音、混音、母带处理和声音设计。其他类别包括乐谱编辑软件、音频编辑器、音频转换器和DJ软件。
在官方仓库中尚未提供的软件包可以在proaudio中找到。浏览软件包列表以找到您需要的应用程序,或通过GitHub请求打包您所需的应用程序。
硬件
大多数声卡和音频设备无需额外配置或软件包即可工作,只需设置JACK以使用所需的设备即可。
并非所有设备都如此,请查看分类:声音、/硬件以及Envy24control#支持的声卡,了解这些特殊情况。
获取帮助
邮件列表
- Arch Linux 专业音频 关于实时多媒体的讨论,包括(半)专业音频和视频。
- Linux 音频用户 Linux 专业音频相关的邮件列表,流量很大,拥有庞大的用户和开发者订阅者社区。
IRC
- #archlinux-proaudio - Arch Linux 专业音频频道
- #lau - 面向用户的通用 Linux 音频频道
- #jack - 与 JACK 音频系统相关的开发和支持
- #lv2 - 与 LV2 插件格式相关的开发和支持
- #ardour - 关于 Ardour DAW 的讨论和支持
- #opensourcemusicians - 大型通用开源音乐人讨论频道
参见
- 专业音频 基于 Arch Linux 的专业音频设置综合指南
- AUR 元软件包: proaudio-metaAUR, soundfonts-aur-metaAUR, lv2-plugins-aur-metaAUR
- awesome-linuxaudio Linux 平台上用于专业音频/视频/现场活动制作的软件和资源列表
- 多媒体和游戏 / Arch Linux 论坛
- 实时 Linux 基金会关于 PREEMPT_RT 补丁的 Wiki