В Android есть API, позволяющие приложениям настраивать параметры отображения на поддерживаемом оборудовании. В ОС Android TV приложения могут воспользоваться этим, чтобы обеспечить отображение контента в наилучшем возможном формате, подбирая частоту кадров и цветовой профиль для идеального просмотра.
Соответствие частоты кадров контента
Когда частота кадров видео не соответствует частоте обновления дисплея, пользователи могут столкнуться с неприятными артефактами дрожания движения, вызванными преобразованием частоты кадров. Это особенно заметно при медленном панорамировании. Поэтому важно использовать API SurfaceControl.Transaction.setFrameRate()
чтобы уведомить фреймворк о частоте кадров контента и сообщить, подходит ли видеоконтент для неплавного переключения частоты кадров .
Более подробную информацию можно найти в руководстве по частоте кадров .
Сопоставьте предпочтительные профили изображений
API MediaQuality в Android 16 позволяет разработчикам контролировать профили изображений.
Вот некоторые примеры сценариев:
- Для фильмов и сериалов, созданных с использованием более широкого динамического диапазона, разработчики могут запросить режим «Кинорежиссер», чтобы точно отображать контент в том виде, в котором его задумал создатель. Кинопрофиль с более высокой точностью цветопередачи выявляет тонкие детали в тенях и повышает яркость.
- Прямые трансляции спортивных мероприятий, которые часто снимаются в узком динамическом диапазоне и просматриваются при дневном свете, могут выиграть от использования профиля, в котором предпочтение отдается яркости, а не точности цветопередачи.
- Разработчики игр могут запросить профиль с низкой задержкой и минимальной обработкой изображений, чтобы игроки могли получить максимальную производительность от своего дисплея.
Выбор профиля системного изображения
Перед выбором профиля изображения важно убедиться, что устройство его поддерживает.
В следующем фрагменте показано, как использовать 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"