Android 包含一些 API,可让应用调整受支持硬件上的显示设置。在 Android TV OS 上,应用可以利用这一点,通过匹配帧速率和色彩配置文件来确保内容以最佳格式显示,从而提供理想的观看体验。
匹配内容帧速率
如果视频的帧速率与显示屏的刷新率不匹配,用户可能会因帧速率转换而遇到令人不快的运动抖动伪影。在慢速平移拍摄期间,这种情况尤为明显。因此,请务必使用 SurfaceControl.Transaction.setFrameRate()
API 通知框架内容的帧速率,并指明视频内容是否符合非流畅帧速率切换的条件。
如需了解详情,请参阅帧速率指南。
匹配首选图片配置文件
借助 Android 16 中的 MediaQuality API,开发者可以控制图片配置文件。
以下是一些示例场景:
- 对于采用更宽动态范围进行母版制作的电影和电视连续剧,开发者可以请求使用电影人模式,以准确显示创作者预期的内容呈现效果。色彩准确度更高的影院配置文件会突出显示阴影中的细节,而不是提高亮度。
- 体育赛事直播通常采用较窄的动态范围进行母版制作,并且是在白天观看,因此采用将亮度置于颜色准确性之上的配置文件会很有帮助。
- 游戏开发者可以请求使用低延迟配置文件,以尽可能减少图片处理,让玩家能够获得最佳显示效果。
选择系统图片配置文件
在选择图片配置文件之前,请务必先验证设备是否支持该配置文件。
以下代码段展示了如何使用 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"