Как настроить экран

В Android есть API, которые позволяют приложениям изменять настройки экрана на поддерживаемом оборудовании. В Android TV ОС приложения могут использовать эту функцию, чтобы контент отображался в наилучшем формате, соответствующем частоте кадров и цветовому профилю.

Использовать частоту кадров контента

Если частота кадров видео не совпадает с частотой обновления экрана, пользователи могут заметить неприятные артефакты, связанные с преобразованием частоты кадров. Особенно заметно это при медленной панораме. Поэтому используйте API Surface.setFrameRate, чтобы сообщить фреймворку о частоте кадров контента и указать, можно ли переключать частоту кадров без прерывания воспроизведения (seamless).

Подробнее о частоте кадров…

Соответствие профилям изображений

MediaQuality API в Android 16 позволяет разработчикам управлять профилями изображений.

Примеры сценариев:

  • Для фильмов и сериалов, которые были созданы с более широким динамическим диапазоном, разработчики могут запросить режим Filmmaker, чтобы контент отображался так, как задумал автор. Кинопрофиль с более точной цветопередачей позволяет увидеть детали в тенях, не увеличивая яркость.
  • Для спортивных трансляций, которые часто записываются с узким динамическим диапазоном и просматриваются при дневном свете, лучше подойдет профиль, в котором яркость важнее точности цветопередачи.
  • Разработчики игр могут запросить профиль с низкой задержкой и минимальной обработкой изображений, чтобы игроки могли получить максимальную производительность от своего дисплея.

Как выбрать системный профиль изображения

Прежде чем выбрать профиль изображения, убедитесь, что устройство его поддерживает.

Во фрагменте кода ниже показано, как использовать getAvailablePictureProfiles, чтобы запросить все поддерживаемые профили изображения и применить спортивный профиль:

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

Чтобы получить определенный профиль по названию, используйте следующий код: getPictureProfile

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

Если вам не нужно запрашивать, доступен ли профиль, его можно передать в MediaCodec напрямую по идентификатору с помощью MediaFormat.KEY_PICTURE_PROFILE_INSTANCE.

Поддерживаемые профили могут различаться в зависимости от устройства, но вы можете сопоставлять их со следующими известными идентификаторами системных профилей:

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"