第2章 测试环境搭建:设备选型、系统版本、接口版本与素材准备
编码参数调优必须在稳定、可控的测试环境中进行。本章定义 Android 测试设备的选型标准、系统版本要求、MediaCodec 接口版本选择以及标准测试视频素材的制备方法,确保后续章节的测量数据具有可比性与可复现性。
2.1 Android 设备选型
编码器的硬件支持、性能上限及兼容性问题高度依赖设备芯片组。为覆盖常见场景,建议按以下三层模型选择测试设备:
| 层级 | 代表芯片 | 编码器能力 | 适用调优目标 |
|---|---|---|---|
| 旗舰 | Snapdragon 8 Gen 2/3, Dimensity 9200+, Apple A16 | AV1/H.265 4K@60fps, 8×8 分块, 10-bit HDR | 极限画质、低延迟、高分辨率场景 |
| 中端 | Snapdragon 7/6 系列, Exynos 1280, Dimensity 7xxx | H.264/H.265 1080p@30fps, 部分支持 4K | 主流应用、功耗平衡、兼容性验证 |
| 入门 | MediaTek Helio G系列, Snapdragon 4 系列 | H.264 1080p@30fps, 仅支持基本 profile | 最低配置、基线测试、老旧设备兼容 |
设备选型验收阈值:至少 1 台旗舰 + 1 台中端 + 1 台入门设备。每台设备需同一制造商同固件批次,避免因厂商定制编解码器行为差异造成测量误判。
2.2 系统版本与 MediaCodec 接口版本
MediaCodec API 自 Android 4.1 (API 16) 引入,但关键特性随版本演进。测试环境必须明确 API Level 以锁定接口行为。
| Android 版本 | API Level | MediaCodec 重要变化 |
|---|---|---|
| 4.1 – 4.3 | 16 – 18 | 基础编解码框架,仅支持 OMX 组件 |
| 5.0 – 5.1 | 21 – 22 | 新增异步模式、input/output surface 支持 |
| 7.0 – 7.1 | 24 – 25 | HEVC Main Profile 硬件加速稳定 |
| 8.0 – 8.1 | 26 – 27 | 支持高清 HDR (10-bit) 编码 |
| 9.0 – 10 | 28 – 29 | Codec2 框架开始替代 OMX,AV1 解码 |
| 11 – 12 | 30 – 31 | Codec2 成为默认,AV1 编码实验支持 |
| 13+ | 33+ | 编码器低延迟模式、rate control 精细化参数 |
重要:同一 Android 版本在不同厂商 ROM 中可能提供不同的编解码器实现(如高通 vs 联发科 Codec2 插件),建议通过
MediaCodecList.getCodecInfos() 在运行时获取实际支持的 mime 类型与能力,而非依赖文档假设。
接口版本选择策略:针对性调优时,目标 API Level 应不低于 21(获得异步模式),建议以 API 29 或 31 为基线进行核心参数测试,同时向下兼容至 API 21 做回归验证。
2.3 测试视频素材准备
标准测试素材应覆盖不同复杂度与编码挑战,避免使用单一素材造成过拟合。按以下规格制作或选用:
- 分辨率: 480p (720×480)、720p (1280×720)、1080p (1920×1080)、4K (3840×2160)
- 帧率: 24、30、60 fps(各一份)
- 色彩空间与量化: 8-bit YUV 4:2:0 (BT.709) 为主,10-bit HDR10 (BT.2020) 用于 HDR 测试
- 内容类型: 静态背景 + 人物(低复杂度)、快速运动(足球/赛车)、高频纹理(草地/橱窗)、渐变色条(量化验证)
- 时长: 每段 10~30 秒,保证足够的 GOP 周期与场景切换
- 封装/容器: 原始 YUV 文件(未压缩)或 MP4 无压缩/轻微压缩母版(保持无损)
素材制备工具: 推荐
ffmpeg 生成 YUV 序列。例如生成 1080p 30fps 10 秒运动测试素材:
ffmpeg -f lavfi -i testsrc2=size=1920x1080:rate=30:duration=10 \
-pix_fmt yuv420p -f rawvideo test_1080p.yuv
对复杂场景,可使用 ffmpeg 从 blu-ray 或高码率视频截取片段并转码为无损格式:
ffmpeg -i source.mp4 -ss 00:05:00 -t 10 \
-c:v libx264 -preset ultrafast -crf 0 -pix_fmt yuv420p \
test_clip.mp4
2.4 MediaCodec 基础配置示例
以下代码片段演示在实际测试中如何统一配置 MediaCodec 编码器,保证所有调优实验在相同基础参数上运行:
// 选取 H.264 编码器(首选择硬件加速)
MediaCodec codec = MediaCodec.createEncoderByType(MediaFormat.MIME_TYPE_AVC);
MediaFormat format = MediaFormat.createVideoFormat(
MediaFormat.MIME_TYPE_AVC, width, height);
// 固定基础参数(调优时仅改动目标变量)
format.setInteger(MediaFormat.KEY_COLOR_FORMAT,
MediaCodecInfo.CodecCapabilities.COLOR_FormatSurface);
format.setInteger(MediaFormat.KEY_BIT_RATE, bitrate);
format.setInteger(MediaFormat.KEY_FRAME_RATE, frameRate);
format.setInteger(MediaFormat.KEY_I_FRAME_INTERVAL, gopSize);
format.setInteger(MediaFormat.KEY_BITRATE_MODE,
MediaCodecInfo.EncoderCapabilities.BITRATE_MODE_VBR);
format.setInteger(MediaFormat.KEY_COMPLEXITY,
MediaCodecInfo.EncoderCapabilities.COMPLEXITY_HIGH);
codec.configure(format, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE);
// 后续通过 surface 输入,异步模式回调输出
codec.setCallback(new MediaCodec.Callback() { ... });
codec.start();
日志输出要点:每次配置完成后应立即打印当前设备的编解码器名称、版本、支持的 profile/level、软件/硬件标记,以便后期交叉分析时排除实现差异。
MediaCodecInfo info = codec.getCodecInfo();
Log.i("TestEnv", "Codec: " + info.getName() +
" | Hw: " + info.isHardwareAccelerated() +
" | Version: " + info.getSupportedVersions());
2.5 测量步骤与环境验证
- 设备准备:恢复出厂设置,开启开发者模式,关闭后台省电优化,固定亮度/音量,连接恒温电源(避免降频)。
- 系统校验:在测试 app 中调用
Build.VERSION.SDK_INT与Build.MODEL并写入日志。 - 编码器能力扫描:使用
MediaCodecList扫描所有编码器,记录支持的 mime 类型、颜色格式、复杂度和比特率范围。 - 素材注入:将标准 YUV 文件转换为 Surface 输入或 ByteBuffer 输入,确保每次测试使用同一份素材文件(校验 MD5)。
- 基线编码:使用固定参数(如默认 profile/level、VBR 模式)编码一次,记录每一帧的输出大小、延迟、PSNR/SSIM(如可用)。
- 重复性验证:对同一参数组合重复运行 3 次,计算平均值和标准差以评估环境稳定性。
2.6 验收阈值与误差控制
环境搭建完成后必须通过以下验收标准,否则该测试环境视为无效:
| 指标 | 验收阈值 | 检测方法 |
|---|---|---|
| 设备温度变化 | 编码持续 30 秒内温升 ≤ 5°C | adb 读取 /sys/class/thermal/thermal_zone*/temp |
| 帧输出间隔抖动 | CV < 5% | 解析 MediaCodec.BufferInfo.presentationTimeUs 时间戳 |
| 编码器协议一致性 | 连续 3 次编码输出比特率偏差 < 2% | 统计输出大小 / 时长 |
| 素材完整性 | 输入素材 MD5 一致 | md5sum test.yuv |
误差分析:若验收失败,优先检查设备散热(高温降频)、后台进程(如系统更新、消息推送)、或固件/驱动版本不一致。仅当所有验收阈值通过后,本章节搭建的测试环境方可被后续调优章节使用。