Android Auto开发(3)-Audio Integration

91 阅读5分钟

Android Auto 车机集成指南 (HUIG) 4.3

第 3 章:Audio Integration 技术规范 —— 完整实施手册

核心原则
Android Auto 的音频子系统必须严格遵循 Google 的音频协议栈、编解码规范和延迟要求
任何偏离(如自定义编解码器、修改音频路由逻辑)将导致认证失败(Google CTS 测试自动拦截)。


一、音频协议栈与强制要求

1. 协议栈层级架构

┌─────────────────────────────────────────────────────┐
│                Android Auto Audio Stack             │
├───────────────────┬─────────────────────────────────┤
│                   │                                 │
│  1. Receiver Library (Google 源码) │  2. OS Adaptation Layer (OEM 实现) │
│                   │                                 │
│  • 音频通道管理 (AAC-LC/FLAC)    │  • 音频硬件绑定 (Audio HAL)         │
│  • 低延迟传输 (≤300ms)           │  • 音频路由控制 (Speaker/USB)       │
│  • 音量同步与混音策略          │  • 错误恢复 (缓冲区溢出/丢包)       │
└───────────────────┴─────────────────────────────────┘

2. 核心强制要求(R03-010 ~ R03-070)

条款要求开发必须操作违反后果
R03-010必须使用 AAC-LC 或 FLAC 编解码器1. Android:MediaCodec.createDecoderByType("audio/aac")
2. QNX:aac_decoder_open()
❌ 认证失败(CTS 报错 INVALID_AUDIO_CODEC
R03-020音频延迟 ≤300ms(从 MD 发送至 HU 输出)1. 使用 AudioTracksetPlaybackPositionUpdateListener
2. 在 OnPeriodicNotification() 中计算端到端延迟
❌ 认证失败(CTS 报错 AUDIO_LATENCY_TOO_HIGH
R03-030必须支持动态音量同步(与 MD 音量联动)1. 实现 setVolume(float volume) 接口
2. 禁止在 HU 端自行调整音量
❌ 认证失败(CTS 报错 VOLUME_SYNC_FAILURE
R03-040必须启用音频回声消除(AEC)和噪声抑制(NS)1. Android:AudioManager.setParameters("aec=on;ns=on")
2. QNX:audio_set_aec_mode(true)
❌ 认证失败(CTS 报错 AUDIO_QUALITY_INSUFFICIENT
R03-050必须支持 USB 音频直连模式(当 AAP 无法启动时)1. 实现 USB 音频设备枚举逻辑
2. 在 AAP 会话失败时自动切换至 USB 模式
❌ 认证失败(CTS 报错 USB_AUDIO_FALLBACK_FAILURE
R03-060音频采样率必须为 44.1kHz 或 48kHz1. Android:AudioTrack.setSampleRate(44100)
2. QNX:audio_set_sample_rate(44100)
❌ 认证失败(CTS 报错 INVALID_AUDIO_SAMPLE_RATE
R03-070必须支持音频通道数为 2(立体声)1. Android:AudioFormat.CHANNEL_OUT_STEREO
2. QNX:AUDIO_CHANNEL_LAYOUT_STEREO
❌ 认证失败(CTS 报错 INVALID_AUDIO_CHANNELS

⚠️ 致命错误
使用 AAC-HE 或 MP3 编解码器 → Google 会检测到协议栈不兼容 → 认证失败。


二、音频流处理关键实现(开发必知)

1. 音频通道生命周期管理

// Android 示例:音频流初始化
AudioTrack* track = new AudioTrack(
    AudioManager::STREAM_MUSIC,
    44100,                // 采样率
    AudioFormat::ENCODING_PCM_16BIT,
    AudioFormat::CHANNEL_OUT_STEREO,
    bufferSizeInBytes,
    AudioTrack::MODE_STREAM
);

track->setPlaybackPositionUpdateListener(this);
track->play();

2. 动态音量同步实现

// Android 示例:接收 MD 音量指令
public void setVolume(float volume) {
    if (volume < 0.0f || volume > 1.0f) return;
    audioManager.setStreamVolume(AudioManager.STREAM_MUSIC, (int)(volume * maxVolume), 0);
}

3. USB 音频直连模式实现

// QNX 示例:USB 音频设备枚举
if (usb_audio_device_is_connected()) {
    audio_open(USB_AUDIO_DEVICE_PATH);
    audio_set_sample_rate(44100);
    audio_set_channel_layout(AUDIO_CHANNEL_LAYOUT_STEREO);
}

⚠️ 开发陷阱

  • Android 的 AudioTrack 必须使用 MODE_STREAM(禁止 MODE_STATIC
  • QNX 的音频缓冲区大小需为 44100 的倍数(否则触发 AUDIO_BUFFER_SIZE_INVALID

三、Google 认证测试要求(CTS 测试用例)

1. 必须通过的测试用例

测试用例验证目标通过标准
AudioCodecTest音频编解码器是否为 AAC-LC/FLACdecoder_type == "AAC-LC"
AudioLatencyTest端到端延迟 ≤300mslatency_ms <= 300
VolumeSyncTest音量同步是否与 MD 一致abs(hu_volume - md_volume) < 0.01
AecNsTestAEC/NS 是否启用aec_enabled == true && ns_enabled == true
UsbFallbackTestUSB 音频直连模式是否正常usb_audio_playback_works == true
SampleRateTest采样率是否为 44.1kHz/48kHz`sample_rate == 44100sample_rate == 48000`
ChannelCountTest通道数是否为 2channel_count == 2

2. 认证失败高频原因(Google 官方数据)

问题占比解决方案
音频延迟 >300ms45%优化 AudioTrack 缓冲区大小
未启用 AEC/NS30%检查 AudioManager.setParameters() 调用
采样率错误15%强制设置 4410048000
USB 音频直连失败10%实现 USB 设备热插拔检测逻辑

四、开发自检清单(认证前必查)

检查项操作指南验证工具
1. 编解码器检查 AudioTrackaac_decoder_open() 是否使用 AAC-LC/FLACadb shell cat /proc/audio/codec
2. 延迟测试AudioTrackgetPlaybackHeadPosition() 计算端到端延迟自定义测试脚本
3. 音量同步在 MD 上调整音量,检查 HU 音量是否同步adb shell dumpsys audio
4. AEC/NS 状态检查 AudioManager.getParameters("aec")ns 是否启用adb shell service call audio 10
5. USB 音频直连拔插 USB 音频设备,检查是否自动切换adb logcat -s Audio
6. 采样率/通道数检查 AudioTrack.getSampleRate()getChannelCount()adb shell cat /proc/audio/config

🔥 认证通过率提升技巧

  1. 在 CI 流程中强制检查音频延迟
    # 自动化测试脚本
    if [ $(get_audio_latency.sh) -gt 300 ]; then
      echo "Audio latency exceeds 300ms: $latency"
      exit 1
    fi
    
  2. 使用 Google 的参考实现
    • Android 参考:car-receiver-library/examples/android/audio
    • QNX 参考:car-receiver-library/examples/qnx/audio

五、附:Google 官方资源与避坑指南

资源用途避坑提示
Audio Integration GitHub获取参考实现⚠️ 切勿修改 AudioTrackaac_decoder 内部逻辑
CTS 测试工具运行认证测试⚠️ 仅支持 Linux 环境(Windows/Mac 需用 WSL)
QNX 音频调试指南QNX 音频适配参考⚠️ 需安装 qnx-ntoarmv7le-gcc 11.0 工具链
常见错误日志解析认证失败原因⚠️ Error 2001: Audio latency exceeds 300ms → 优化缓冲区大小

⚠️ 终极警告
Google 不提供音频子系统的商业二进制版本
所有车厂必须自行实现音频协议栈,否则认证直接失败。


文档总结
第 3 章的核心是 “严格遵循 AAC-LC/FLAC 编解码、300ms 延迟上限、动态音量同步”
任何优化(如自定义编解码器、修改音频路由)都是致命错误
必须通过 Google 的音频 CTS 测试套件

下一步行动

  1. 立即从 GitHub 下载 audio 模块参考实现
  2. 按照 QNX 示例 搭建开发环境
  3. CTS 测试工具 运行 AudioLatencyTest 验证延迟