Android 13 以降では、アプリ クライアントは動画エンコーダに、エンコードされた動画フレームごとにエンコード統計情報をエクスポートするようリクエストできます。動画エンコーダから取得した統計情報により、アプリは、マルチパス エンコードやエンコード前のフレーム前処理などの動画エンコード タスクを最適化できます。
動画エンコード統計情報をエクスポートするには、SoC ベンダーは動画エンコーダ ドライバの更新の説明に沿って、動画エンコーダ ドライバを変更する必要があります。
動画エンコード統計情報のデータ
Android 13 では、次の表に示すように、動画エンコーダによって統計データがエクスポートされます。
エンコーダ統計情報の名前 | 説明 |
---|---|
1 フレームあたりの平均ブロック 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 では、同じ入力動画に対して 2 つのエンコード(1 つは高いビットレート、もう 1 つは低いビットレート)を実行します。次に、CTS で 2 つのエンコードからエクスポートされた 2 つの平均 QP 値を比較します。低いビットレートのエンコードの平均 QP が、高いビットレートのエンコードの平均 QP よりも大きい場合、CTS で合格します。
動画エンコード統計情報のエクスポート機能が有効な場合に、この機能をオフにすることを検証するには、次のように VIDEO_ENCODING_STATISTICS_LEVEL_NONE
キーを使用します。
format.setInteger(MediaFormat.KEY_VIDEO_ENCODING_STATISTICS_LEVEL, MediaFormat.VIDEO_ENCODING_STATISTICS_LEVEL_NONE);