В 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"