Android には、サポートされているハードウェアでアプリがディスプレイ設定を調整できるようにする API があります。Android TV OS では、アプリはこの機能を利用して、最適な視聴エクスペリエンスを実現するために、フレームレートとカラー プロファイルを一致させ、コンテンツが可能な限り最高の形式で表示されるようにすることができます。
コンテンツのフレームレートを合わせる
動画のフレームレートがディスプレイのリフレッシュ レートと一致しない場合、ユーザーはフレームレート変換による不快なモーション ジャダー アーティファクトを経験する可能性があります。これは、ゆっくりとしたパンショットで特に顕著です。そのため、SurfaceControl.Transaction.setFrameRate()
API を使用して、コンテンツのフレームレートをフレームワークに通知し、動画コンテンツがシームレスでないフレームレートの切り替えの対象となるかどうかをシグナリングすることが重要です。
詳しくは、フレームレート ガイドをご覧ください。
優先する画像プロファイルに一致させる
Android 16 の MediaQuality API を使用すると、デベロッパーは画像プロファイルを制御できます。
たとえば、次のようなシナリオがあります。
- より広いダイナミック レンジでマスタリングされた映画やテレビシリーズの場合、デベロッパーは、クリエイターが意図したとおりにコンテンツを正確に表示するために、映画製作者モードをリクエストすることがあります。映画プロファイルでは、明るさを高めるために、影の微妙なディテールが強調されます。
- スポーツのライブイベントは、ダイナミック レンジが狭く、日中に視聴されることが多いため、色の正確さよりも明るさを優先するプロファイルが適しています。
- ゲーム デベロッパーは、画像処理を最小限に抑えた低レイテンシ プロファイルをリクエストできます。これにより、プレーヤーはディスプレイで最高のパフォーマンスを得ることができます。
システム ピクチャー プロファイルの選択
ピクチャー プロファイルを選択する前に、まずデバイスがそれをサポートしていることを確認することが重要です。
次のスニペットは、getAvailablePictureProfiles()
を使用してサポートされているすべての画像プロファイルをクエリし、スポーツ プロファイルを適用する方法を示しています。
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.BAKLAVA) {
val mediaQualityManager: MediaQualityManager =
context.getSystemService(MediaQualityManager::class.java)
val profiles = mediaQualityManager.getAvailablePictureProfiles(null)
for (profile in profiles) {
// If we have a system sports profile, apply it to our media codec
if (profile.profileType == PictureProfile.TYPE_SYSTEM
&& profile.name == NAME_SPORTS
) {
val bundle = Bundle().apply {
putParcelable(MediaFormat.KEY_PICTURE_PROFILE_INSTANCE, profile)
}
mediaCodec.setParameters(bundle)
}
}
}
名前を指定して特定のプロファイルを取得するには、getPictureProfile()
を使用します。
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.BAKLAVA) {
val profile = mediaQualityManager.getPictureProfile(
PictureProfile.TYPE_SYSTEM, NAME_SPORTS, null)
}
プロファイルが利用可能かどうかをクエリする必要がない場合は、MediaFormat.KEY_PICTURE_PROFILE_INSTANCE
を使用して、ID で MediaCodec に直接プロファイルを指定できます。
サポートされるプロファイルはデバイスによって異なる場合がありますが、次の既知のシステム プロファイル ID と照合することを検討してください。
const val NAME_STANDARD: String = "standard"
const val NAME_VIVID: String = "vivid"
const val NAME_SPORTS: String = "sports"
const val NAME_GAME: String = "game"
const val NAME_MOVIE: String = "movie"
const val NAME_ENERGY_SAVING: String = "energy_saving"
const val NAME_USER: String = "user"