从 Android 13 开始,应用客户端可以向视频编码器提出请求,要求导出每个已编码视频帧的编码统计信息。利用从视频编码器获取的统计信息,应用可以在编码之前优化其视频编码任务,例如多通路编码和帧预处理。
如需导出视频编码统计信息,SoC 供应商必须更改视频编码器驱动程序,如视频编码器驱动程序更新中所述。
视频编码统计信息数据
在 Android 13 中,视频编码器可导出如下表所示的统计信息数据。
编码器统计信息的名称 | 说明 |
---|---|
每帧平均代码块 QP | 编码到比特流中的视频帧中所有代码块 QP 的平均值 |
图片类型 | I、P 或 B 类型 |
开发者可以使用 MediaFormat
开发者类检索每一帧的统计信息。
视频编码器驱动程序更新
如需支持对视频编码统计信息执行导出操作,SoC 供应商必须更改视频编码器驱动程序。Android 13 的编解码器 2.0 库中添加了以下键:
KEY_VIDEO_QP_AVERAGE
描述每帧平均代码块 QP。以下规则适用于
KEY_VIDEO_QP_AVERAGE
键的实现:SoC 编码器必须先将代码块 QP 的平均值四舍五入为最接近的整数,然后再将其发送到编解码器 2.0。
平均值仅基于亮度平面计算得出。
如果当前帧中的所有代码块都处于跳过模式,则 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);