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

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

  • getConcurrentStreamingCameraIds : ได้รับชุดของการรวมกันของระบบในขณะนี้ระบุอุปกรณ์กล้องที่สนับสนุนการกำหนดค่าอุปกรณ์การประชุมกล้องพร้อมกัน
  • 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 เดียว Dataspace::DEPTH ที่มีความละเอียด SVGA, ระหว่างการดำเนินการพร้อมกันที่ SVGA มีขนาดเล็กของมติดังต่อไปที่สอง:

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

การดำเนินการ

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

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

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

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

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

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

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

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

ปัญหา

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

  • กล้อง ID 0 เป็นกล้องตรรกะการสนับสนุนจากกล้องกว้างและกว้างพิเศษซึ่งแต่ละใช้ทรัพยากร ISP
  • กล้องหมายเลข 1 เป็นกล้องซึ่งจะนำทรัพยากร ISP

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

หากเป็นกรณีที่กล้องด้านหน้า (ID 1 ) ไม่สามารถกำหนดค่ากระแสใด ๆ เพราะทั้งผู้ให้บริการอินเทอร์เน็ตในการใช้งาน

สารละลาย

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

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