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

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

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

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

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

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

อุปกรณ์ที่มีกล้องหลายตัวต้องโฆษณาด้วยความสามารถในการใช้กล้องหลายตัวอย่างมีเหตุผล

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

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

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

การใช้งาน

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

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

  • เพิ่มความสามารถของ ANDROID_REQUEST_AVAILABLE_CAPABILITIES_LOGICAL_MULTI_CAMERA สำหรับอุปกรณ์กล้องแบบลอจิคัลที่สนับสนุนโดยกล้องจริง 2 ตัวขึ้นไปซึ่งมองเห็นแอปได้เช่นกัน
  • ป้อนข้อมูลในช่องข้อมูลเมตาแบบคงที่ 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 เชิงตรรกะ 1 รายการด้วยสตรีมจริงขนาดเดียวกัน (ใช้ไม่ได้กับสตรีม RAW) และรูปแบบเดียวกันจากกล้องจริง 2 ตัว การดำเนินการนี้ไม่มีผลกับอุปกรณ์ที่ใช้ Android 10

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

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

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

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

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

ชุดค่าผสมสตรีมที่รับประกัน

ทั้งกล้องเชิงตรรกะและกล้องจริงที่เกี่ยวข้องต้องรับประกันการผสมผสานสตรีมที่จำเป็นสำหรับระดับอุปกรณ์

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

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

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

  • เพิ่มสตรีมดิบ 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 เวอร์ชัน 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 ขึ้นไป) สำหรับอุปกรณ์ที่มีกล้องหลายตัวแบบตรรกะซึ่งรองรับการซูมแบบออปติคอล ให้ใช้ ANDROID_CONTROL_ZOOM_RATIO API และใช้ 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 ขึ้นไป) หากต้องการจัดการกรณีการใช้งานต่างๆ เช่น ความลึกจากภาพสเตอริโอและการติดตามการเคลื่อนไหวได้ดียิ่งขึ้น ให้ปรับมุมมองของเอาต์พุตสตรีมจริงให้กว้างที่สุดเท่าที่ฮาร์ดแวร์จะทำได้ อย่างไรก็ตาม หากสตรีมทางกายภาพและสตรีมเชิงตรรกะมาจากกล้องจริงตัวเดียวกัน ข้อจำกัดของฮาร์ดแวร์อาจบังคับให้ขอบเขตการมองเห็นของสตรีมทางกายภาพเหมือนกับสตรีมเชิงตรรกะ
    • หากต้องการจัดการกับแรงกดดันของหน่วยความจำที่เกิดจากสตรีมทางกายภาพหลายรายการ ให้ตรวจสอบว่าแอปใช้ discardFreeBuffers ในการจัดการบัฟเฟอร์ว่าง (บัฟเฟอร์ที่ผู้บริโภคปล่อยออกมา แต่ยังไม่มีการยกเลิกคิวโดยผู้ผลิต) ในกรณีที่คาดว่าสตรีมทางกายภาพจะไม่มีการใช้งานเป็นระยะเวลาหนึ่ง
    • หากสตรีมจากกล้องจริงที่ต่างกันไม่ได้แนบมากับคำขอเดียวกันโดยปกติ ให้ตรวจสอบว่าแอปใช้ surface group เพื่อใช้คิวบัฟเฟอร์ 1 คิวเพื่อรองรับแพลตฟอร์มที่แสดงต่อแอป 2 แพลตฟอร์ม ซึ่งจะช่วยลดการใช้หน่วยความจำ