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

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

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

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

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

Сопоставление предпочитаемых профилей изображений

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"