Android อนุญาตให้อุปกรณ์รองรับการสตรีมอุปกรณ์กล้องพร้อมกัน เช่น การดำเนินการนี้ช่วยให้อุปกรณ์มีทั้งกล้องหน้าและกล้องหลังที่ทำงานพร้อมกันได้ ตั้งแต่ Android 11 เป็นต้นไป Camera2 API จะมีเมธอดต่อไปนี้ที่แอปสามารถเรียกใช้เพื่อระบุว่ากล้องรองรับสตรีมมิงพร้อมกันหรือไม่ และเพื่อดูการกำหนดค่าสตรีมที่รองรับ
getConcurrentCameraIds
: รับชุดผสมของตัวระบุอุปกรณ์กล้องที่เชื่อมต่ออยู่ในปัจจุบัน ซึ่งรองรับการกำหนดค่าเซสชันของอุปกรณ์กล้องพร้อมกันisConcurrentSessionConfigurationSupported
: ตรวจสอบว่าชุดอุปกรณ์กล้องที่ระบุและการกำหนดค่าเซสชันที่เกี่ยวข้องสามารถกำหนดค่าพร้อมกันได้หรือไม่
ชุดการผสมผสานสตรีมที่ต้องรองรับระหว่างสตรีมมิงพร้อมกันจะรวมอยู่ในลักษณะของกล้องของอุปกรณ์กล้องในพร็อพเพอร์ตี้ SCALER_MANDATORY_CONCURRENT_STREAM_COMBINATIONS
อุปกรณ์กล้องแต่ละเครื่องที่โฆษณาผ่าน getConcurrentStreamingCameraIds()
ต้องรองรับการกำหนดค่าที่รับประกันต่อไปนี้สำหรับสตรีมพร้อมกัน
เป้าหมาย 1 | เป้าหมาย 2 | |||
---|---|---|---|---|
ประเภท | ขนาดสูงสุด | ประเภท | ขนาดสูงสุด | ตัวอย่างกรณีการใช้งาน |
YUV | s1440p | วิดีโอหรือการประมวลผลรูปภาพในแอป | ||
PRIV | s1440p | การวิเคราะห์ช่องมองภาพในแอป | ||
JPEG | s1440p | ไม่มีการจับภาพนิ่งจากช่องมองภาพ | ||
YUV / PRIV | s720p | JPEG | s1440p | การถ่ายภาพนิ่งแบบมาตรฐาน |
YUV / PRIV | s720p | YUV / PRIV | 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 ความละเอียดต่อไปนี้
- ความละเอียดเอาต์พุตสูงสุดสำหรับรูปแบบที่ระบุ
- 640 x 480
การใช้งาน
หากต้องการอนุญาตให้แอปค้นหาอุปกรณ์เพื่อดูว่ากล้องรองรับการสตรีมพร้อมกันหรือไม่ ให้ใช้อินเทอร์เฟซ HAL ของ ICameraProvider@2.6
ซึ่งมีวิธีการดังต่อไปนี้
ดูการใช้งานอ้างอิงของICameraProvider@2.6
อินเทอร์เฟซ HAL ได้ที่ห้องสมุด HAL ของกล้องจำลองที่ EmulatedCameraProviderHWLImpl.cpp
การตรวจสอบความถูกต้อง
หากต้องการทดสอบว่าฟีเจอร์นี้ทํางานตามที่ต้องการ ให้ใช้การทดสอบ CTS ของ ConcurrentCameraTest.java
นอกจากนี้ ให้ทดสอบโดยใช้แอปที่เปิดกล้องหลายตัวและใช้งานพร้อมกัน
ปัญหาการจัดสรรทรัพยากร
หาก HAL ของกล้องโฆษณาว่ารองรับการทํางานพร้อมกันของอุปกรณ์กล้อง ก็อาจพบปัญหาการจัดสรรทรัพยากร โดยเฉพาะในกรณีที่มีทรัพยากรตัวประมวลผลสัญญาณภาพ (ISP) ในโทรศัพท์เพียงพอที่จะสตรีมทั้งกล้องหน้าและหลัง (หรือกล้องอื่นๆ) พร้อมกัน แต่ไม่ได้เต็มความสามารถ ในกรณีนี้ HAL ของกล้องต้องจัดสรรทรัพยากรฮาร์ดแวร์ที่มีจํากัดให้กับอุปกรณ์กล้องแต่ละเครื่อง
สถานการณ์ตัวอย่าง
สถานการณ์ต่อไปนี้แสดงถึงปัญหานี้
ปัญหา
อุปกรณ์มีการกําหนดค่าต่อไปนี้
- รหัสกล้อง
0
คือกล้องเชิงตรรกะซึ่งรองรับโดยกล้องแบบไวด์และอัลตราไวด์ โดยแต่ละกล้องจะใช้ทรัพยากร ISP 1 รายการ - รหัสกล้อง
1
คือกล้องที่ใช้ทรัพยากร ISP 1 รายการ
อุปกรณ์ (โทรศัพท์) มี ISP 2 ราย หากเปิดรหัสกล้อง 0
และกำหนดค่าเซสชันไว้ อาจเป็นไปได้ว่า HAL ของกล้องสงวน ISP 2 รายที่คาดการณ์ว่าจะใช้กล้องทั้งภาพมุมกว้างพิเศษและมุมกว้าง
ในกรณีนี้ กล้องหน้า (รหัส 1
) จะกำหนดค่าสตรีมไม่ได้เนื่องจากมีการใช้ ISP ทั้ง 2 ราย
โซลูชัน
ในการแก้ไขปัญหานี้ เฟรมเวิร์กสามารถเปิดทั้งรหัสกล้อง 0
และ 1
ก่อนกำหนดค่าเซสชันเพื่อให้คำแนะนำเกี่ยวกับ HAL ของกล้องเกี่ยวกับวิธีจัดสรรทรัพยากร (เนื่องจากปัจจุบันกล้องจะทำงานพร้อมกัน)
อย่างไรก็ตาม การดำเนินการนี้อาจทำให้ความสามารถมีข้อจำกัด เช่น การซูมอาจไม่สามารถจัดการอัตราส่วนช่วงการซูมแบบเต็มได้ (เนื่องจากการสลับรหัสกล้องจริงอาจทำให้เกิดปัญหา)
หากต้องการใช้โซลูชันนี้ ให้ทําการอัปเดตต่อไปนี้ใน
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 ของกล้องจะไม่ทราบว่ามีการเปิดชุดรหัสกล้องทั้งหมดสําหรับการดําเนินการพร้อมกันก่อนที่จะกําหนดค่าเซสชัน จึงอาจทำให้ HAL กระจายทรัพยากรฮาร์ดแวร์ได้ยาก (ในกรณีที่มีการแข่งขันกันใช้ทรัพยากร)
ในการแก้ปัญหานี้ นอกเหนือจากการรองรับการสตรีมพร้อมกันแล้ว HAL ของกล้องควรเรียกใช้ openCamera
ด้วย ERROR_MAX_CAMERAS_IN_USE
ไม่สำเร็จหากไม่รองรับการกำหนดค่าสตรีมแบบเต็มสำหรับกล้องทั้งหมดที่ทำงานพร้อมกัน