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

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