第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的采样率转换策略:
- 系统默认SRC:使用AudioFlinger内置的重采样器,质量一般,但兼容性好
- 直通模式:如果DAC支持,Android可以绕过SRC,直接发送原始采样率的数据
- 应用层控制:应用可以通过
AudioTrack的setSampleRate()指定输出采样率
我曾经踩过一个坑:某款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音频的核心决策点就是「要不要做SRC」。这个决策直接影响音质和延迟。我个人建议,如果你的DAC支持高采样率,尽量走直通模式。
好了,关于USB音频设备的基础知识就聊到这里。记住一句话:USB音频的坑,十有八九出在采样率转换上。下次遇到音质问题,先查SRC。
公众号:蓝海资料掘金营,微信deep3321