第26章 USB音频设备:USB Audio Class支持、外置DAC的效果处理、采样率转换与效果质量

各位好,今天我们来聊聊USB音频设备。说实话,这个主题在Android音频框架里一直是个「又爱又恨」的存在。爱的是它给用户带来了无限可能——外接DAC、专业声卡、HiFi播放器;恨的是它带来的兼容性问题,有时候真的让人抓狂。

我个人习惯把USB音频设备分成三类:简单的耳机/音箱、带DAC的HiFi设备、以及专业音频接口。每一类的处理方式都不一样。嗯,咱们今天重点讲Android系统怎么跟它们打交道。

USB Audio Class:系统怎么认出你的设备?

USB Audio Class(UAC)是USB组织定义的一套标准协议。说白了,就是让操作系统不用装驱动就能认出音频设备。Android从早期版本就开始支持UAC,但真正完善是在Android 5.0之后。

UAC有几个版本:

版本 特点 Android支持情况
UAC 1.0 基本音频功能,最高96kHz/24bit Android 5.0+ 原生支持
UAC 2.0 高采样率、多通道、低延迟 Android 10+ 开始完善
UAC 3.0 更低的功耗和延迟 部分厂商定制支持

我在项目中遇到过一个问题:某款外置DAC只支持UAC 2.0,但用户的手机是Android 9。结果插上去没声音。查了半天才发现,Android 9的UAC 2.0支持是半残的——只支持播放,不支持录音。所以如果你要做USB音频开发,一定要确认目标设备的Android版本。

外置DAC的效果处理:绕不开的AudioFlinger

当USB DAC插入时,Android的AudioFlinger会检测到新的音频设备。它会创建一个新的AudioStreamOut实例,专门用来跟这个DAC通信。

这里有个关键点:效果处理(Effect Processing)是在哪里做的?

答案是:取决于DAC的类型。

  • 标准UAC设备:效果处理在Android的AudioFlinger中完成,然后通过USB发送原始PCM数据
  • 带硬件DSP的DAC:Android可以绕过自己的效果处理,直接把数据交给DAC处理

我建议你在开发时,先通过dumpsys media.audio_policy查看设备类型。如果是DEVICE_TYPE_USB_HEADSET,那大概率是标准UAC设备;如果是DEVICE_TYPE_USB_DEVICE,可能带硬件处理能力。

核心原则:Android的效果处理链(均衡器、混响、动态处理等)默认对所有输出设备生效。但USB DAC如果声明了自己有硬件处理能力,Android会尽量把处理权交给DAC。

采样率转换:一个容易踩坑的地方

采样率转换(SRC)是USB音频里最头疼的问题之一。为什么?因为Android系统内部通常用48kHz作为主采样率,但很多HiFi DAC喜欢用44.1kHz、96kHz甚至192kHz。

当采样率不匹配时,系统必须做重采样。这个重采样的质量直接影响音质。

Android的采样率转换策略:

  1. 系统默认SRC:使用AudioFlinger内置的重采样器,质量一般,但兼容性好
  2. 直通模式:如果DAC支持,Android可以绕过SRC,直接发送原始采样率的数据
  3. 应用层控制:应用可以通过AudioTracksetSampleRate()指定输出采样率

我曾经踩过一个坑:某款DAC宣称支持192kHz,但实际插上后,Android强制把它降到了48kHz。查了三天才发现,是USB描述符里没有正确声明支持的采样率列表。DAC厂商只写了「支持192kHz」,但没写「也支持48kHz」,Android就默认用48kHz了。

避坑指南:我曾经在调试时发现,某些DAC在44.1kHz下音质极好,但切换到48kHz就出现爆音。原因是DAC的时钟设计只优化了44.1kHz的倍频。所以如果你做产品,一定要测试所有主流采样率。

效果质量:谁来决定音质好坏?

USB音频的效果质量,其实由三个环节共同决定:

  • Android效果处理链:均衡器、虚拟化、动态范围压缩等
  • USB传输质量:数据是否丢包、抖动控制
  • DAC硬件能力:数模转换的精度、信噪比

我个人习惯把效果质量分成三个等级:

等级 场景 典型延迟 音质表现
基础 普通USB耳机、免驱音箱 50-100ms 一般,有SRC损失
进阶 入门级外置DAC 20-50ms 较好,直通模式
专业 高端DAC、音频接口 5-20ms 优秀,硬件处理

你想想看,为什么有些用户说「外接DAC音质还不如手机直推」?大概率是SRC搞的鬼。Android把44.1kHz的音乐重采样到48kHz,再传给DAC,DAC又转回模拟信号。这一来一回,音质损失了不少。

我的建议:如果你想让USB DAC发挥最佳效果,尽量使用支持直通模式的应用。比如USB Audio Player PRO这类应用,可以绕过Android的SRC,直接把原始采样率的数据发给DAC。

知识体系总览

下面这张图总结了USB音频设备的核心逻辑:

USB音频设备核心流程 应用层 (App) AudioFlinger (效果处理链) SRC? 系统SRC重采样 直通模式 (无SRC) USB Audio Class 传输 应用层 效果处理 决策点 直通 USB传输

从这张图可以看出,USB音频的核心决策点就是「要不要做SRC」。这个决策直接影响音质和延迟。我个人建议,如果你的DAC支持高采样率,尽量走直通模式。

好了,关于USB音频设备的基础知识就聊到这里。记住一句话:USB音频的坑,十有八九出在采样率转换上。下次遇到音质问题,先查SRC。


公众号:蓝海资料掘金营,微信deep3321