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

Android 9 เปิดตัวการรองรับ API สำหรับกล้องหลายตัว ผ่านอุปกรณ์กล้องลอจิคัลใหม่ที่ประกอบด้วยอุปกรณ์ทางกายภาพสองเครื่องขึ้นไป อุปกรณ์กล้องที่ชี้ไปยังทิศทางเดียวกัน อุปกรณ์กล้องแบบลอจิคัลคือ เป็น 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 ตามนั้น

  • สำหรับอุปกรณ์ 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 เชิงตรรกะหรือสตรีมดิบหนึ่งรายการด้วยสตรีมทางกายภาพสองสตรีมของ มีขนาดและรูปแบบเดียวกัน โดยแต่ละกล้องเป็นกล้องจริงที่แยกกัน ขนาดและรูปแบบที่กล้องจริงรองรับ

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

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

การพิจารณาประสิทธิภาพและพลังงาน

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

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

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

การปรับแต่ง

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

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

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

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

การทดสอบ ITS ทั้งสามนี้มุ่งเป้าไปที่ระบบกล้องหลายตัวเพื่ออำนวยความสะดวก การนำรูปภาพมารวมเข้าด้วยกัน:

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

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

กล่องทั้งหมดมีให้บริการใน AcuSpec, Inc. (www.acuspecinc.com fred@acuspecinc.com) และ MYWAY การผลิต (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 แพลตฟอร์มที่แสดงแอป ซึ่งช่วยลดการใช้หน่วยความจำ