การรองรับกล้องหลายตัว

Android 9 ได้เปิดตัวการรองรับ API สำหรับอุปกรณ์ที่มีกล้องหลายตัว ผ่านอุปกรณ์กล้องตรรกะใหม่ที่ประกอบด้วยอุปกรณ์กล้องจริง 2 ตัวขึ้นไป ซึ่งชี้ไปในทิศทางเดียวกัน อุปกรณ์กล้องตรรกะจะแสดงเป็น CameraDevice/CaptureSession เดียวต่อแอป ซึ่งช่วยให้สามารถโต้ตอบกับฟีเจอร์กล้องหลายตัวที่ผสานรวมกับ HAL ได้ แอปสามารถเลือก เข้าถึงและควบคุมสตรีมกล้องจริง ข้อมูลเมตา และการควบคุมที่เกี่ยวข้องได้

การรองรับกล้องหลายตัว

รูปที่ 1 การรองรับกล้องหลายตัว

ในแผนภาพนี้ รหัสกล้องต่างๆ จะมีการกำหนดรหัสสี แอปสามารถ สตรีมบัฟเฟอร์ดิบจากกล้องจริงแต่ละตัวพร้อมกันได้ นอกจากนี้ยัง ตั้งค่าการควบคุมแยกกันและรับข้อมูลเมตาแยกกันจากกล้อง จริงที่แตกต่างกันได้ด้วย

ตัวอย่างและแหล่งที่มา

อุปกรณ์ที่มีกล้องหลายตัวต้องได้รับการโฆษณาโดยมีความสามารถของกล้องหลายตัวเชิงตรรกะ

ไคลเอ็นต์กล้องสามารถค้นหา Camera ID ของอุปกรณ์จริงที่ใช้สร้างกล้องตรรกะหนึ่งๆ ได้โดยการเรียกใช้ getPhysicalCameraIds() จากนั้นจะใช้รหัสที่แสดงเป็นส่วนหนึ่งของผลลัพธ์เพื่อควบคุมอุปกรณ์จริง ทีละเครื่องผ่าน setPhysicalCameraId() คุณสามารถค้นหาผลลัพธ์จากคำขอแต่ละรายการดังกล่าวได้จากผลลัพธ์ที่สมบูรณ์โดยเรียกใช้ getPhysicalCameraResults()

คำขอสำหรับกล้องจริงแต่ละรายการอาจรองรับพารามิเตอร์เพียงชุดย่อยที่จำกัดของ พารามิเตอร์ หากต้องการรับรายการพารามิเตอร์ที่รองรับ นักพัฒนาแอปสามารถเรียกใช้ getAvailablePhysicalCameraRequestKeys()

สตรีมกล้องจริงรองรับเฉพาะคำขอที่ไม่ต้องประมวลผลซ้ำ และรองรับเฉพาะเซ็นเซอร์ขาวดำและเซ็นเซอร์ Bayer

การใช้งาน

รายการตรวจสอบการสนับสนุน

วิธีเพิ่มอุปกรณ์กล้องหลายตัวแบบตรรกะในฝั่ง HAL

  • เพิ่มความสามารถ ANDROID_REQUEST_AVAILABLE_CAPABILITIES_LOGICAL_MULTI_CAMERA สำหรับอุปกรณ์กล้องตรรกะที่รองรับโดยกล้องจริง 2 ตัวขึ้นไป ซึ่งแสดงต่อแอปด้วย
  • ป้อนข้อมูลในช่องข้อมูลเมตาของANDROID_LOGICAL_MULTI_CAMERA_PHYSICAL_IDS ANDROID_LOGICAL_MULTI_CAMERA_PHYSICAL_IDS แบบคงที่ด้วยรายการรหัสกล้องจริง
  • ป้อนข้อมูลเมตาแบบคงที่ที่เกี่ยวข้องกับความลึกซึ่งจำเป็นต่อการเชื่อมโยงระหว่างพิกเซลของสตรีมกล้องจริง ANDROID_LENS_POSE_ROTATION ANDROID_LENS_POSE_TRANSLATION ANDROID_LENS_INTRINSIC_CALIBRATION ANDROID_LENS_DISTORTION ANDROID_LENS_POSE_REFERENCE
  • ตั้งค่าฟิลด์ข้อมูลเมตาแบบคงที่ ANDROID_LOGICAL_MULTI_CAMERA_SENSOR_SYNC_TYPE เป็น

  • ป้อนข้อมูล ANDROID_REQUEST_AVAILABLE_PHYSICAL_CAMERA_REQUEST_KEYS ด้วยรายการพารามิเตอร์ที่รองรับสำหรับกล้องจริงแต่ละตัว รายการนี้อาจว่างเปล่าหากอุปกรณ์ตรรกะไม่รองรับคำขอแต่ละรายการ

  • หากระบบรองรับคำขอแต่ละรายการ ให้ประมวลผลและใช้physicalCameraSettingsแต่ละรายการ ซึ่งอาจมาพร้อมกับคำขอจับภาพ แล้วต่อท้ายphysicalCameraMetadataแต่ละรายการ ตามนั้น

  • สำหรับอุปกรณ์ Camera HAL เวอร์ชัน 3.5 (เปิดตัวใน Android 10) ขึ้นไป ให้ป้อนคีย์ผลลัพธ์ ANDROID_LOGICAL_MULTI_CAMERA_ACTIVE_PHYSICAL_ID โดยใช้รหัสของกล้องจริงที่ใช้งานอยู่ปัจจุบันซึ่งรองรับกล้อง ตรรกะ

สำหรับอุปกรณ์ที่ใช้ Android 9 อุปกรณ์กล้องต้อง รองรับการแทนที่สตรีม YUV/RAW เชิงตรรกะด้วยสตรีมจริงที่มี ขนาดเดียวกัน (ใช้ไม่ได้กับสตรีม RAW) และรูปแบบเดียวกันจากกล้องจริง 2 ตัว การตั้งค่านี้ไม่มีผลกับอุปกรณ์ที่ใช้ Android 10

สำหรับอุปกรณ์ที่ใช้ Android 10 ซึ่งมี เวอร์ชันอุปกรณ์ HAL ของกล้องเป็น 3.5 ขึ้นไป อุปกรณ์กล้องต้องรองรับ isStreamCombinationSupported เพื่อให้แอปค้นหาได้ว่าระบบรองรับการผสมสตรีมที่เฉพาะเจาะจงซึ่งมี สตรีมจริงหรือไม่

แผนที่การกำหนดค่าสตรีม

สำหรับกล้องตรรกะ ชุดสตรีมที่จำเป็นสำหรับอุปกรณ์กล้องที่มี ฮาร์ดแวร์ระดับหนึ่งจะเหมือนกับที่กำหนดไว้ใน CameraDevice.createCaptureSession สตรีมทั้งหมดในแผนที่การกำหนดค่าสตรีมต้องเป็นสตรีมเชิงตรรกะ

สำหรับอุปกรณ์กล้องตรรกะที่รองรับความสามารถ RAW ที่มีกล้องย่อยจริง ขนาดต่างๆ หากแอปกำหนดค่าสตรีม RAW ตรรกะ อุปกรณ์กล้องตรรกะต้องไม่เปลี่ยนไปใช้กล้องย่อยจริงที่มี ขนาดเซ็นเซอร์แตกต่างกัน วิธีนี้ช่วยให้มั่นใจได้ว่าแอปจับภาพ RAW ที่มีอยู่จะไม่ขัดข้อง

หากต้องการใช้ประโยชน์จากออปติคอลซูมที่ใช้ HAL โดยการสลับระหว่าง กล้องย่อยจริงขณะถ่ายภาพ RAW แอปจะต้อง กำหนดค่าสตรีมกล้องย่อยจริงแทนสตรีม RAW เชิงตรรกะ

การรวมสตรีมที่รับประกัน

ทั้งกล้องเชิงตรรกะและกล้องจริงพื้นฐานต้องรับประกันชุดสตรีมที่จำเป็น ซึ่งจำเป็นสำหรับระดับอุปกรณ์ของกล้อง

อุปกรณ์กล้องแบบตรรกะควรทำงานในลักษณะเดียวกับอุปกรณ์กล้องจริง โดยอิงตามระดับและความสามารถของฮาร์ดแวร์ เราขอแนะนำให้ชุดฟีเจอร์ของกล้องเสมือนเป็นซูเปอร์เซ็ตของกล้องจริงแต่ละตัว

ในอุปกรณ์ที่ใช้ Android 9 กล้องตรรกะต้องรองรับการทำงานต่อไปนี้สำหรับชุดสตรีมที่รับประกันแต่ละชุด

  • แทนที่สตรีม YUV_420_888 หรือสตรีมดิบเชิงตรรกะ 1 รายการด้วยสตรีมจริง 2 รายการที่มี ขนาดและรูปแบบเดียวกัน โดยแต่ละรายการมาจากกล้องจริงแยกกัน โดยมีเงื่อนไขว่า กล้องจริงรองรับขนาดและรูปแบบดังกล่าว

  • เพิ่มสตรีม RAW 2 รายการ รายการละ 1 รายการจากกล้องจริงแต่ละตัว หากกล้องตรรกะ ไม่ได้โฆษณาความสามารถ RAW แต่กล้องจริงพื้นฐานทำได้ โดยปกติแล้วกรณีนี้จะเกิดขึ้นเมื่อกล้องจริงมีขนาดเซ็นเซอร์ต่างกัน

  • การใช้สตรีมจริงแทนสตรีมเชิงตรรกะที่มีขนาดและ รูปแบบเดียวกัน ซึ่งต้องไม่ทำให้อัตราเฟรมของการจับภาพช้าลงเมื่อระยะเวลาเฟรมขั้นต่ำของสตรีมจริงและสตรีมเชิงตรรกะเหมือนกัน

ข้อควรพิจารณาเกี่ยวกับประสิทธิภาพและกำลัง

  • ประสิทธิภาพ

    • การกำหนดค่าและสตรีมสตรีมจริงอาจทำให้ อัตราการจับภาพของกล้องตรรกะช้าลงเนื่องจากข้อจำกัดด้านทรัพยากร
    • การใช้การตั้งค่ากล้องจริงอาจทำให้อัตราการจับภาพช้าลงหาก กล้องพื้นฐานถูกตั้งค่าเป็นอัตราเฟรมที่แตกต่างกัน
  • กำลังไฟฟ้า:

    • การเพิ่มประสิทธิภาพพลังงานของ HAL จะยังคงทำงานในกรณีเริ่มต้น
    • การกำหนดค่าหรือการขอสตรีมจริงอาจลบล้างการเพิ่มประสิทธิภาพพลังงานภายในของ HAL และทำให้ใช้พลังงานมากขึ้น

การปรับแต่ง

คุณปรับแต่งการใช้งานอุปกรณ์ได้ด้วยวิธีต่อไปนี้

  • เอาต์พุตที่ผสานของอุปกรณ์กล้องตรรกะขึ้นอยู่กับการใช้งาน HAL ทั้งหมด การตัดสินใจเกี่ยวกับวิธีที่สตรีมตรรกะที่ผสานรวมได้มาจากกล้องจริงนั้นเป็นแบบโปร่งใสสำหรับแอปและเฟรมเวิร์กกล้องของ Android
  • ระบบอาจรองรับคำขอและผลลัพธ์ทางกายภาพแต่ละรายการโดยไม่บังคับ ชุดพารามิเตอร์ที่ใช้ได้ในคำขอดังกล่าวขึ้นอยู่กับการใช้งาน HAL ที่เฉพาะเจาะจงด้วย
  • ตั้งแต่ Android 10 เป็นต้นไป HAL สามารถลดจำนวนกล้องที่แอปเปิดได้โดยตรงด้วยการเลือกที่จะไม่โฆษณา PHYSICAL_ID บางส่วนหรือทั้งหมดใน getCameraIdList จากนั้นการเรียกใช้ getPhysicalCameraCharacteristics ต้องแสดงลักษณะของกล้องจริง

การตรวจสอบความถูกต้อง

อุปกรณ์แบบหลายกล้องเชิงตรรกะต้องผ่าน CTS ของกล้องเช่นเดียวกับกล้องทั่วไปอื่นๆ คุณดูกรณีทดสอบที่กำหนดเป้าหมายอุปกรณ์ประเภทนี้ได้ในโมดูล LogicalCameraDeviceTest

การทดสอบ ITS ทั้ง 3 รายการนี้มุ่งเป้าไปที่ระบบกล้องหลายตัวเพื่อช่วยให้ผสานรวมรูปภาพได้อย่างเหมาะสม

การทดสอบฉากที่ 1 และฉากที่ 4 จะทำงานร่วมกับอุปกรณ์ทดสอบ ITS-in-a-box การทดสอบ test_multi_camera_match ยืนยันว่าความสว่างของ กึ่งกลางของรูปภาพจะตรงกันเมื่อเปิดใช้กล้องทั้ง 2 ตัว test_multi_camera_alignment การทดสอบยืนยันว่ามีการโหลดพารามิเตอร์ระยะห่าง การวางแนว และการบิดเบือนของกล้องอย่างถูกต้อง หากระบบกล้องหลายตัว มีกล้องที่มี FoV กว้าง (>90o) คุณจะต้องใช้ ITS Box เวอร์ชัน rev2

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

กล่องทั้งหมดมีจำหน่ายผ่าน AcuSpec, Inc. (www.acuspecinc.com, fred@acuspecinc.com) และ MYWAY Manufacturing (www.myway.tw, sales@myway.tw) นอกจากนี้ คุณยังซื้อกล่อง ITS rev1 ผ่าน West-Mark ได้ด้วย (www.west-mark.com, dgoodman@west-mark.com)

แนวทางปฏิบัติแนะนำ

หากต้องการใช้ประโยชน์จากฟีเจอร์ที่เปิดใช้โดยกล้องหลายตัวอย่างเต็มที่ในขณะที่ยังคง ความเข้ากันได้ของแอป ให้ทําตามแนวทางปฏิบัติแนะนําต่อไปนี้เมื่อติดตั้งใช้งานอุปกรณ์ กล้องหลายตัวเชิงตรรกะ

  • (Android 10 ขึ้นไป) ซ่อนกล้องย่อยจริงจาก getCameraIdList ซึ่งจะช่วยลดจำนวนกล้องที่แอปเปิดได้โดยตรง ทำให้แอปไม่จำเป็นต้องมีตรรกะการเลือกกล้องที่ซับซ้อน
  • (Android 11 ขึ้นไป) สำหรับอุปกรณ์กล้องหลายตัวแบบตรรกะ ที่รองรับการซูมแบบออปติคัล ให้ใช้ API ANDROID_CONTROL_ZOOM_RATIO และใช้ ANDROID_SCALER_CROP_REGION สำหรับการครอบตัดสัดส่วนภาพเท่านั้น ANDROID_CONTROL_ZOOM_RATIO ช่วยให้อุปกรณ์ซูมออกและรักษาความแม่นยำได้ดีขึ้น ในกรณีนี้ HAL ต้องปรับระบบพิกัดของ ANDROID_SCALER_CROP_REGION ANDROID_CONTROL_AE_REGIONS ANDROID_CONTROL_AWB_REGIONS ANDROID_CONTROL_AF_REGIONS ANDROID_STATISTICS_FACE_RECTANGLES และ ANDROID_STATISTICS_FACE_LANDMARKS เพื่อให้ถือว่าฟิลด์หลังการซูม ของมุมมองเป็นอาร์เรย์ที่ใช้งานอยู่ของเซ็นเซอร์ ดูข้อมูลเพิ่มเติมเกี่ยวกับวิธีที่ ANDROID_SCALER_CROP_REGION ทำงานร่วมกับ ANDROID_CONTROL_ZOOM_RATIO ได้ที่ camera3_crop_reprocess#cropping
  • สำหรับอุปกรณ์ที่มีกล้องหลายตัวซึ่งมีกล้องจริงที่มีความสามารถแตกต่างกัน โปรดตรวจสอบว่าอุปกรณ์ประกาศการรองรับค่าหรือช่วงที่แน่นอนสำหรับการควบคุมเฉพาะในกรณีที่ช่วงการซูมทั้งหมดรองรับค่าหรือช่วงนั้น ตัวอย่างเช่น หากกล้องตรรกะประกอบด้วยกล้องอัลตราไวด์ กล้องไวด์ และกล้องเทเลโฟโต้ ให้ทำดังนี้
    • หากขนาดอาร์เรย์ที่ใช้งานของกล้องจริงแตกต่างกัน HAL ของกล้องต้องทำการแมปจากอาร์เรย์ที่ใช้งานของกล้องจริงไปยัง อาร์เรย์ที่ใช้งานของกล้องตรรกะสำหรับ ANDROID_SCALER_CROP_REGION ANDROID_CONTROL_AE_REGIONS ANDROID_CONTROL_AWB_REGIONS ANDROID_CONTROL_AF_REGIONS ANDROID_STATISTICS_FACE_RECTANGLES และ ANDROID_STATISTICS_FACE_LANDMARKS เพื่อให้จากมุมมองของแอป ระบบพิกัดเป็นขนาดอาร์เรย์ที่ใช้งานของกล้องตรรกะ
    • หากกล้องไวด์และกล้องเทเลโฟโต้รองรับระบบโฟกัสอัตโนมัติ แต่กล้องอัลตราไวด์เป็นโฟกัสคงที่ ให้ตรวจสอบว่ากล้องตรรกะประกาศการรองรับระบบโฟกัสอัตโนมัติ HAL ต้องจำลองเครื่องสถานะโฟกัสอัตโนมัติสำหรับกล้องภาพมุมกว้างพิเศษ เพื่อให้เมื่อแอปซูมออกไปยังเลนส์ภาพมุมกว้างพิเศษ แอปจะรับรู้ว่า กล้องจริงที่อยู่เบื้องหลังเป็นแบบโฟกัสคงที่ และเครื่องสถานะโฟกัสอัตโนมัติสำหรับโหมด AF ที่รองรับจะทำงานตามที่คาดไว้
    • หากกล้องมุมกว้างและกล้องเทเลโฟโต้รองรับ 4K @ 60 FPS และกล้อง อัลตร้าไวด์รองรับเฉพาะ 4K @ 30 FPS หรือ 1080p @ 60 FPS แต่ ไม่รองรับ 4K @ 60 FPS โปรดตรวจสอบว่ากล้องตรรกะไม่ได้โฆษณา 4K @ 60 FPS ในการกำหนดค่าสตรีมที่รองรับ ซึ่งจะรับประกัน ความสมบูรณ์ของความสามารถของกล้องเชิงตรรกะ เพื่อให้มั่นใจว่าแอปจะไม่ พบปัญหาในการบันทึกที่ความละเอียด 4k @ 60 fps ที่ ANDROID_CONTROL_ZOOM_RATIO ค่าต่ำกว่า 1
  • ตั้งแต่ Android 10 เป็นต้นไป คุณไม่จำเป็นต้องใช้กล้องหลายตัวแบบตรรกะ เพื่อรองรับการผสมผสานสตรีมที่มีสตรีมจริง หาก HAL รองรับการรวมกับสตรีมจริง ให้ทำดังนี้
    • (Android 11 ขึ้นไป) เพื่อจัดการ Use Case ได้ดียิ่งขึ้น เช่น ความลึกจากสเตอริโอและการติดตามการเคลื่อนไหว ให้กำหนด Field of View ของเอาต์พุตสตรีมจริงให้ใหญ่ที่สุดเท่าที่ฮาร์ดแวร์จะทำได้ อย่างไรก็ตาม หากสตรีมจริงและสตรีมเชิงตรรกะมาจากกล้องจริงเดียวกัน ข้อจำกัดของฮาร์ดแวร์อาจบังคับให้ฟิลด์ของมุมมองของสตรีมจริงเหมือนกับสตรีมเชิงตรรกะ
    • หากต้องการแก้ไขปัญหาหน่วยความจำเต็มที่เกิดจากสตรีมจริงหลายรายการ โปรดตรวจสอบว่าแอปใช้ discardFreeBuffers เพื่อยกเลิกการจัดสรรบัฟเฟอร์ว่าง (บัฟเฟอร์ที่ผู้บริโภคปล่อย แต่ผู้ผลิตยังไม่ได้นำออกจากคิว) หากคาดว่าสตรีมจริงจะ ไม่ได้ใช้งานเป็นระยะเวลาหนึ่ง
    • หากโดยปกติแล้วสตรีมจริงจากกล้องจริงที่แตกต่างกันไม่ได้ แนบมากับคำขอเดียวกัน โปรดตรวจสอบว่าแอปใช้ surface group เพื่อให้ใช้คิวบัฟเฟอร์เดียวเพื่อสำรองข้อมูลพื้นผิวที่หันหน้าไปทางแอป 2 รายการ ซึ่งจะช่วยลดการใช้หน่วยความจำ