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