Android có các API cho phép ứng dụng điều chỉnh chế độ cài đặt màn hình trên phần cứng được hỗ trợ. Trên Android TV OS, các ứng dụng có thể tận dụng điều này để đảm bảo nội dung hiển thị ở định dạng tốt nhất có thể, bằng cách so khớp tốc độ khung hình và hồ sơ màu để mang lại trải nghiệm xem lý tưởng.
So khớp tốc độ khung hình của nội dung
Khi tốc độ khung hình của video không khớp với tốc độ làm mới của màn hình, người dùng có thể gặp phải hiện tượng giật chuyển động khó chịu do chuyển đổi tốc độ khung hình. Điều này đặc biệt dễ thấy trong các cảnh quay lia máy chậm. Vì lý do này, bạn cần sử dụng API SurfaceControl.Transaction.setFrameRate()
để thông báo cho khung về tốc độ khung hình của nội dung và báo hiệu xem nội dung video có đủ điều kiện để chuyển đổi tốc độ khung hình không liền mạch hay không.
Để biết thêm thông tin, hãy đọc hướng dẫn về tốc độ khung hình.
Ghép các chế độ hình ảnh ưu tiên
MediaQuality API trong Android 16 cho phép nhà phát triển kiểm soát các hồ sơ hình ảnh.
Một số trường hợp ví dụ bao gồm:
- Đối với những bộ phim và chương trình truyền hình được xử lý với dải tương phản động rộng hơn, nhà phát triển có thể yêu cầu Chế độ nhà làm phim để hiển thị chính xác nội dung theo ý định của nhà sáng tạo. Hồ sơ điện ảnh có độ chính xác về màu sắc cao hơn sẽ làm nổi bật các chi tiết tinh tế trong bóng tối để tăng độ sáng.
- Các sự kiện thể thao trực tiếp thường được xử lý bằng dải tương phản động hẹp và được xem vào ban ngày, có thể hưởng lợi từ một hồ sơ ưu tiên độ sáng hơn độ chính xác của màu sắc.
- Nhà phát triển trò chơi có thể yêu cầu một hồ sơ có độ trễ thấp với quy trình xử lý hình ảnh tối thiểu để người chơi có thể đạt được hiệu suất tốt nhất từ màn hình của họ.
Chọn một hồ sơ hình ảnh hệ thống
Trước khi chọn một hồ sơ hình ảnh, bạn cần xác thực rằng thiết bị hỗ trợ hồ sơ đó.
Đoạn mã sau đây cho biết cách sử dụng getAvailablePictureProfiles()
để truy vấn tất cả các hồ sơ ảnh được hỗ trợ và áp dụng hồ sơ thể thao:
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)
}
}
}
Để lấy một hồ sơ cụ thể theo tên, hãy sử dụng getPictureProfile()
:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.BAKLAVA) {
val profile = mediaQualityManager.getPictureProfile(
PictureProfile.TYPE_SYSTEM, NAME_SPORTS, null)
}
Nếu bạn không cần truy vấn xem một hồ sơ có sẵn hay không, thì các hồ sơ có thể được cung cấp trực tiếp theo mã nhận dạng cho MediaCodec bằng cách sử dụng MediaFormat.KEY_PICTURE_PROFILE_INSTANCE
.
Mặc dù các hồ sơ được hỗ trợ có thể khác nhau tuỳ theo thiết bị, nhưng bạn có thể cân nhắc việc so khớp với các mã hồ sơ hệ thống đã biết sau đây:
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"