从 Android 13 开始,应用客户端可以请求视频编码器导出每个编码视频帧的编码统计信息。借助从视频编码器获得的统计信息,应用可以优化其视频编码任务,例如多遍编码和编码前的帧预处理。
要导出视频编码统计信息,SoC 供应商必须更改视频编码器驱动程序,如视频编码器驱动程序的更新中所述。
视频编码统计数据
在 Android 13 中,视频编码器会导出如下表所示的统计数据。
| 编码器统计信息的名称 | 说明 |
|---|---|
| 每帧平均块 QP | 编码到比特流中的视频帧中所有块 QP 的平均值 |
| 图片类型 | I 型、P 型或 B 型 |
开发者可以使用 MediaFormat 开发者类检索每个帧的统计信息。
视频编码器驱动程序的更新
为了支持导出视频编码统计信息,SoC 供应商必须更改视频编码器驱动程序。Android 13 的 Codec 2.0 基础中添加了以下键
KEY_VIDEO_QP_AVERAGE描述了每帧平均块 QP。以下规则适用于
KEY_VIDEO_QP_AVERAGE键的实现SoC 编码器必须在发出到 Codec 2.0 之前,将块 QP 的平均值四舍五入到最接近的整数。
平均值仅从亮度平面计算得出。
如果当前帧中的所有块都处于跳过模式,则 SoC 编码器必须返回
INT_MAX。当没有系数被编码,并且帧中没有编码重要的 QP 信息时,就会发生这种情况。
KEY_PICTURE_TYPE将编码帧的图片类型描述为PICTURE_TYPE_I、PICTURE_TYPE_P、PICTURE_TYPE_B或PICTURE_TYPE_UNKNOWN。KEY_VIDEO_ENCODING_STATISTICS_LEVEL描述了视频编码器发出的编码统计信息级别,如下所示当编码器不生成有关编码统计信息时,此键设置为
VIDEO_ENCODING_STATISTICS_LEVEL_NONE。当编码器为每个帧生成
KEY_VIDEO_QP_AVERAGE和KEY_PICTURE_TYPE时,此键设置为VIDEO_ENCODING_STATISTICS_LEVEL_1。
有关参考实现,请参阅 VideoEncodingStatisticsTest。
验证
运行 VideoEncodingStatisticsTest CTS 测试,以验证视频编码统计信息的平均 QP 部分是否正常工作:CTS 运行同一输入视频的两次编码,一次使用较高的比特率,另一次使用较低的比特率。然后,CTS 会比较两次编码导出的平均 QP 值。如果比特率较低的编码的平均 QP 高于比特率较高的编码的平均 QP,则 CTS 通过。
要验证在启用后关闭导出视频编码统计信息功能,请使用 VIDEO_ENCODING_STATISTICS_LEVEL_NONE 键,如下所示
format.setInteger(MediaFormat.KEY_VIDEO_ENCODING_STATISTICS_LEVEL, MediaFormat.VIDEO_ENCODING_STATISTICS_LEVEL_NONE);