Android에는 앱이 지원되는 하드웨어에서 디스플레이 설정을 조정할 수 있는 API가 포함되어 있습니다. Android TV OS에서 앱은 이를 활용하여 이상적인 시청 환경을 위해 프레임 속도와 색상 프로필을 일치시켜 콘텐츠가 최적의 형식으로 표시되도록 할 수 있습니다.
콘텐츠 프레임 속도 일치시키기
동영상의 프레임 속도가 디스플레이의 새로고침 빈도와 일치하지 않으면 사용자는 프레임 속도 변환으로 인해 불쾌한 모션 저더 아티팩트를 경험할 수 있습니다. 이는 특히 느린 패닝 샷에서 잘 보입니다. 이러한 이유로 SurfaceControl.Transaction.setFrameRate()
API를 사용하여 콘텐츠의 프레임 속도를 프레임워크에 알리고 동영상 콘텐츠가 원활하지 않은 프레임 속도 전환에 적합한지 신호로 알려야 합니다.
자세한 내용은 프레임 속도 가이드를 참고하세요.
선호하는 사진 프로필 일치
Android 16의 MediaQuality API를 사용하면 개발자가 사진 프로필을 제어할 수 있습니다.
다음은 몇 가지 시나리오의 예입니다.
- 더 넓은 다이내믹 레인지로 마스터링된 영화와 TV 시리즈의 경우 개발자는 콘텐츠가 제작자가 의도한 대로 정확하게 표시되도록 필름 제작자 모드를 요청할 수 있습니다. 색상 정확도가 높은 영화 프로필은 밝기를 높이는 대신 그림자의 미묘한 디테일을 강조합니다.
- 좁은 동적 범위로 마스터링되고 대낮에 시청하는 경우가 많은 라이브 스포츠 이벤트는 색상 정확도보다 밝기를 우선하는 프로필의 이점을 누릴 수 있습니다.
- 게임 개발자는 최소한의 이미지 처리로 짧은 지연 시간 프로필을 요청하여 플레이어가 디스플레이에서 최고의 성능을 얻을 수 있습니다.
시스템 사진 프로필 선택
사진 프로필을 선택하기 전에 먼저 기기에서 지원하는지 확인하는 것이 중요합니다.
다음 스니펫은 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)
}
프로필이 사용 가능한지 쿼리할 필요가 없는 경우 MediaFormat.KEY_PICTURE_PROFILE_INSTANCE
를 사용하여 ID별로 프로필을 MediaCodec에 직접 제공할 수 있습니다.
지원되는 프로필은 기기마다 다를 수 있지만 다음 알려진 시스템 프로필 ID와 일치시키는 것이 좋습니다.
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"