Android bao gồm 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 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 chuyển động khó chịu do quá trình chuyển đổi tốc độ khung hình. Điều này đặc biệt rõ ràng trong các cảnh quay kéo chậm. Vì lý do này, điều quan trọng là bạn phải 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 liệu 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 các 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 được xử lý với 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 như nhà sáng tạo dự định. Chế độ xem điện ảnh có độ chính xác về màu sắc cao hơn, làm nổi bật các chi tiết tinh tế trong bóng tối thay vì tăng độ sáng.
- Các sự kiện thể thao trực tiếp thường được xử lý với 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 là độ chính xác màu.
- Nhà phát triển trò chơi có thể yêu cầu hồ sơ có độ trễ thấp với mức 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.
Chọn hồ sơ hình ảnh hệ thống
Trước khi chọn một hồ sơ hình ảnh, trước tiên, 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 bạn không cần truy vấn xem có hồ sơ hay không, thì hồ sơ có thể được cung cấp trực tiếp bằng mã nhận dạng của hồ sơ cho MediaCodec bằng cách sử dụng MediaFormat.KEY_PICTURE_PROFILE_INSTANCE
.
Mặc dù 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ã 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"