สตรีมมิ่งกล้องพร้อมกัน

Android อนุญาตให้อุปกรณ์รองรับการสตรีมอุปกรณ์กล้องพร้อมกัน ตัวอย่างเช่น ช่วยให้อุปกรณ์มีทั้งกล้องหน้าและกล้องหลังทำงานพร้อมกัน ตั้งแต่ Android 11 เป็นต้นไป Camera2 API จะมีวิธีการต่อไปนี้ที่แอปสามารถเรียกใช้เพื่อตรวจสอบว่ากล้องรองรับการสตรีมพร้อมกันและการกำหนดค่าสตรีมที่รองรับหรือไม่

  • getConcurrentCameraIds : รับชุดชุดค่าผสมของตัวระบุอุปกรณ์กล้องที่เชื่อมต่ออยู่ในปัจจุบัน ซึ่งรองรับการกำหนดค่าเซสชันอุปกรณ์กล้องพร้อมกัน
  • isConcurrentSessionConfigurationSupported : ตรวจสอบว่าชุดอุปกรณ์กล้องที่ให้มาและการกำหนดค่าเซสชันที่เกี่ยวข้องสามารถกำหนดค่าพร้อมกันได้หรือไม่

ชุดของการรวมสตรีมบังคับที่ต้องได้รับการสนับสนุนระหว่างการสตรีมพร้อมกันจะรวมอยู่ในคุณสมบัติกล้องของอุปกรณ์กล้องในคุณสมบัติ SCALER_MANDATORY_CONCURRENT_STREAM_COMBINATIONS

อุปกรณ์กล้องแต่ละตัวที่โฆษณาผ่าน getConcurrentStreamingCameraIds() จะต้องรองรับการกำหนดค่าที่รับประกันต่อไปนี้สำหรับการสตรีมพร้อมกัน

เป้าหมาย 1 เป้าหมาย 2
พิมพ์ ขนาดสูงสุด พิมพ์ ขนาดสูงสุด ตัวอย่างการใช้งาน
ยูวี s1440p การประมวลผลวิดีโอหรือรูปภาพในแอป
PRIV s1440p การวิเคราะห์ช่องมองภาพในแอป
เจเพ็ก s1440p ไม่มีการบันทึกภาพนิ่งในช่องมองภาพ
YUV / เอกชน s720p เจเพ็ก s1440p ภาพนิ่งมาตรฐาน
YUV / เอกชน s720p YUV / เอกชน 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 ต่อไปนี้:

  • ความละเอียดเอาต์พุตสูงสุดสำหรับรูปแบบที่กำหนด
  • 640x480

การนำไปปฏิบัติ

หากต้องการอนุญาตให้แอปสอบถามอุปกรณ์เพื่อตรวจสอบว่ากล้องรองรับการสตรีมพร้อมกันหรือไม่ ให้ใช้อินเทอร์เฟซ ICameraProvider@2.6 HAL ซึ่งรวมถึงวิธีการต่อไปนี้:

สำหรับการใช้งานอ้างอิงของอินเทอร์เฟซ ICameraProvider@2.6 HAL โปรดดูไลบรารี HAL ของกล้องจำลองที่ EmulatedCameraProviderHWLImpl.cpp

การตรวจสอบ

หากต้องการทดสอบว่าการใช้งานคุณลักษณะนี้ทำงานตามที่ตั้งใจไว้ ให้ใช้การทดสอบ ConcurrentCameraTest.java CTS นอกจากนี้ ให้ทดสอบโดยใช้แอปที่เปิดกล้องหลายตัวและใช้งานพร้อมกันได้

ปัญหาการจัดสรรทรัพยากร

หาก HAL ของกล้องโฆษณาการสนับสนุนการทำงานพร้อมกันของอุปกรณ์กล้อง พวกเขาอาจประสบปัญหาการจัดสรรทรัพยากร โดยเฉพาะอย่างยิ่งในกรณีที่มีทรัพยากรตัวประมวลผลสัญญาณภาพ (ISP) เพียงพอบนโทรศัพท์เพื่อสตรีมทั้งกล้องหน้าและหลัง (หรืออื่นๆ) พร้อมๆ กัน แต่ยังไม่เต็มความสามารถ ในกรณีนี้ กล้อง HAL จะต้องจัดสรรทรัพยากรฮาร์ดแวร์ที่จำกัดให้กับอุปกรณ์กล้องแต่ละตัว

สถานการณ์ตัวอย่าง

สถานการณ์ต่อไปนี้แสดงให้เห็นถึงปัญหานี้

ปัญหา

อุปกรณ์มีการกำหนดค่าดังต่อไปนี้:

  • Camera ID 0 เป็นกล้องลอจิคัลที่ได้รับการสนับสนุนจากกล้องไวด์และกล้องอัลตร้าไวด์ ซึ่งแต่ละตัวใช้ทรัพยากร ISP เดียว
  • Camera ID 1 เป็นกล้องที่ใช้ทรัพยากร ISP หนึ่งรายการ

อุปกรณ์ (โทรศัพท์) มี ISP สองแห่ง หากเปิด ID กล้อง 0 และมีการกำหนดค่าเซสชัน อาจเป็นไปได้ที่กล้อง HAL จะสงวน ISP สองรายที่คาดการณ์ไว้ทั้งการใช้กล้องมุมกว้างพิเศษและมุมกว้าง

ในกรณีนี้ กล้องหน้า (ID 1 ) จะไม่สามารถกำหนดค่าสตรีมใดๆ ได้เนื่องจาก ISP ทั้งสองใช้งานอยู่

สารละลาย

เพื่อแก้ไขปัญหานี้ เฟรมเวิร์กสามารถเปิดทั้งรหัสกล้อง 0 และ 1 ก่อนที่จะกำหนดค่าเซสชันเพื่อให้คำแนะนำแก่กล้อง HAL เกี่ยวกับวิธีการจัดสรรทรัพยากร (เนื่องจากตอนนี้คาดว่าจะมีการทำงานพร้อมกันของกล้อง) อย่างไรก็ตาม สิ่งนี้อาจนำไปสู่ความสามารถที่จำกัด เช่น การซูมอาจไม่สามารถรองรับอัตราส่วนช่วงการซูมเต็มได้ (เนื่องจากการสลับ ID กล้องจริงอาจเป็นปัญหา)

เมื่อต้องการใช้โซลูชันนี้ ให้อัปเดตต่อไปนี้เป็น 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 จะไม่ทราบว่า ID กล้องทั้งชุดที่เปิดสำหรับการทำงานพร้อมกันก่อนที่จะกำหนดค่าเซสชัน จึงอาจเป็นเรื่องยากสำหรับการจัดสรรทรัพยากรฮาร์ดแวร์ (สมมติว่ามีการแข่งขันกัน)

เพื่อแก้ไขปัญหานี้ โดยรักษาความเข้ากันได้แบบย้อนหลังนอกเหนือจากการสนับสนุนการสตรีมพร้อมกัน กล้อง HAL ควรล้มเหลวในการเรียก openCamera ด้วย ERROR_MAX_CAMERAS_IN_USE หากไม่สามารถรองรับการกำหนดค่าสตรีมแบบเต็มสำหรับกล้องทุกตัวที่ทำงานพร้อมกัน