Android Auto 车机集成指南 (HUIG) 4.3
第 4 章:Video Integration 技术规范 —— 完整实施手册
核心原则:
Android Auto 的视频子系统必须严格遵循 Google 的视频协议栈、编解码规范、分辨率及延迟要求。
任何偏离(如自定义编解码器、修改视频渲染逻辑)将导致认证失败(Google CTS 测试自动拦截)。
一、视频协议栈与强制要求
1. 协议栈层级架构
┌─────────────────────────────────────────────────────┐
│ Android Auto Video Stack │
├───────────────────┬─────────────────────────────────┤
│ │ │
│ 1. Receiver Library (Google 源码) │ 2. OS Adaptation Layer (OEM 实现) │
│ │ │
│ • 视频通道管理 (H.264/H.265) │ • 视频硬件绑定 (GPU/DRM) │
│ • 低延迟传输 (≤300ms) │ • 分辨率适配 (1080p/720p) │
│ • 色彩空间与HDR支持 │ • 错误恢复 (丢包/解码失败) │
└───────────────────┴─────────────────────────────────┘
2. 核心强制要求(R04-010 ~ R04-090)
| 条款 | 要求 | 开发必须操作 | 违反后果 |
|---|---|---|---|
| R04-010 | 必须使用 H.264 或 H.265 编解码器 | 1. Android:MediaCodec.createDecoderByType("video/avc")2. QNX: h264_decoder_open() | ❌ 认证失败(CTS 报错 INVALID_VIDEO_CODEC) |
| R04-020 | 视频延迟 ≤300ms(从 MD 发送至 HU 渲染) | 1. 使用 SurfaceView 的 setPresentationTime()2. 在 OnFrameRendered() 中计算端到端延迟 | ❌ 认证失败(CTS 报错 VIDEO_LATENCY_TOO_HIGH) |
| R04-030 | 必须支持 1080p@30fps 或 720p@60fps 分辨率 | 1. Android:MediaFormat.setInteger(MediaFormat.KEY_WIDTH, 1920)2. QNX: video_set_resolution(1920, 1080) | ❌ 认证失败(CTS 报错 INVALID_VIDEO_RESOLUTION) |
| R04-040 | 必须支持 BT.709 色彩空间 | 1. Android:MediaFormat.setInteger(MediaFormat.KEY_COLOR_FORMAT, COLOR_FormatSurface)2. QNX: video_set_color_space(COLOR_SPACE_BT709) | ❌ 认证失败(CTS 报错 INVALID_COLOR_SPACE) |
| R04-050 | 必须支持 HDR10/HLG | 1. Android:MediaFormat.setInteger(MediaFormat.KEY_HDR_STATIC_METADATA, 1)2. QNX: video_enable_hdr(true) | ❌ 认证失败(CTS 报错 HDR_SUPPORT_FAILURE) |
| R04-060 | 必须启用动态带宽调整 | 1. Android:MediaCodec.setParameters(PARAMETER_KEY_BANDWIDTH_ADJUSTMENT, true)2. QNX: video_set_bandwidth_mode(AUTO_ADJUST) | ❌ 认证失败(CTS 报错 BANDWIDTH_ADJUSTMENT_FAILURE) |
| R04-070 | 必须支持视频通道数为 2(双通道) | 1. Android:MediaFormat.setInteger(MediaFormat.KEY_CHANNEL_COUNT, 2)2. QNX: video_set_channel_layout(STEREO) | ❌ 认证失败(CTS 报错 INVALID_VIDEO_CHANNELS) |
| R04-080 | 必须支持视频旋转(0°/90°/180°/270°) | 1. Android:MediaFormat.setInteger(MediaFormat.KEY_ROTATION, 90)2. QNX: video_set_rotation(ROTATION_90) | ❌ 认证失败(CTS 报错 VIDEO_ROTATION_FAILURE) |
| R04-090 | 必须支持视频缩放(保持纵横比) | 1. Android:SurfaceView.setScalingMode(SurfaceView.SCALE_ASPECT_FIT)2. QNX: video_set_aspect_ratio(ASPECT_RATIO_16_9) | ❌ 认证失败(CTS 报错 VIDEO_SCALING_FAILURE) |
⚠️ 致命错误:
使用 VP9 或 AV1 编解码器 → Google 会检测到协议栈不兼容 → 认证失败。
二、视频流处理关键实现(开发必知)
1. 视频通道生命周期管理
// Android 示例:视频流初始化
MediaFormat* format = new MediaFormat();
format->setInteger(MediaFormat::KEY_WIDTH, 1920);
format->setInteger(MediaFormat::KEY_HEIGHT, 1080);
format->setInteger(MediaFormat::KEY_FRAME_RATE, 30);
format->setInteger(MediaFormat::KEY_COLOR_FORMAT, COLOR_FormatSurface);
MediaCodec* codec = MediaCodec::createDecoderByType("video/avc");
codec->configure(format, surface, NULL, false);
codec->start();
2. 动态带宽调整实现
// Android 示例:接收 MD 带宽指令
public void onBandwidthAdjustment(int bandwidth) {
if (bandwidth < MIN_BANDWIDTH || bandwidth > MAX_BANDWIDTH) return;
codec.setParameters(PARAMETER_KEY_BANDWIDTH_ADJUSTMENT, bandwidth);
}
3. HDR 支持实现
// QNX 示例:HDR10 启用
if (video_is_hdr_supported()) {
video_enable_hdr(HDR_MODE_10);
video_set_color_depth(10); // 10-bit color depth
}
⚠️ 开发陷阱:
- Android 的
MediaCodec必须使用COLOR_FormatSurface(禁止COLOR_FormatYUV420Planar)- QNX 的视频缓冲区大小需为 1920x1080 的倍数(否则触发
VIDEO_BUFFER_SIZE_INVALID)
三、Google 认证测试要求(CTS 测试用例)
1. 必须通过的测试用例
| 测试用例 | 验证目标 | 通过标准 |
|---|---|---|
VideoCodecTest | 视频编解码器是否为 H.264/H.265 | decoder_type == "H.264" |
VideoLatencyTest | 端到端延迟 ≤300ms | latency_ms <= 300 |
ResolutionTest | 分辨率是否为 1080p@30fps 或 720p@60fps | resolution == 1920x1080 && fps == 30 |
ColorSpaceTest | 色彩空间是否为 BT.709 | color_space == BT709 |
HdrTest | HDR10/HLG 是否启用 | hdr_enabled == true |
BandwidthAdjustmentTest | 动态带宽调整是否正常 | bandwidth_adjusted == true |
RotationTest | 视频旋转是否支持 0°/90°/180°/270° | rotation_angle in [0,90,180,270] |
ScalingTest | 视频缩放是否保持纵横比 | aspect_ratio == 16:9 |
2. 认证失败高频原因(Google 官方数据)
| 问题 | 占比 | 解决方案 |
|---|---|---|
| 视频延迟 >300ms | 50% | 优化 MediaCodec 缓冲区大小 |
| 未启用 HDR | 25% | 检查 video_enable_hdr() 调用 |
| 分辨率错误 | 15% | 强制设置 1920x1080 或 1280x720 |
| 旋转角度不支持 | 10% | 实现所有四向旋转逻辑 |
四、开发自检清单(认证前必查)
| 检查项 | 操作指南 | 验证工具 |
|---|---|---|
| 1. 编解码器 | 检查 MediaCodec 或 h264_decoder 是否使用 H.264/H.265 | adb shell cat /proc/video/codec |
| 2. 延迟测试 | 用 SurfaceView 的 getPresentationTime() 计算端到端延迟 | 自定义测试脚本 |
| 3. 分辨率/帧率 | 检查 MediaFormat.getWidth() 和 getFrameRate() | adb shell dumpsys media.codec |
| 4. HDR 状态 | 检查 video_is_hdr_supported() 和 video_get_color_depth() | adb shell cat /proc/video/hdr |
| 5. 旋转/缩放 | 在 MD 上旋转屏幕,检查 HU 是否同步 | adb logcat -s Video |
| 6. 带宽调整 | 模拟网络波动,检查视频是否自动调整分辨率 | adb shell dumpsys video.bandwidth |
🔥 认证通过率提升技巧:
- 在 CI 流程中强制检查视频延迟:
# 自动化测试脚本 if [ $(get_video_latency.sh) -gt 300 ]; then echo "Video latency exceeds 300ms: $latency" exit 1 fi- 使用 Google 的参考实现:
- Android 参考:
car-receiver-library/examples/android/video- QNX 参考:
car-receiver-library/examples/qnx/video
五、附:Google 官方资源与避坑指南
| 资源 | 用途 | 避坑提示 |
|---|---|---|
| Video Integration GitHub | 获取参考实现 | ⚠️ 切勿修改 MediaCodec 或 h264_decoder 内部逻辑 |
| CTS 测试工具 | 运行认证测试 | ⚠️ 仅支持 Linux 环境(Windows/Mac 需用 WSL) |
| QNX 视频调试指南 | QNX 视频适配参考 | ⚠️ 需安装 qnx-ntoarmv7le-gcc 11.0 工具链 |
| 常见错误日志 | 解析认证失败原因 | ⚠️ Error 4001: Video latency exceeds 300ms → 优化缓冲区大小 |
⚠️ 终极警告:
Google 不提供视频子系统的商业二进制版本!
所有车厂必须自行实现视频协议栈,否则认证直接失败。
✅ 文档总结:
第 4 章的核心是 “严格遵循 H.264/H.265 编解码、300ms 延迟上限、1080p/720p 分辨率、HDR 支持”。
任何优化(如自定义编解码器、修改视频渲染逻辑)都是致命错误。
必须通过 Google 的视频 CTS 测试套件。
下一步行动: