Android bietet APIs, mit denen Apps die Displayeinstellungen auf unterstützter Hardware anpassen können. Auf Android TV-Betriebssystemen können Apps diese Funktion nutzen, um dafür zu sorgen, dass Inhalte im bestmöglichen Format angezeigt werden. Dazu werden Bildrate und Farbprofil für die ideale Wiedergabe abgestimmt.
An Framerate des Inhalts anpassen
Wenn die Framerate eines Videos nicht mit der Bildwiederholrate des Displays übereinstimmt, können bei der Framerate-Konvertierung unschöne Ruckler auftreten. Das ist besonders bei langsamen Schwenkaufnahmen sichtbar. Aus diesem Grund ist es wichtig, die SurfaceControl.Transaction.setFrameRate()
API zu verwenden, um das Framework über die Framerate der Inhalte zu informieren und anzugeben, ob die Videoinhalte für eine nicht nahtlose Framerate-Umstellung geeignet sind.
Weitere Informationen finden Sie im Leitfaden zur Framerate.
Bevorzugte Bildprofile abgleichen
Mit der MediaQuality API in Android 16 können Entwickler die Kontrolle über Bildprofile übernehmen.
Beispiele:
- Bei Filmen und Serien, die mit einem größeren dynamischen Bereich gemastert wurden, können Entwickler den Filmmaker-Modus anfordern, damit Inhalte genau so angezeigt werden, wie der Creator sie sich vorgestellt hat. Ein Kinoprofil mit höherer Farbgenauigkeit hebt subtile Details in Schatten hervor, um die Helligkeit zu erhöhen.
- Bei Live-Sportveranstaltungen, die oft mit einem schmalen dynamischen Bereich gemastert und bei Tageslicht angesehen werden, kann ein Profil verwendet werden, bei dem die Helligkeit gegenüber der Farbrichtigkeit priorisiert wird.
- Spieleentwickler können ein Profil mit niedriger Latenz und minimaler Bildverarbeitung anfordern, damit Spieler die beste Leistung aus ihrem Display herausholen können.
Bildprofil für das System auswählen
Bevor Sie ein Bildprofil auswählen, sollten Sie prüfen, ob es vom Gerät unterstützt wird.
Im folgenden Snippet wird gezeigt, wie Sie mit getAvailablePictureProfiles()
alle unterstützten Bildprofile abfragen und ein Sportprofil anwenden:
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)
}
}
}
So rufen Sie ein bestimmtes Profil anhand des Namens ab:getPictureProfile()
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.BAKLAVA) {
val profile = mediaQualityManager.getPictureProfile(
PictureProfile.TYPE_SYSTEM, NAME_SPORTS, null)
}
Wenn du nicht abfragen musst, ob ein Profil verfügbar ist, können Profile mithilfe von MediaFormat.KEY_PICTURE_PROFILE_INSTANCE
direkt über ihre ID an einen MediaCodec übergeben werden.
Die unterstützten Profile können je nach Gerät variieren. Sie können jedoch einen Abgleich mit den folgenden bekannten Systemprofil-IDs vornehmen:
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"