Regolare le impostazioni di visualizzazione

Android include API che consentono alle app di regolare le impostazioni di visualizzazione sull'hardware supportato. Sul sistema operativo Android TV, le app possono sfruttare questa funzionalità per garantire che i contenuti vengano visualizzati nel miglior formato possibile, abbinando il frame rate e il profilo colore per un'esperienza di visione ideale.

Adatta alla frequenza fotogrammi dei contenuti

Quando il framerate di un video non corrisponde alla frequenza di aggiornamento del display, gli utenti possono riscontrare spiacevoli artefatti di judder di movimento dovuti alla conversione del framerate. Questo è particolarmente visibile durante le riprese panoramiche lente. Per questo motivo, è importante utilizzare l'API SurfaceControl.Transaction.setFrameRate() per comunicare al framework la frequenza fotogrammi dei contenuti e segnalare se i contenuti video sono idonei per un cambio di frequenza fotogrammi non fluido.

Per saperne di più, leggi la guida al frame rate.

Corrispondenza con i profili immagine preferiti

L'API MediaQuality in Android 16 consente agli sviluppatori di controllare i profili immagine.

Ecco alcuni scenari di esempio:

  • Per film e serie TV masterizzati con una gamma dinamica più ampia, gli sviluppatori potrebbero richiedere la modalità Filmmaker per visualizzare accuratamente i contenuti come previsto dal creatore. Un profilo cinematografico con una maggiore precisione del colore mette in evidenza i dettagli più sottili nelle ombre a favore di un aumento della luminosità.
  • Gli eventi sportivi in diretta, spesso masterizzati con una gamma dinamica ristretta e guardati alla luce del giorno, possono trarre vantaggio da un profilo che privilegia la luminosità rispetto all'accuratezza del colore.
  • Gli sviluppatori di giochi possono richiedere un profilo a bassa latenza con un'elaborazione minima delle immagini, in modo che i giocatori possano ottenere le migliori prestazioni dal display.

Selezionare un profilo immagine di sistema

Prima di selezionare un profilo immagine, è importante verificare che il dispositivo lo supporti.

Lo snippet seguente mostra come utilizzare getAvailablePictureProfiles() per eseguire query su tutti i profili immagine supportati e applicare un profilo sportivo:

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)
        }
    }
}

Per ottenere un profilo specifico per nome, utilizza getPictureProfile():

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.BAKLAVA) {
    val profile = mediaQualityManager.getPictureProfile(
        PictureProfile.TYPE_SYSTEM, NAME_SPORTS, null)
}

Se non devi eseguire query per verificare se un profilo è disponibile, i profili possono essere forniti direttamente tramite il loro ID a un MediaCodec utilizzando MediaFormat.KEY_PICTURE_PROFILE_INSTANCE.

Sebbene i profili supportati possano variare in base al dispositivo, puoi prendere in considerazione la corrispondenza con i seguenti ID profilo di sistema noti:

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"