专业音频
本文描述了如何配置您的系统以进行录音、混音和回放音频,以及如何使用它来合成和生成声音。这些活动都归属于术语专业音频 (pro audio) 之下,通常需要低延迟性能。
与视频制作或游戏相比,大多数应用程序不需要那么高端的硬件。几乎任何 2012 年末之后生产的计算机都可以针对专业音频进行优化。请参阅 Ardour 手册中关于适合数字音频的计算机系统页面以获取更多信息。
入门指南
在阅读声音系统文章后,您可能已经意识到高级 Linux 声音架构或 ALSA 是 Linux 内核的一部分,并用作 Arch Linux 上驱动程序和接口的默认声音系统。ALSA 应该可以在默认的 Arch 安装中开箱即用。如果不是这种情况,您必须在继续之前解决问题。
但是,“没有声音”很可能只是 ALSA 混音器配置中的一个简单的取消通道静音问题。如果您使用多个音频设备(例如 USB 音频接口并记住集成的声卡),您可能需要设置默认声卡。
我是否正确设置了声音?
$ speaker-test
- 请参阅 ALSA 以进行故障排除。
对于大多数用例,香草 Arch Linux 内核足以实现低延迟操作。只有当您遇到音频掉线(也称为毛刺)或者您需要(或想要)达到超低延迟操作时,才需要应用进一步的#系统配置。
为了完成优化,这些超低延迟操作可能需要您设置#实时内核。
虽然一些专业音频软件可以直接与 ALSA 一起工作,但稍后提到的#应用程序大多数是 JACK 音频连接套件或 JACK 客户端。因此,您将需要安装和设置即将概述的可用声音服务器之一。
系统配置
您可能需要考虑以下常见的系统优化
- 将CPU 频率调节 governor 设置为性能。
- 配置 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
- 增加文件上的最大监视次数(默认为
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 也可以用作 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+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。您将在 Extended ID 中查找 rates 或 VRA。当今许多设备通用的采样率是 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 香草内核中)已被证明足以满足低延迟操作。操作系统上下文中的延迟是硬件中发生中断的时刻与相应的中断线程开始运行的时刻之间的时间。不幸的是,某些设备驱动程序可能会引入更高的延迟。因此,根据您的硬件、驱动程序和要求,您可能需要具有硬实时功能的内核。
优点和缺点
Ingo Molnar 和 Thomas Gleixner 的 RT_PREEMPT 补丁是硬实时和固实时应用程序的有趣选择,从专业音频到工业控制。大多数特定于音频的 Linux 发行版都应用了此补丁。实时抢占内核还将使调整 IRQ 处理线程的优先级成为可能,并有助于确保音频的流畅性,几乎不受负载的影响。
安装
安装 linux-rt 或 linux-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 路径中产生不必要的 interrupts。请参阅 FFADO IRQ 优先级 How-To 中的讨论。如果您有实时内核或最近的内核,您可以使用 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 来说,它是 “prefer maximum performance”(感谢 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 设置为使用所需的设备即可。
并非所有设备都是如此,请查看 Category:Sound、/Hardware 以及 Envy24control#支持的声卡,了解那些特殊情况。
获取帮助
邮件列表
- Arch Linux Pro-audio 关于实时多媒体的讨论,包括(半)专业音频和视频。
- Linux Audio User Linux 专业音频相关的邮件列表,流量很大,用户和开发人员订阅社区庞大。
IRC
- #archlinux-proaudio - Arch Linux 专业音频频道
- #lau - 面向用户的通用 Linux 音频频道
- #jack - 与 JACK 音频系统相关的开发和支持
- #lv2 - 与 LV2 插件格式相关的开发和支持
- #ardour - 与 Ardour DAW 相关的讨论和支持
- #opensourcemusicians - 大型通用 OSS 音乐家讨论频道
另请参阅
- Professional audio 基于 Arch Linux 的专业音频设置综合指南
- AUR 元软件包: proaudio-metaAUR, soundfonts-aur-metaAUR, lv2-plugins-aur-metaAUR
- awesome-linuxaudio Linux 平台上用于专业音频/视频/现场活动制作的软件和资源列表
- 多媒体和游戏 / Arch Linux 论坛
- Realtime Linux 基金会关于 PREEMPT_RT 补丁的 wiki