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

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

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

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

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

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

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

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

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

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

การนำไปปฏิบัติ

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

หากต้องการเพิ่มอุปกรณ์กล้องหลายตัวแบบลอจิคัลในด้าน HAL:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

ข้อควรพิจารณาด้านประสิทธิภาพและกำลัง

  • ผลงาน:

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

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

การปรับแต่ง

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

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

การตรวจสอบ

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

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

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

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

มีจำหน่ายทุกกล่องผ่านทาง 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_AWB_REGIONS ANDROID_CONTROL_AE_REGIONS ANDROID_CONTROL_AF_REGIONS ANDROID_STATISTICS_FACE_LANDMARKS ANDROID_STATISTICS_FACE_RECTANGLES สำหรับข้อมูลเพิ่มเติมเกี่ยวกับวิธีที่ 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 เพื่อให้คิวบัฟเฟอร์หนึ่งคิวถูกใช้เพื่อสำรองสองพื้นผิวที่หันเข้าหาแอป ซึ่งจะช่วยลดการใช้หน่วยความจำ