Android อนุญาตให้อุปกรณ์รองรับการสตรีมอุปกรณ์กล้องพร้อมกัน ตัวอย่างเช่น การดำเนินการนี้จะช่วยให้อุปกรณ์มีทั้งกล้องหน้าและกล้องหลังที่ทำงาน พร้อมกันได้ ตั้งแต่ Android 11 เป็นต้นไป API ของ Camera2 จะมีเมธอดต่อไปนี้ ซึ่งแอปสามารถเรียกใช้เพื่อตรวจสอบว่ากล้องรองรับการสตรีมพร้อมกันหรือไม่และ การกำหนดค่าสตรีมที่รองรับ
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 รายเพื่อรองรับ
การใช้ทั้งกล้องอัลตร้าไวด์และกล้องไวด์
ในกรณีนี้ กล้องหน้า (ID 1
) จะกำหนดค่าสตรีมไม่ได้เนื่องจากมีการใช้ทั้ง 2 ISP
โซลูชัน
เพื่อแก้ไขปัญหานี้ เฟรมเวิร์กสามารถเปิดทั้งรหัสกล้อง 0
และ 1
ก่อนที่จะกำหนดค่าเซสชันเพื่อเป็นคำแนะนำให้ HAL ของกล้องทราบวิธี
จัดสรรทรัพยากร (เนื่องจากตอนนี้เฟรมเวิร์กคาดหวังการทำงานพร้อมกันของกล้อง)
อย่างไรก็ตาม วิธีนี้อาจทำให้ความสามารถมีข้อจำกัด เช่น Zoom อาจไม่สามารถจัดการอัตราส่วนช่วงการซูมทั้งหมดได้ (เนื่องจากการสลับรหัสกล้องจริงอาจทำให้เกิดปัญหา)
หากต้องการใช้โซลูชันนี้ ให้อัปเดต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
หากไม่รองรับการกำหนดค่าสตรีมแบบเต็มสำหรับกล้องทั้งหมดที่ทำงานพร้อมกัน