Android có các API cho phép ứng dụng điều chỉnh chế độ cài đặt hiển thị 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 tính năng này để đảm bảo rằng 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 hình khó chịu do quá trình chuyển đổi tốc độ khung hình. Hiện tượng này đặc biệt dễ thấy trong các cảnh quay chậm. Vì lý do này, hãy sử dụng API Surface.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.
So khớp hồ sơ hình ảnh ưu tiên
API MediaQuality trong Android 16 cho phép nhà phát triển kiểm soát hồ sơ hình ảnh.
Một số trường hợp ví dụ bao gồm:
- Đối với các bộ phim và chương trình truyền hình dài tập được xử lý bằng dải độ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 độ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 về màu sắc.
- Nhà phát triển trò chơi có thể yêu cầu hồ sơ có độ trễ thấp với khả năng 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 hồ sơ hình ảnh hệ thống
Trước khi chọn 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ả
hồ sơ hình ả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 không cần truy vấn xem hồ sơ có sẵn hay không, bạn có thể cung cấp trực tiếp hồ sơ 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 so khớp với các mã nhận dạng 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"