Android อนุญาตให้อุปกรณ์รองรับการสตรีมอุปกรณ์กล้องพร้อมกัน ตัวอย่างเช่น ช่วยให้อุปกรณ์มีทั้งกล้องหน้าและกล้องหลังทำงานพร้อมกัน ตั้งแต่ Android 11 เป็นต้นไป Camera2 API จะมีวิธีการต่อไปนี้ที่แอปสามารถเรียกใช้เพื่อตรวจสอบว่ากล้องรองรับการสตรีมพร้อมกันและการกำหนดค่าสตรีมที่รองรับหรือไม่
-
getConcurrentCameraIds
: รับชุดชุดค่าผสมของตัวระบุอุปกรณ์กล้องที่เชื่อมต่ออยู่ในปัจจุบัน ซึ่งรองรับการกำหนดค่าเซสชันอุปกรณ์กล้องพร้อมกัน -
isConcurrentSessionConfigurationSupported
: ตรวจสอบว่าชุดอุปกรณ์กล้องที่ให้มาและการกำหนดค่าเซสชันที่เกี่ยวข้องสามารถกำหนดค่าพร้อมกันได้หรือไม่
ชุดของการรวมสตรีมบังคับที่ต้องได้รับการสนับสนุนระหว่างการสตรีมพร้อมกันจะรวมอยู่ในคุณสมบัติกล้องของอุปกรณ์กล้องในคุณสมบัติ SCALER_MANDATORY_CONCURRENT_STREAM_COMBINATIONS
อุปกรณ์กล้องแต่ละตัวที่โฆษณาผ่าน getConcurrentStreamingCameraIds()
จะต้องรองรับการกำหนดค่าที่รับประกันต่อไปนี้สำหรับการสตรีมพร้อมกัน
เป้าหมาย 1 | เป้าหมาย 2 | |||
---|---|---|---|---|
พิมพ์ | ขนาดสูงสุด | พิมพ์ | ขนาดสูงสุด | ตัวอย่างการใช้งาน |
ยูวี | s1440p | การประมวลผลวิดีโอหรือรูปภาพในแอป | ||
PRIV | s1440p | การวิเคราะห์ช่องมองภาพในแอป | ||
เจเพ็ก | s1440p | ไม่มีการบันทึกภาพนิ่งในช่องมองภาพ | ||
YUV / เอกชน | s720p | เจเพ็ก | s1440p | ภาพนิ่งมาตรฐาน |
YUV / เอกชน | s720p | YUV / เอกชน | s1440p | วิดีโอในแอปหรือการประมวลผลพร้อมตัวอย่าง |
อุปกรณ์ที่มีความสามารถ MONOCHROME
( CameraCharacteristics#REQUEST_AVAILABLE_CAPABILITIES
รวมถึง CameraMetadata#REQUEST_AVAILABLE_CAPABILITIES_MONOCHROME
) ที่รองรับ Y8 จะต้องรองรับการแทนที่สตรีม YUV ด้วย Y8 ในการผสมผสานสตรีมที่รับประกันทั้งหมด
s720p
หมายถึง 720p (1280 x 720) หรือความละเอียดสูงสุดที่รองรับสำหรับรูปแบบเฉพาะที่ส่งคืนโดย StreamConfigurationMap.getOutputSizes()
s1440p
หมายถึง 1440p (1920 x 1440) หรือความละเอียดสูงสุดที่รองรับสำหรับรูปแบบเฉพาะที่ส่งคืนโดย StreamConfigurationMap.getOutputSizes()
อุปกรณ์ที่ความสามารถไม่รวม ANDROID_REQUEST_AVAILABLE_CAPABILITIES_BACKWARD_COMPATIBLE
จะต้องรองรับสตรีม Y16 อย่างน้อย 1 สตรี Dataspace::DEPTH
ที่มีความละเอียด sVGA ในระหว่างการทำงานพร้อมกัน โดยที่ sVGA มีค่าน้อยกว่าในความละเอียด 2 ต่อไปนี้:
- ความละเอียดเอาต์พุตสูงสุดสำหรับรูปแบบที่กำหนด
- 640x480
การนำไปปฏิบัติ
หากต้องการอนุญาตให้แอปสอบถามอุปกรณ์เพื่อตรวจสอบว่ากล้องรองรับการสตรีมพร้อมกันหรือไม่ ให้ใช้อินเทอร์เฟซ ICameraProvider@2.6
HAL ซึ่งรวมถึงวิธีการต่อไปนี้:
สำหรับการใช้งานอ้างอิงของอินเทอร์เฟซ ICameraProvider@2.6
HAL โปรดดูไลบรารี HAL ของกล้องจำลองที่ EmulatedCameraProviderHWLImpl.cpp
การตรวจสอบ
หากต้องการทดสอบว่าการใช้งานคุณลักษณะนี้ทำงานตามที่ตั้งใจไว้ ให้ใช้การทดสอบ ConcurrentCameraTest.java
CTS นอกจากนี้ ให้ทดสอบโดยใช้แอปที่เปิดกล้องหลายตัวและใช้งานพร้อมกันได้
ปัญหาการจัดสรรทรัพยากร
หาก HAL ของกล้องโฆษณาการสนับสนุนการทำงานพร้อมกันของอุปกรณ์กล้อง พวกเขาอาจประสบปัญหาการจัดสรรทรัพยากร โดยเฉพาะอย่างยิ่งในกรณีที่มีทรัพยากรตัวประมวลผลสัญญาณภาพ (ISP) เพียงพอบนโทรศัพท์เพื่อสตรีมทั้งกล้องหน้าและหลัง (หรืออื่นๆ) พร้อมๆ กัน แต่ยังไม่เต็มความสามารถ ในกรณีนี้ กล้อง HAL จะต้องจัดสรรทรัพยากรฮาร์ดแวร์ที่จำกัดให้กับอุปกรณ์กล้องแต่ละตัว
สถานการณ์ตัวอย่าง
สถานการณ์ต่อไปนี้แสดงให้เห็นถึงปัญหานี้
ปัญหา
อุปกรณ์มีการกำหนดค่าดังต่อไปนี้:
- Camera ID
0
เป็นกล้องลอจิคัลที่ได้รับการสนับสนุนจากกล้องไวด์และกล้องอัลตร้าไวด์ ซึ่งแต่ละตัวใช้ทรัพยากร ISP เดียว - Camera ID
1
เป็นกล้องที่ใช้ทรัพยากร ISP หนึ่งรายการ
อุปกรณ์ (โทรศัพท์) มี ISP สองแห่ง หากเปิด ID กล้อง 0
และมีการกำหนดค่าเซสชัน อาจเป็นไปได้ที่กล้อง HAL จะสงวน ISP สองรายที่คาดการณ์ไว้ทั้งการใช้กล้องมุมกว้างพิเศษและมุมกว้าง
ในกรณีนี้ กล้องหน้า (ID 1
) จะไม่สามารถกำหนดค่าสตรีมใดๆ ได้เนื่องจาก ISP ทั้งสองใช้งานอยู่
สารละลาย
เพื่อแก้ไขปัญหานี้ เฟรมเวิร์กสามารถเปิดทั้งรหัสกล้อง 0
และ 1
ก่อนที่จะกำหนดค่าเซสชันเพื่อให้คำแนะนำแก่กล้อง HAL เกี่ยวกับวิธีการจัดสรรทรัพยากร (เนื่องจากตอนนี้คาดว่าจะมีการทำงานพร้อมกันของกล้อง) อย่างไรก็ตาม สิ่งนี้อาจนำไปสู่ความสามารถที่จำกัด เช่น การซูมอาจไม่สามารถรองรับอัตราส่วนช่วงการซูมเต็มได้ (เนื่องจากการสลับ ID กล้องจริงอาจเป็นปัญหา)
เมื่อต้องการใช้โซลูชันนี้ ให้อัปเดตต่อไปนี้เป็น provider@2.6::ICameraProvider::getConcurrentCameraStreamingCameraIds
กำหนดว่าสำหรับการทำงานพร้อมกันของกล้อง เฟรมเวิร์กของกล้องต้องเปิดอุปกรณ์กล้อง (
@3.2::ICameraDevice::open
) ก่อนที่จะกำหนดค่าเซสชันใดๆ บนอุปกรณ์กล้อง ช่วยให้ผู้ให้บริการกล้องสามารถจัดสรรทรัพยากรได้อย่างเหมาะสมเพื่อแก้ไขปัญหาที่ไม่สามารถจัดการอัตราส่วนช่วงการซูมเต็มได้ ตรวจสอบให้แน่ใจว่าแอปกล้องเมื่อใช้กล้องพร้อมกันนั้นรับประกันว่าจะใช้การตั้งค่าการควบคุม
ZOOM_RATIO
ระหว่างเพียง 1x ถึงMAX_DIGITAL_ZOOM
แทนที่จะเป็นZOOM_RATIO_RANGE
ที่สมบูรณ์ (ซึ่งจะป้องกันการสลับของ กล้องจริงภายในซึ่งอาจต้องใช้ ISP มากขึ้น)
ปัญหากับ testDualCameraPreview
เมื่อคุณทำการอัปเดตข้างต้น อาจสร้างปัญหากับลักษณะการทำงานที่อนุญาตโดยการทดสอบ MultiViewTest.java#testDualCameraPreview
การทดสอบ testDualCameraPreview
ไม่ได้กำหนดค่าเซสชันหลังจากเปิดกล้องทั้งหมดเท่านั้น เป็นไปตามลำดับนี้:
for each camera in cameraDevices :
device = openCamera(camera)
createCaptureSession(device);
อย่างไรก็ตาม สามารถทนต่อความล้มเหลวในการเปิดกล้องด้วย ERROR_MAX_CAMERAS_IN_USE [1]
แอพของบริษัทอื่นอาจขึ้นอยู่กับลักษณะการทำงานนี้
เนื่องจากกล้อง HAL จะไม่ทราบว่า ID กล้องทั้งชุดที่เปิดสำหรับการทำงานพร้อมกันก่อนที่จะกำหนดค่าเซสชัน จึงอาจเป็นเรื่องยากสำหรับการจัดสรรทรัพยากรฮาร์ดแวร์ (สมมติว่ามีการแข่งขันกัน)
เพื่อแก้ไขปัญหานี้ โดยรักษาความเข้ากันได้แบบย้อนหลังนอกเหนือจากการสนับสนุนการสตรีมพร้อมกัน กล้อง HAL ควรล้มเหลวในการเรียก openCamera
ด้วย ERROR_MAX_CAMERAS_IN_USE
หากไม่สามารถรองรับการกำหนดค่าสตรีมแบบเต็มสำหรับกล้องทุกตัวที่ทำงานพร้อมกัน