Android incluye APIs que permiten que las apps ajusten la configuración de pantalla en hardware compatible. En el SO de Android TV, las apps pueden aprovechar esta función para garantizar que el contenido se muestre en el mejor formato posible, ya que coinciden con la velocidad de fotogramas y el perfil de color para brindar una experiencia de visualización ideal.
Cómo igualar la velocidad de fotogramas del contenido
Cuando la velocidad de fotogramas de un video no coincide con la frecuencia de actualización de la pantalla, los usuarios pueden experimentar artefactos desagradables de vibración de movimiento debido a la conversión de la velocidad de fotogramas. Esto se nota especialmente durante las tomas panorámicas lentas. Por este motivo, es importante usar la API de SurfaceControl.Transaction.setFrameRate()
para notificar al framework sobre la velocidad de fotogramas del contenido y para indicar si el contenido de video es apto para un cambio de velocidad de fotogramas no fluido.
Para obtener más información, lee la guía de frecuencia de fotogramas.
Cómo hacer coincidir los perfiles de imagen preferidos
La API de MediaQuality en Android 16 permite a los desarrolladores controlar los perfiles de imagen.
Estos son algunos ejemplos de situaciones:
- En el caso de las películas y las series de TV que se masterizan con un rango dinámico más amplio, los desarrolladores pueden solicitar el Modo cineasta para mostrar el contenido con precisión, tal como el creador quería que se viera. Un perfil de cine con mayor precisión de color resalta los detalles sutiles en las sombras en lugar de aumentar el brillo.
- Los eventos deportivos en vivo, que a menudo se masterizan con un rango dinámico estrecho y se miran a la luz del día, pueden beneficiarse de un perfil que priorice el brillo por sobre la precisión del color.
- Los desarrolladores de juegos pueden solicitar un perfil de latencia baja con un procesamiento de imágenes mínimo para que los jugadores puedan obtener el mejor rendimiento de su pantalla.
Cómo seleccionar un perfil de imagen del sistema
Antes de seleccionar un perfil de imagen, es importante validar primero que el dispositivo lo admita.
En el siguiente fragmento, se muestra cómo usar getAvailablePictureProfiles()
para consultar todos los perfiles de imagen admitidos y aplicar un perfil deportivo:
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)
}
}
}
Para obtener un perfil específico por nombre, usa getPictureProfile()
:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.BAKLAVA) {
val profile = mediaQualityManager.getPictureProfile(
PictureProfile.TYPE_SYSTEM, NAME_SPORTS, null)
}
Si no necesitas consultar si un perfil está disponible, puedes proporcionar los perfiles directamente por su ID a un MediaCodec con MediaFormat.KEY_PICTURE_PROFILE_INSTANCE
.
Si bien los perfiles admitidos pueden variar según el dispositivo, puedes considerar la posibilidad de hacer coincidir los siguientes IDs de perfil del sistema conocidos:
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"