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 o frame rate e o perfil de cores para uma experiência de visualização ideal.
Usar o mesmo frame rate do conteúdo
Quando o frame rate 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 da conversão de frame rate. Isso é especialmente visível durante fotos panorâmicas lentas. Por esse
motivo, use a API Surface.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 frame rate.
Usar os perfis de imagem preferidos
A API MediaQuality no Android 16 permite que os desenvolvedores controlem os perfis de imagem.
Alguns cenários de exemplo:
- Para filmes e séries de TV que são masterizados com um intervalo dinâmico mais amplo, os desenvolvedores podem solicitar o modo Filmmaker 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, favorecendo o aumento do 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 de cores.
- Os desenvolvedores de jogos podem solicitar um perfil de baixa latência com processamento mínimo de imagens para que os jogadores tenham o melhor desempenho na tela.
Selecionar um perfil de imagem do sistema
Antes de selecionar um perfil de imagem, é importante validar se o dispositivo oferece suporte a ele.
O snippet a seguir mostra como usar
getAvailablePictureProfiles para consultar todos os
perfis de imagem compatíveis e aplicar um perfil esportivo:
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 a correspondência com os seguintes IDs de perfil de 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"