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_LOGICAL_MULTI_CAMERA_SENSOR_SYNC_TYPE_APPROXIMATE
: สำหรับเซ็นเซอร์ในโหมดหลัก-หลัก ไม่มีการซิงค์ชัตเตอร์/การเปิดรับแสงของฮาร์ดแวร์ANDROID_LOGICAL_MULTI_CAMERA_SENSOR_SYNC_TYPE_CALIBRATED
: สำหรับเซ็นเซอร์ในโหมดหลักรอง ให้ซิงค์ชัตเตอร์/การเปิดรับแสงของฮาร์ดแวร์
ป้อนข้อมูล
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 รายการนี้มุ่งเป้าไปที่ระบบกล้องหลายตัวเพื่ออำนวยความสะดวกในการผสานภาพอย่างเหมาะสม
scene1/test_multi_camera_match.py
scene4/test_multi_camera_alignment.py
sensor_fusion/test_multi_camera_frame_sync.py
การทดสอบฉากที่ 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
- หากขนาดอาร์เรย์ที่ใช้งานอยู่ของกล้องจริงแตกต่างกัน HAL ของกล้องต้องทำการแมปจากอาร์เรย์ที่ใช้งานอยู่ของกล้องจริงไปยังอาร์เรย์ที่ใช้งานอยู่ของกล้องเสมือนสำหรับ
- ตั้งแต่ Android 10 เป็นต้นไป ไม่จำเป็นต้องใช้กล้องหลายตัวแบบตรรกะเพื่อรองรับการผสมผสานสตรีมที่มีสตรีมจริง
หาก HAL รองรับการใช้ร่วมกับสตรีมกายภาพ
- (Android 11 ขึ้นไป) หากต้องการจัดการกรณีการใช้งานต่างๆ เช่น ความลึกจากภาพสเตอริโอและการติดตามการเคลื่อนไหวได้ดียิ่งขึ้น ให้ปรับมุมมองของเอาต์พุตสตรีมจริงให้กว้างที่สุดเท่าที่ฮาร์ดแวร์จะทำได้ อย่างไรก็ตาม หากสตรีมทางกายภาพและสตรีมเชิงตรรกะมาจากกล้องจริงตัวเดียวกัน ข้อจำกัดของฮาร์ดแวร์อาจบังคับให้ขอบเขตการมองเห็นของสตรีมทางกายภาพเหมือนกับสตรีมเชิงตรรกะ
- หากต้องการจัดการกับแรงกดดันของหน่วยความจำที่เกิดจากสตรีมทางกายภาพหลายรายการ ให้ตรวจสอบว่าแอปใช้
discardFreeBuffers
ในการจัดการบัฟเฟอร์ว่าง (บัฟเฟอร์ที่ผู้บริโภคปล่อยออกมา แต่ยังไม่มีการยกเลิกคิวโดยผู้ผลิต) ในกรณีที่คาดว่าสตรีมทางกายภาพจะไม่มีการใช้งานเป็นระยะเวลาหนึ่ง - หากสตรีมจากกล้องจริงที่ต่างกันไม่ได้แนบมากับคำขอเดียวกันโดยปกติ ให้ตรวจสอบว่าแอปใช้
surface group
เพื่อใช้คิวบัฟเฟอร์ 1 คิวเพื่อรองรับแพลตฟอร์มที่แสดงต่อแอป 2 แพลตฟอร์ม ซึ่งจะช่วยลดการใช้หน่วยความจำ