Ajustar as configurações de exibição

O Android inclui APIs que permitem que os apps ajustem as configurações de exibição em hardware compatível. No Android TV OS, os apps podem aproveitar isso para garantir que o conteúdo seja exibido no melhor formato possível, combinando a taxa de frames e o perfil de cores para uma experiência de visualização ideal.

Usar o mesmo frame rate do conteúdo

Quando a taxa de frames de um vídeo não corresponde à taxa de atualização da tela, os usuários podem ter artefatos de trepidação de movimento desagradáveis devido à conversão da taxa de frames. Isso é especialmente visível durante movimentos lentos da câmera. Por isso, é importante usar a API SurfaceControl.Transaction.setFrameRate() para notificar o framework sobre o frame rate do conteúdo e sinalizar se o conteúdo de vídeo está qualificado para uma troca de frame rate não contínua.

Para mais informações, leia o guia de taxa de frames.

Corresponder aos perfis de imagem preferidos

A API MediaQuality no Android 16 permite que os desenvolvedores controlem perfis de imagem.

Alguns exemplos de cenários:

  • Para filmes e séries de TV masterizados com um intervalo dinâmico mais amplo, os desenvolvedores podem solicitar o modo cineasta para exibir o conteúdo com precisão, conforme o criador pretendia. Um perfil de cinema com maior precisão de cores destaca detalhes sutis nas sombras para aumentar o brilho.
  • Eventos esportivos ao vivo, que geralmente são masterizados com um intervalo dinâmico estreito e assistidos à luz do dia, podem se beneficiar de um perfil que prioriza o brilho em vez da precisão das cores.
  • Os desenvolvedores de jogos podem solicitar um perfil de baixa latência com processamento de imagem mínimo para que os jogadores tenham o melhor desempenho da tela.

Selecionar um perfil de imagem do sistema

Antes de selecionar um perfil de imagem, é importante validar se o dispositivo é compatível com ele.

O snippet a seguir mostra como usar getAvailablePictureProfiles() para consultar todos os perfis de imagem compatíveis e aplicar um perfil de esportes:

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 receber um perfil específico pelo nome, use getPictureProfile():

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

Se você não precisar consultar se um perfil está disponível, eles poderão ser fornecidos diretamente pelo ID a um MediaCodec usando MediaFormat.KEY_PICTURE_PROFILE_INSTANCE.

Embora os perfis compatíveis possam variar de acordo com o dispositivo, considere fazer a correspondência com os seguintes IDs de perfil do sistema conhecidos:

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"