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

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

  • 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

การใช้งาน

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

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

การตรวจสอบความถูกต้อง

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

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

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

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

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

ปัญหา

อุปกรณ์มีการกําหนดค่าต่อไปนี้

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

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

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

โซลูชัน

เพื่อแก้ไขปัญหานี้ เฟรมเวิร์กสามารถเปิดทั้งรหัสกล้อง 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 กระจายทรัพยากรฮาร์ดแวร์ได้ยาก (ในกรณีที่มีการแข่งขันกันใช้ทรัพยากร)

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