การสตรีมจากกล้องพร้อมกัน

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 หากไม่สามารถรองรับการกำหนดค่าสตรีมแบบเต็มสำหรับ กล้องทุกตัวทำงานพร้อมกัน