Android には、サポートされているハードウェアでアプリがディスプレイ設定を調整できるようにする API が含まれています。Android TV OS では、アプリはこの機能を利用して、フレームレートとカラー プロファイルを一致させ、最適な視聴エクスペリエンスを実現することで、コンテンツを最適な形式で表示できます。
コンテンツのフレームレートを合わせる
動画のフレームレートがディスプレイのリフレッシュ レートと一致しない場合、フレームレートの変換によって不快なモーション ジャダー アーティファクトが発生することがあります。これは、ゆっくりとしたパンショットで特に顕著です。このため、Surface.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"