ปรับการตั้งค่าการแสดงผล

Android มี API ที่อนุญาตให้แอปปรับการตั้งค่าการแสดงผลในฮาร์ดแวร์ที่รองรับ ในระบบปฏิบัติการ Android TV แอปสามารถใช้ประโยชน์จากฟีเจอร์นี้เพื่อให้มั่นใจว่า เนื้อหาจะแสดงในรูปแบบที่ดีที่สุดด้วยการจับคู่เฟรมเรตและ โปรไฟล์สีเพื่อประสบการณ์การรับชมที่เหมาะสม

จับคู่อัตราเฟรมของเนื้อหา

เมื่ออัตราเฟรมของวิดีโอไม่ตรงกับอัตราการรีเฟรชของจอแสดงผล ผู้ใช้อาจพบอาร์ติแฟกต์การกระตุกที่ไม่พึงประสงค์จากการแปลงอัตราเฟรม โดยจะเห็นได้ชัดเจนเป็นพิเศษในฉากที่แพนกล้องช้าๆ ด้วยเหตุนี้ คุณจึงควรใช้ API SurfaceControl.Transaction.setFrameRate() เพื่อแจ้งให้เฟรมเวิร์กทราบเกี่ยวกับอัตราเฟรมของเนื้อหาและเพื่อส่งสัญญาณว่าเนื้อหาวิดีโอมีสิทธิ์สำหรับการสลับอัตราเฟรมแบบไม่ราบรื่นหรือไม่

ดูข้อมูลเพิ่มเติมได้ที่คู่มืออัตราเฟรม

จับคู่โปรไฟล์รูปภาพที่ต้องการ

MediaQuality API ใน Android 16 ช่วยให้นักพัฒนาแอปควบคุม โปรไฟล์รูปภาพได้

ตัวอย่างสถานการณ์มีดังนี้

  • สำหรับภาพยนตร์และรายการทีวีที่มาสเตอร์ด้วยช่วงไดนามิกที่กว้างขึ้น นักพัฒนาแอปอาจขอโหมดผู้สร้างภาพยนตร์เพื่อแสดงเนื้อหาอย่างถูกต้องตามที่ ครีเอเตอร์ต้องการให้แสดง โปรไฟล์ภาพยนตร์ที่มีความแม่นยำของสีสูงขึ้น จะดึงรายละเอียดเล็กๆ น้อยๆ ในเงาออกมาแทนที่จะเพิ่มความสว่าง
  • การแข่งขันกีฬาแบบสดซึ่งมักจะมีการปรับแต่งด้วยช่วงไดนามิกแคบๆ และรับชมในเวลากลางวันจะได้รับประโยชน์จากโปรไฟล์ที่ให้ความสำคัญกับความสว่างมากกว่าความแม่นยำของสี
  • นักพัฒนาเกมสามารถขอโปรไฟล์เวลาในการตอบสนองต่ำที่มีการประมวลผลรูปภาพน้อยที่สุด เพื่อให้ผู้เล่นได้รับประสิทธิภาพที่ดีที่สุดจากจอแสดงผล

การเลือกโปรไฟล์รูปภาพของระบบ

ก่อนเลือกโปรไฟล์รูปภาพ คุณควรตรวจสอบก่อนว่าอุปกรณ์รองรับโปรไฟล์ดังกล่าวหรือไม่

ข้อมูลโค้ดต่อไปนี้แสดงวิธีใช้ 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)
}

หากไม่จำเป็นต้องค้นหาว่ามีโปรไฟล์หรือไม่ คุณสามารถระบุโปรไฟล์โดยใช้รหัสของโปรไฟล์นั้นๆ ให้กับ MediaCodec ได้โดยตรงโดยใช้ MediaFormat.KEY_PICTURE_PROFILE_INSTANCE

แม้ว่าโปรไฟล์ที่รองรับอาจแตกต่างกันไปตามอุปกรณ์ แต่คุณอาจพิจารณาจับคู่กับรหัสโปรไฟล์ระบบที่ทราบต่อไปนี้

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"