逐位精确音频 Android Android 音频重采样 USB DAC Android

Android 上的逐位精确音频:神话与现实

逐位精确播放在 Android 上的真正含义,为什么它比你想象的更难,以及如何验证你的音频链是否在暗中重采样你的音乐。

· 10 分钟阅读

什么是逐位精确?

逐位精确播放意味着到达你 DAC 的音频数据与源文件中存储的完全相同。不是相似。不是”足够接近”。完全相同,逐位不差。

要使信号真正做到逐位精确,解码器输出和 DAC 输入之间的音频链中没有任何环节可以改变数据。这意味着:

  • 没有重采样。44.1 kHz 的文件以 44.1 kHz 播放,而不是 48 kHz。
  • 没有音量调节。数字音量缩放会修改采样值。
  • 没有 DSP 处理。均衡器、交叉馈送、ReplayGain、限制——所有这些都会改变信号。
  • 没有抖动。添加噪声来掩盖量化失真仍然会改变数据。

如果链路中的任何一个环节修改了哪怕一个采样,输出就不再是逐位精确的。这是一个二元属性——不存在所谓的”几乎逐位精确”。

为什么这很重要?每一次变换都会引入某种程度的误差。重采样会添加插值失真。音量缩放会降低有效位深度。即使高品质的处理仍然是处理。对于投资了高分辨率源文件和有能力的 DAC 的听众来说,保留原始信号就是全部意义所在。

为什么 Android 让逐位精确变得困难

Android 上的每个音频应用都要经过一个叫做 AudioFlinger 的系统组件。它是音频混音器和路由器——一个中央枢纽,从手机上的每个应用获取音频并将其合并为发送到硬件的单一输出流。

问题在于 AudioFlinger 对你的音频应该是什么采样率有自己的”意见”。大多数 Android 设备将 AudioFlinger 配置为 48 kHz。当你的音乐是不同的速率——CD 品质的 44.1 kHz,高解析度的 96 kHz——AudioFlinger 会将其重采样以匹配设备的配置速率。

这种重采样是悄悄发生的。你的音乐播放器可能显示”正在播放:44.1 kHz FLAC”,但到达 DAC 的实际信号已被操作系统转换为 48 kHz。大多数播放器甚至不知道这正在发生,更不用说告诉你了。

Android 上的音频路径如下:

应用 -> AAudio API -> AudioFlinger -> 音频驱动程序 -> 硬件

AudioFlinger 位于每条音频路径的中间。与桌面操作系统不同(例如 Windows 上的 WASAPI 独占模式允许应用有时获得音频硬件的独占访问),Android 不提供完全绕过 AudioFlinger 的方法。它始终在链路中。

这甚至在细微层面上也很重要。将 44.1 kHz 转换为 48 kHz 不是一个干净的整数比——它需要引入失真的插值。这些失真在手机扬声器上可能听不出来,但在高解析度的耳机配置或优质 DAC 上,它们代表了对你可能花了高价购买的音频的不必要降级。

USB DAC 解决方案

外部 USB DAC 显著改变了局面。当你将 USB DAC 连接到 Android 设备时,音频驱动程序可能支持 DAC 的原生采样率,而不是被锁定在手机内部的 48 kHz 配置。

关键是采样率协商——查询 DAC 实际支持哪些速率并请求正确速率的过程:

  1. 应用打开一个临时音频流而不指定速率,让 Android 报告 USB 设备原生支持什么。
  2. 应用然后以当前曲目的最佳速率请求一个流。
  3. 流打开后,应用读回实际授予的速率——因为 Android 可能授予了与请求不同的速率。
  4. 如果授予的速率与源文件不匹配,应用必须决定是重采样还是报告错误。

许多 USB DAC 支持从 44.1 kHz 一直到 384 kHz 的速率。当 Android 的驱动程序正确支持连接的 DAC 时,应用可以请求曲目的原生速率并在没有任何重采样的情况下获得授予——不是由应用,也不是由操作系统。

但”正确支持”在那句话中承担了很大的工作量。Android 的 USB 音频类驱动程序处理实际的 USB 通信,其行为在不同设备和 Android 版本之间各不相同。在一部手机上完美工作的 DAC 在另一部上可能有驱动程序问题。这就是 Android 上 USB 音频的现实,没有任何应用可以完全抽象化。

如何验证逐位精确播放

大多数音乐播放器不会告诉你音频实际上发生了什么。你看到一个”正在播放”的指示器,也许还有文件格式,但实际的信号路径——是否发生了重采样、硬件运行在什么速率、操作系统是否插入了任何处理——仍然不可见。

我们构建 Echobox 的信号路径诊断正是为了解决这个问题。诊断屏幕实时向你展示整个音频链:

  • 源格式——你文件的编解码器、采样率和位深度
  • 解码阶段——解码器产生了什么
  • DSP 链——哪些处理阶段是活动的,哪些被绕过
  • 输出格式——正在发送到音频 API 的实际采样率和格式
  • 设备速率——硬件运行在什么速率
  • 重采样指示器——如果链路中任何地方正在进行重采样的明确警告

如果你的 96 kHz FLAC 因为手机的 DAC 不支持 96 kHz 而被重采样到 48 kHz,你会看到。如果逐位精确模式活动且所有阶段都被绕过,你也会看到。没有猜测,没有希望,不用信任那些”高清音频”标识意味着什么。

这种透明度是罕见的。大多数播放器将音频管道视为黑盒,不给你任何工具来验证内部发生了什么。对于任何认真对待音频品质的人来说,验证与能力同样重要。

Echobox 如何实现逐位精确输出

我们在三个层次设计了 Echobox 的架构,每个层次的选择都有特定原因:

  • Flutter 处理 UI——你交互的界面。
  • Rust 处理解码、文件 I/O、状态管理和编排。
  • Zig 处理实时音频回调——当操作系统每约 10 毫秒请求下一块音频采样时运行的代码。

这种分离对逐位精确播放很重要。Zig 音频引擎从无锁环形缓冲区(由 Rust 填充)读取预解码的采样,通常应用七阶段 DSP 链:ReplayGain、前置放大、参数均衡器、交叉馈送、音量、图形均衡器和限制器。

启用逐位精确模式时,整个 Zig DSP 链被绕过。回调直接将采样从环形缓冲区复制到输出缓冲区,不进行任何处理。在 Rust 端,应用:

  1. 从音频 API 请求曲目的精确原生采样率——不是设备的默认速率,而是与源文件匹配的速率。
  2. 通过读回实际流配置来验证授予的速率。
  3. 拒绝悄悄重采样。如果 DAC 无法提供请求的速率,播放会以清晰的错误失败,而不是悄悄降级信号。

直接采样率协商、DSP 绕过和透明错误处理的组合为你提供了 Android 允许的最接近真正逐位精确输出的方案。我们控制的部分——应用级处理——是真正逐位精确的。AudioFlinger 和 USB 驱动程序内部发生的事情取决于 Android,但对于匹配速率的受良好支持的 USB DAC,AudioFlinger 通常会在不修改的情况下传递采样。

什么时候你可能不想要逐位精确

逐位精确模式是一个工具,不是一个普遍目标。有很好的理由不启用它:

你使用均衡器。如果你有一个参数均衡器配置文件来校正耳机的频率响应,逐位精确模式会完全绕过它。均衡器只在 DSP 链活动时才有效。对于许多听众来说,好耳机上调好的均衡器比通过未校正耳机的逐位精确信号产生更好的聆听体验。

你使用 ReplayGain。跨音乐库的音量标准化需要对每首曲目应用增益调整。这是 DSP 处理,在逐位精确模式下被禁用。如果你听来自不同时代或流派的专辑,没有 ReplayGain 时曲目之间的音量跳跃可能很刺耳。

你使用交叉馈送。耳机交叉馈送模拟你从扬声器听到的耳际串扰,减少耳机聆听的夸张立体声分离。它很微妙,但许多听众发现它在长时间聆听中减少了疲劳。逐位精确模式会绕过它。

你使用房间校正。如果你已经测量了聆听环境并创建了校正滤波器,那些也是 DSP 链的一部分。

逐位精确模式的意义不在于它总是听起来更好。意义在于拥有选择权。当你想测试硬件、比较 DAC,或者只是想知道没有什么在改变你的音乐时,你可以验证 DAC 正在接收未修改的信号。当 DSP 处理真正改善了你的体验时,你可以关闭它。

大多数听众实际上在关闭逐位精确并使用好的均衡器配置文件时会获得更好的声音。逐位精确是用于验证和测试的,不是日常聆听。我们在 Echobox 中构建了两种路径,因为假装一个答案适合所有人是不诚实的。

简要总结

  • 逐位精确意味着从文件到 DAC 之间音频信号零修改——没有重采样、没有音量变化、没有 DSP。
  • Android 的 AudioFlinger 默认重采样,通常到 48 kHz,大多数音乐播放器无法绕过它甚至检测到它。
  • USB DAC 通过支持源文件的原生采样率提供了逐位精确的路径,但成功取决于 Android 的驱动程序对你特定 DAC 的支持。
  • 验证比声称更重要。Echobox 的信号路径诊断向你展示每个阶段的确切情况,让你永远不必猜测。
  • 逐位精确和 DSP 是互斥的。均衡器、交叉馈送、ReplayGain 和限制都需要修改信号。Echobox 让你选择哪个对特定场景更重要。
  • 没有应用可以完全绕过 Android 的音频系统。我们尽我们所能传递未修改的信号,但 AudioFlinger 仍在路径中。对于匹配速率的受支持 USB DAC,它通常是透明的。

相关指南:理解 FLAC 和无损音频 | Android 上的高解析度音频 | 音频房间校正 | 什么是发烧友播放器


相关指南


试试 Echobox

体验这些指南所描述的内容 — 在 Android 上精准播放。

每个里程碑一封邮件。没有噪音。