Android Auto开发(4)-Video Integration

115 阅读5分钟

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. 使用 SurfaceViewsetPresentationTime()
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/HLG1. 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.265decoder_type == "H.264"
VideoLatencyTest端到端延迟 ≤300mslatency_ms <= 300
ResolutionTest分辨率是否为 1080p@30fps 或 720p@60fpsresolution == 1920x1080 && fps == 30
ColorSpaceTest色彩空间是否为 BT.709color_space == BT709
HdrTestHDR10/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 官方数据)

问题占比解决方案
视频延迟 >300ms50%优化 MediaCodec 缓冲区大小
未启用 HDR25%检查 video_enable_hdr() 调用
分辨率错误15%强制设置 1920x10801280x720
旋转角度不支持10%实现所有四向旋转逻辑

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

检查项操作指南验证工具
1. 编解码器检查 MediaCodech264_decoder 是否使用 H.264/H.265adb shell cat /proc/video/codec
2. 延迟测试SurfaceViewgetPresentationTime() 计算端到端延迟自定义测试脚本
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

🔥 认证通过率提升技巧

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

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

资源用途避坑提示
Video Integration GitHub获取参考实现⚠️ 切勿修改 MediaCodech264_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 测试套件

下一步行动

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