ส่วนขยายกล้อง

ผู้ผลิตอุปกรณ์จะเผยให้เห็นส่วนขยายต่างๆ เช่น โบเก้ โหมดกลางคืน และ HDR ได้ นักพัฒนาซอฟต์แวร์บุคคลที่สามผ่านอินเทอร์เฟซของส่วนขยายกล้องที่ให้บริการโดย ไลบรารีผู้ให้บริการ OEM นักพัฒนาแอปสามารถใช้ API ส่วนขยาย Camera2 และ cameraX Extensions API เพื่อเข้าถึงส่วนขยายที่ใช้ในคลังผู้ให้บริการ OEM

สำหรับรายการส่วนขยายที่รองรับ ซึ่งจะเหมือนกันทั้งใน Camera2 และ CameraX โปรดดู CameraX Extensions API หากคุณต้องการเพิ่มส่วนขยาย รายงานข้อบกพร่องด้วย เครื่องมือติดตามปัญหา

หน้านี้จะอธิบายวิธีใช้และเปิดใช้ไลบรารีผู้ให้บริการ OEM อุปกรณ์

สถาปัตยกรรม

แผนภาพต่อไปนี้อธิบายสถาปัตยกรรมของส่วนขยายกล้อง อินเทอร์เฟซหรือ extensions-interface: สถาปัตยกรรม

รูปที่ 1 แผนภาพสถาปัตยกรรมส่วนขยายกล้อง

ดังที่แสดงในแผนภาพ หากต้องการสนับสนุนส่วนขยายกล้อง คุณจะต้อง ใช้ extensions-interface ที่ไลบรารีผู้ให้บริการ OEM มีให้ บัญชี ไลบรารีของผู้ให้บริการ OEM เปิดใช้ API 2 แบบดังนี้ cameraX Extensions API และ Camera2 Extensions API ซึ่งแอป CameraX และ Camera2 ใช้ตามลำดับเพื่อเข้าถึง ส่วนขยายของผู้ให้บริการ

ใช้ไลบรารีผู้ให้บริการ OEM

หากต้องการใช้ไลบรารีผู้ให้บริการ OEM ให้คัดลอก camera-extensions-stub ไฟล์ลงในโครงการไลบรารีของระบบ ไฟล์เหล่านี้ระบุถึงส่วนขยายกล้อง ของ Google

camera-extensions-stub ไฟล์จะแบ่งออกเป็นหมวดหมู่ต่อไปนี้

ไฟล์อินเทอร์เฟซที่จำเป็น (ไม่ต้องแก้ไข)

  • PreviewExtenderImpl.java
  • ImageCaptureExtenderImpl.java
  • ExtenderStateListener.java
  • ProcessorImpl.java
  • PreviewImageProcessorImpl.java
  • CaptureProcessorImpl.java
  • CaptureStageImpl.java
  • RequestUpdateProcessorImpl.java
  • ProcessResultImpl.java
  • advanced/AdvancedExtenderImpl.java
  • advanced/Camera2OutputConfigImpl.java
  • advanced/Camera2SessionConfigImpl.java
  • advanced/ImageProcessorImpl.java
  • advanced/ImageReaderOutputConfigImpl.java
  • advanced/ImageReferenceImpl.java
  • advanced/MultiResolutionImageReaderOutputConfigImpl.java
  • advanced/OutputSurfaceImpl.java
  • advanced/RequestProcessorImpl.java
  • advanced/SessionProcessorImpl.java
  • advanced/SurfaceOutputConfigImpl.java

การติดตั้งใช้งานที่จำเป็น (เพิ่มการใช้งาน)

  • ExtensionVersionImpl.java
  • InitializerImpl.java

คลาสตัวขยายโบเก้ (นำมาใช้หากรองรับส่วนขยาย Bokeh)

  • BokehImageCaptureExtenderImpl.java
  • BokehPreviewExtenderImpl.java
  • advanced/BokehAdvancedExtenderImpl.java

คลาสเครื่องขยายเวลากลางคืน (นำมาใช้หากรองรับส่วนขยายกลางคืน)

  • NightImageCaptureExtenderImpl.java
  • NightPreviewExtenderImpl.java
  • advanced/NightAdvancedExtenderImpl.java

คลาสส่วนขยายอัตโนมัติ (ใช้หากรองรับส่วนขยายอัตโนมัติ)

  • AutoImageCaptureExtenderImpl.java
  • AutoPreviewExtenderImpl.java
  • advanced/AutoAdvancedExtenderImpl.java

คลาสตัวขยาย HDR (นำมาใช้หากรองรับส่วนขยาย HDR)

  • HdrImageCaptureExtenderImpl.java
  • HdrPreviewExtenderImpl.java
  • advanced/HdrAdvancedExtenderImpl.java

ชั้นเรียนเครื่องขยายรีทัชใบหน้า (นำมาใช้หากรองรับส่วนขยายรีทัชใบหน้า)

  • BeautyImageCaptureExtenderImpl.java
  • BeautyPreviewExtenderImpl.java
  • advanced/BeautyAdvancedExtenderImpl.java

ยูทิลิตี (ไม่บังคับ ลบได้)

  • advanced/Camera2OutputConfigImplBuilder.java
  • advanced/Camera2SessionConfigImplBuilder.java

คุณไม่จำเป็นต้องติดตั้งใช้งานส่วนขยายทุกรายการ หากคุณ ไม่ใช้ส่วนขยาย ให้ตั้งค่า isExtensionAvailable() ให้แสดงผล false หรือ นำคลาส Extender ที่เกี่ยวข้องออก ส่วนขยาย Camera2 และส่วนขยาย CameraX API จะรายงานไปยังแอปว่าส่วนขยายไม่พร้อมใช้งาน

ลองมาดูว่า API ของส่วนขยาย Camera2 และ CameraX โต้ตอบกับ ไลบรารีผู้ให้บริการเพื่อเปิดใช้ส่วนขยาย แผนภาพต่อไปนี้แสดง ขั้นตอนจากต้นทางถึงปลายทางโดยใช้ส่วนขยายกลางคืนเป็นตัวอย่าง ดังนี้

กระแสหลัก

รูปที่ 2 การใช้ส่วนขยายกลางคืน

  1. การยืนยันเวอร์ชัน:

    Camera2/X จะเรียก ExtensionVersionImpl.checkApiVersion() เพื่อให้แน่ใจว่า เวอร์ชัน extensions-interface ที่ใช้ OEM ใช้ได้กับ Camera2/X เวอร์ชันที่รองรับ

  2. การเริ่มต้นไลบรารีของผู้ให้บริการ:

    InitializerImpl มีเมธอด init() ที่เริ่มต้นไลบรารีของผู้ให้บริการ Camera2/X จะเริ่มต้นทำงานให้เสร็จสมบูรณ์ก่อนเข้าถึงคลาส Extender

  3. สร้างชั้นเรียน Extender ทันที

    ยกตัวอย่างคลาส Extender สำหรับส่วนขยาย มี Extender 2 ตัว ประเภท: ตัวขยายพื้นฐานและตัวขยายสัญญาณขั้นสูง คุณต้องติดตั้งใช้งาน ประเภทตัวขยายสำหรับส่วนขยายทั้งหมด สำหรับข้อมูลเพิ่มเติม โปรดดู ตัวขยายพื้นฐานกับตัวขยายสัญญาณขั้นสูง

    Camera2/X จะสร้างอินสแตนซ์และโต้ตอบกับคลาส Extender เพื่อดึงข้อมูล และเปิดใช้ส่วนขยาย สำหรับส่วนขยายหนึ่งๆ Camera2/X สามารถ สร้างอินสแตนซ์ Extender หลายครั้ง ดังนั้น อย่าทำ การเริ่มต้นแบบใช้บ่อยในเครื่องมือสร้างหรือการเรียกใช้ init() ทำสิ่งต่อไปนี้ ลงน้ำหนักมากเฉพาะเมื่อเซสชันกล้องกำลังจะ เช่น เมื่อมีการเรียก onInit() ใน Basic Extender หรือ มีการเรียกใช้ initSession() ใน Advanced Extender

    สำหรับส่วนขยาย Night มีการสร้างอินสแตนซ์คลาส Extender ต่อไปนี้สำหรับ ประเภท Extender พื้นฐาน

    • NightImageCaptureExtenderImpl.java
    • NightPreviewExtenderImpl.java

    และสำหรับประเภท Advanced Extender:

    • NightAdvancedExtenderImpl.java
  4. ตรวจสอบความพร้อมใช้งานของส่วนขยาย

    ก่อนเปิดใช้ส่วนขยาย isExtensionAvailable() จะตรวจสอบว่า มีส่วนขยายในรหัสกล้องที่ระบุผ่านอุปกรณ์ขยายสัญญาณ อินสแตนซ์

  5. เริ่มต้น Extender ด้วยข้อมูลกล้อง

    Camera2/X จะเรียก init() ในอินสแตนซ์ Extender และส่งกล้อง รหัสและ CameraCharacteristics

  6. ข้อมูลคำค้นหา

    เรียกใช้คลาส Extender เพื่อเรียกข้อมูล เช่น ฟังก์ชันที่รองรับ ความละเอียดโดยประมาณ ยังคงบันทึกเวลาในการตอบสนองโดยประมาณ และบันทึกคีย์คำขอจาก บริการขยายสัญญาณเพื่อเตรียมพร้อมสำหรับการใช้งานส่วนขยาย

  7. วิธีเปิดใช้ส่วนขยายบน Extender

    คลาส Extender จะมีอินเทอร์เฟซทั้งหมดที่จำเป็นต่อการเปิดใช้ มีกลไกในการดึง OEM การใช้งานในไปป์ไลน์ Camera2 เช่น การแทรกคำขอจับภาพ หรือการเปิดใช้งานตัวประมวลผลภายหลัง

    สำหรับประเภทตัวขยายขั้นสูง Camera2/X จะโต้ตอบกับ SessionProcessorImplเพื่อเปิดใช้ส่วนขยาย Camera2/X จะดึง SessionProcessorImplอินสแตนซ์โดยการเรียกใช้ createSessionProcessor() ใน ตัวขยายสัญญาณ

ส่วนต่อไปนี้จะอธิบายขั้นตอนของส่วนขยายอย่างละเอียด

การยืนยันเวอร์ชัน

เมื่อโหลดไลบรารีของผู้ให้บริการ OEM จากอุปกรณ์ขณะรันไทม์ Camera2/X ตรวจสอบว่าไลบรารีสามารถทำงานร่วมกับเวอร์ชัน extensions-interface หรือไม่ extensions-interface ใช้การกำหนดเวอร์ชันทางความหมาย หรือ MAJOR.MINOR.PATCH เช่น 1.1.0 หรือ 1.2.0 อย่างไรก็ตาม เฉพาะ ระบบจะใช้เวอร์ชันหลักและเวอร์ชันรองในระหว่างการยืนยันเวอร์ชัน

ในการยืนยันเวอร์ชัน การโทร Camera2/X ExtensionVersionImpl.checkApiVersion() ร่วมกับ เวอร์ชัน extensions-interface จากนั้น Camera2/X จะใช้เวอร์ชันที่รายงานโดย ไลบรารี OEM เพื่อพิจารณาว่าสามารถเปิดใช้ส่วนขยายได้หรือไม่และความสามารถอะไรบ้าง ก็จะถูกเรียกใช้

ความเข้ากันได้ของเวอร์ชันหลัก

หากเวอร์ชันหลักของอินเทอร์เฟซของส่วนขยายแตกต่างกัน Camera2/X และไลบรารีของผู้ให้บริการ จะถือว่าใช้ร่วมกันไม่ได้ และ ส่วนขยายนั้นถูกปิดใช้

ความเข้ากันได้แบบย้อนหลัง

ตราบใดที่เวอร์ชันหลักเหมือนกันทุกประการ Camera2/X จะดูแลให้ ความเข้ากันได้แบบย้อนหลังกับไลบรารีผู้ให้บริการ OEM ที่สร้างขึ้น extensions-interface เวอร์ชัน เช่น หาก Camera2/X รองรับ extensions-interface 1.3.0, ไลบรารีผู้ให้บริการ OEM ที่ใช้เวอร์ชัน 1.0.0 1.1.0 และ 1.2.0 ยังใช้งานร่วมกันได้อยู่ และยังหมายความว่า หลังจากที่คุณใช้ เวอร์ชันเฉพาะของไลบรารีของผู้ให้บริการ Camera2/X จะทำให้ไลบรารี สามารถเข้ากันได้แบบย้อนหลังกับ extension-interface เวอร์ชันที่กำลังจะมาถึง

ส่งต่อความเข้ากันได้

ส่งต่อความเข้ากันได้กับไลบรารีผู้ให้บริการของ extensions-interface ที่ใหม่กว่า ขึ้นอยู่กับคุณ OEM หากต้องการฟีเจอร์บางส่วนในการใช้งานส่วนขยาย คุณอาจต้องเปิดใช้ส่วนขยายโดยเริ่มจากเวอร์ชันใดเวอร์ชันหนึ่ง ด้วยวิธีนี้ คุณสามารถแสดงผลเวอร์ชัน extensions-interface ที่รองรับเมื่อ เวอร์ชันไลบรารี Camera2/X เป็นไปตามข้อกําหนด หากเวอร์ชัน Camera2/X ไม่รองรับ คุณสามารถส่งคืนค่าเวอร์ชันที่เข้ากันไม่ได้ เช่น 99.0.0 เป็น ปิดใช้ส่วนขยาย

การเริ่มต้นไลบรารีของผู้ให้บริการ

หลังจากยืนยันเวอร์ชัน extensions-interface ที่ OEM ใช้งาน Camera2/X จะเริ่มต้นกระบวนการเริ่มต้น เมธอด InitializerImpl.init() จะส่งสัญญาณไปยังไลบรารี OEM ที่แอปกำลังทดลองใช้ ใช้ส่วนขยายได้

Camera2/X จะไม่เรียกใช้ไลบรารี OEM อื่นใด (นอกเหนือจากการตรวจสอบเวอร์ชัน) จนกว่าไลบรารีของผู้ให้บริการ OEM จะเรียกใช้ OnExtensionsInitializedCallback.onSuccess() เพื่อแจ้งการเริ่มต้นทำงานเสร็จแล้ว

คุณต้องติดตั้งใช้งาน InitializerImpl ณ วันที่ extensions-interface 1.1.0 Camera2/X ข้ามการเริ่มต้นไลบรารี ในกรณีที่ไลบรารีของผู้ให้บริการ OEM ใช้ extensions-interface 1.0.0

ตัวขยายพื้นฐานกับตัวขยายสัญญาณขั้นสูง

การใช้งาน extensions-interface มี 2 ประเภท ได้แก่ ตัวขยายพื้นฐานและ อุปกรณ์ขยายสัญญาณขั้นสูง ตัวขยายสัญญาณขั้นสูงได้รับการรองรับตั้งแต่ extensions-interface 1.2.0

ใช้ตัวขยายพื้นฐานสำหรับส่วนขยายที่ประมวลผลรูปภาพใน HAL ของกล้อง หรือ ใช้โพสต์โปรเซสเซอร์ที่สามารถประมวลผลสตรีม YUV

ใช้งาน Advanced Extender สำหรับส่วนขยายที่ต้องปรับแต่ง Camera2 การกำหนดค่าสตรีม และส่งคำขอการจับภาพตามต้องการ

ดูการเปรียบเทียบในตารางต่อไปนี้

ตัวขยายสัญญาณพื้นฐาน อุปกรณ์ขยายสัญญาณขั้นสูง
การกำหนดค่าสตรีม คงที่
ดูตัวอย่าง: PRIVATE หรือ YUV_420_888 (หากมีโปรเซสเซอร์)
ยังจับภาพอยู่: JPEG หรือ YUV_420_888 (หากมีตัวประมวลผล)
OEM สามารถปรับแต่งได้
กำลังส่งคำขอจับภาพ เฉพาะ Camera2/X เท่านั้นที่ส่งคำขอจับภาพได้ คุณตั้งค่าพารามิเตอร์เป็น คำขอเหล่านี้ เมื่อมีโปรเซสเซอร์สำหรับจับภาพ Camera2/X สามารถส่งคำขอจับภาพหลายรายการและส่งรูปภาพทั้งหมดและจับภาพ ไปยังโปรเซสเซอร์ อินสแตนซ์ RequestProcessorImpl จะส่งถึงคุณเพื่อ เรียกใช้คำขอจับภาพ Camera2 และดูผลลัพธ์และรูปภาพ

Camera2/X เรียกใช้ startRepeating และ startCapture เปิดอยู่ SessionProcessorImpl เพื่อส่งสัญญาณให้ OEM เริ่มการทำซ้ำ แสดงตัวอย่างและเริ่มลำดับการจับภาพตามลำดับ

ขอเกี่ยวในไปป์ไลน์ของกล้อง
  • onPresetSession จัดเตรียมพารามิเตอร์เซสชัน
  • onEnableSession จะส่งคำขอเดียวหลังจากกำหนดค่า CameraCaptureSession แล้ว
  • onDisableSession จะส่งคำขอรายการเดียวก่อนปิด CameraCaptureSession
  • initSession เริ่มต้นและส่งกลับกล้องที่ปรับแต่งแล้ว 2 การกำหนดค่าเซสชันสำหรับการสร้างเซสชันการจับภาพ
  • onCaptureSessionStart จะเรียกใช้ทันทีหลังจากกำหนดค่า CameraCaptureSession แล้ว
  • มีการเรียกใช้ onCaptureSessionEnd ก่อนที่ CameraCaptureSession จะปิด
เหมาะสำหรับ ส่วนขยายที่ใช้งานใน HAL ของกล้อง หรือในโปรเซสเซอร์ที่ประมวลผล รูปภาพ YUV
  • มีการใช้งานส่วนขยายซึ่งใช้ Camera2
  • ต้องกำหนดค่าสตรีมที่กำหนดเอง เช่น สตรีม RAW
  • ต้องการลำดับการจับภาพแบบอินเทอร์แอกทีฟ
เวอร์ชัน API ที่รองรับ ส่วนขยาย Camera2: Android 13 ขึ้นไป
ส่วนขยาย CameraX: camera-extensions 1.1.0 ขึ้นไป
ส่วนขยาย Camera2: Android 12L ขึ้นไป
ส่วนขยาย CameraX: camera-extensions 1.2.0-alpha03 ขึ้นไป

ขั้นตอนของแอป

ตารางต่อไปนี้แสดงขั้นตอนของแอป 3 ประเภทและขั้นตอน การเรียก API ของส่วนขยายกล้องที่เกี่ยวข้อง ในขณะที่ Camera2/X ให้ API เหล่านี้ คุณต้องติดตั้งไลบรารีของผู้ให้บริการอย่างเหมาะสมเพื่อรองรับ API เหล่านี้ ซึ่งเราจะอธิบายรายละเอียดเพิ่มเติมในส่วนต่อไป

ส่วนขยาย Camera2 ส่วนขยาย CameraX
ความพร้อมใช้งานของส่วนขยายคำค้นหา CameraExtensionCharacteristics .getSupportedExtensions ExtensionsManager. isExtensionAvailable
ข้อมูลคำค้นหา CameraExtensionCharacteristics. getExtensionSupportedSizes CameraExtensionCharacteristics. getEstimatedCaptureLatencyRangeMillis CameraExtensionCharacteristics. getAvailableCaptureRequestKeys CameraExtensionCharacteristics. getAvailableCaptureResultKeys ExtensionsManager. getEstimatedCaptureLatencyRange

CameraX จะจัดการข้อมูลที่เหลือภายในไลบรารี

แสดงตัวอย่างและยังคงจับภาพได้ด้วยการเปิดใช้ส่วนขยาย CameraDevice. createExtensionSession

cameraExtensionsSession. setRepeatingRequest

cameraExtensionsSession. capture

val cameraSelector = ExtensionsManager. getExtensionEnabledCameraSelector

bindToLifecycle(lifecycleOwner, cameraSelector, preview, ...)

ตัวขยายสัญญาณพื้นฐาน

อินเทอร์เฟซตัวขยายพื้นฐานให้คุณเข้าถึงหลายๆ ตำแหน่งในกล้องได้ ไปป์ไลน์ ส่วนขยายแต่ละประเภทมีคลาส Extender ที่สอดคล้องกันที่ OEM ต้องมี เพื่อนำไปปฏิบัติ

ตารางต่อไปนี้แสดงรายการคลาส Extender ที่ OEMS จำเป็นต้องใช้ในแต่ละรายการ ส่วนขยาย:

ชั้นเรียนขยายการใช้งาน
กลางคืน NightPreviewExtenderImpl.java

NightImageCaptureExtenderImpl.java

HDR HdrPreviewExtenderImpl.java

HdrImageCaptureExtenderImpl.java

อัตโนมัติ AutoPreviewExtenderImpl.java

AutoImageCaptureExtenderImpl.java

โบเก้ BokehPreviewExtenderImpl.java

BokehImageCaptureExtenderImpl.java

รีทัชใบหน้า BeautyPreviewExtenderImpl.java

BeautyImageCaptureExtenderImpl.java

เราใช้ PreviewExtenderImpl และ ImageCaptureExtenderImpl เป็นตัวยึดตำแหน่ง ในตัวอย่างต่อไปนี้ แทนที่ด้วยชื่อของจริง ไฟล์ที่คุณกำลังติดตั้งใช้งาน

ตัวขยายสัญญาณพื้นฐานมีความสามารถดังต่อไปนี้

  • แทรกพารามิเตอร์เซสชันเมื่อกําหนดค่า CameraCaptureSession ( onPresetSession)
  • แจ้งให้คุณทราบถึงเหตุการณ์เริ่มต้นและปิดเซสชันการจับภาพ แล้วส่ง คำขอแจ้ง HAL ด้วยพารามิเตอร์ที่แสดงผล (onEnableSession, onDisableSession)
  • แทรกพารามิเตอร์การบันทึกสำหรับคำขอ (PreviewExtenderImpl.getCaptureStage ImageCaptureExtenderImpl.getCaptureStages)
  • เพิ่มโปรเซสเซอร์เพื่อดูตัวอย่างและยังคงจับภาพที่ประมวลผลได้ สตรีม YUV_420_888

มาดูกันว่า Camera2/X เรียกใช้ extensions-interface เพื่อทำเป้าหมาย 3 อย่างนี้ได้อย่างไร ขั้นตอนของแอปที่กล่าวถึงข้างต้น

ขั้นตอนของแอป 1: ตรวจสอบความพร้อมใช้งานของส่วนขยาย

BasicExtenderAppFlow1

รูปที่ 3 ขั้นตอนของแอป 1 เกี่ยวกับตัวขยายพื้นฐาน

ในขั้นตอนนี้ Camera2/X จะเรียกเมธอด isExtensionAvailable() โดยตรงของ ทั้ง PreviewExtenderImpl และ ImageCaptureExtenderImpl โดยไม่ต้องโทร init() คลาส Extender ทั้ง 2 รายการจะต้องแสดงผล true เพื่อเปิดใช้ส่วนขยาย

ซึ่งนี่มักเป็นขั้นตอนแรกให้แอปตรวจสอบว่าส่วนขยายที่ระบุ ประเภทได้รับการรองรับสำหรับรหัสกล้องที่ระบุก่อนเปิดใช้ส่วนขยาย เนื่องจากส่วนขยายบางรายการรองรับเฉพาะรหัสกล้องบางรหัสเท่านั้น

ขั้นตอนของแอป 2: ค้นหาข้อมูล

ExtenderAppFlow2 พื้นฐาน

รูปที่ 4 ขั้นตอนของแอป 2 ในส่วนขยายพื้นฐาน

หลังจากตรวจสอบว่าส่วนขยายพร้อมให้บริการแล้วหรือไม่ แอปควรสืบค้น ข้อมูลต่อไปนี้ก่อนเปิดใช้ส่วนขยาย

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

  • ขนาดที่รองรับสำหรับตัวอย่างและพื้นผิวการจับภาพมีดังนี้ ImageCaptureExtenderImpl.getSupportedResolutions และ PreviewExtenderImpl.getSupportedResolutions แสดงรายการรูปแบบรูปภาพและ ขนาดที่รองรับสำหรับรูปแบบและขนาดพื้นผิว

  • คีย์คำขอและผลลัพธ์ที่รองรับ: Camera2/X จะเรียกเมธอดต่อไปนี้เพื่อเรียกข้อมูลการจับภาพที่รองรับ คีย์คำขอและคีย์ผลลัพธ์จากการใช้งานของคุณ:

    • ImageCaptureExtenderImpl.getAvailableCaptureRequestKeys
    • ImageCaptureExtenderImpl.getAvailableCapturetResultKeys

Camera2/X จะเรียก init() เป็นอันดับแรกในชั้นเรียน Extender เหล่านี้ก่อนการค้นหาเสมอ เพื่อดูข้อมูลเพิ่มเติม

ขั้นตอนของแอป 3: แสดงตัวอย่าง/ยังคงจับภาพหน้าจอโดยเปิดใช้ส่วนขยาย (การใช้งาน HAL)

ตัวขยายพื้นฐานแอปโฟลว์3

รูปที่ 5 ขั้นตอนของแอป 3 ใน Basic Extender

แผนภาพด้านบนแสดงขั้นตอนหลักของการเปิดใช้การแสดงตัวอย่างและยังคง ด้วยส่วนขยายโดยไม่ต้องมีตัวประมวลผลใดๆ หมายความว่า HAL ของกล้อง ประมวลผลส่วนขยาย

ในขั้นตอนนี้ Camera2/X จะเรียก init() ก่อน จากนั้น onInit ซึ่งแจ้งเตือนคุณ เซสชันของกล้องกำลังจะเริ่มต้นด้วยส่วนขยายที่ระบุ คุณเริ่มต้นโหมดที่ใช้ทรัพยากรจำนวนมากได้ใน onInit()

เมื่อกำหนดค่า CameraCaptureSession การเรียกใช้ Camera2/X onPresetSession เพื่อรับพารามิเตอร์เซสชัน หลังจากเซสชันการจับภาพคือ กำหนดค่าสำเร็จแล้ว Camera2/X เรียกใช้ onEnableSession แสดงผล CaptureStageImpl ที่มีพารามิเตอร์การบันทึก กล้อง 2/X จะส่งคำขอหนึ่งที่มีพารามิเตอร์การบันทึกเหล่านี้ทันทีเพื่อแจ้ง HAL ในทำนองเดียวกัน ก่อนเซสชันการจับภาพจะปิดไป Camera2/X จะเรียกใช้ onDisableSession แล้วส่งคำขอรายการเดียวที่มีการจับภาพที่แสดงผล พารามิเตอร์

คำขอที่เกิดซ้ำซึ่งทริกเกอร์โดย Camera2/X มีพารามิเตอร์คำขอ PreviewExtenderImpl.getCaptureStage() ส่งคืน นอกจากนี้ ภาพนิ่ง คำขอบันทึกมีพารามิเตอร์ที่แสดงผลโดย ImageCaptureExtenderImpl.getCaptureStages()

สุดท้าย Camera2/X จะเรียกใช้ onDeInit() หลังจากเซสชันของกล้องสิ้นสุดลงแล้ว คุณปล่อยทรัพยากรได้ใน onDeinit()

แสดงตัวอย่างโปรเซสเซอร์

นอกจาก HAL ของกล้องแล้ว คุณยังใช้ส่วนขยายต่างๆ ในโปรเซสเซอร์ได้ด้วย

ใช้ PreviewExtenderImpl.getProcessorType เพื่อระบุประเภทโปรเซสเซอร์ ตามที่อธิบายไว้ด้านล่าง

  • PROCESSOR_TYPE_NONE: ไม่มีโปรเซสเซอร์ ระบบจะประมวลผลรูปภาพในกล้อง HAL

  • PROCESSOR_TYPE_REQUEST_UPDATE_ONLY: ประเภทโปรเซสเซอร์ช่วยให้คุณ อัปเดตคำขอที่ซ้ำกันด้วยพารามิเตอร์คำขอบันทึกใหม่ตาม TotalCaptureResult ล่าสุด

    PreviewExtenderImpl.getProcessor ต้องแสดงค่า RequestUpdateProcessorImpl อินสแตนซ์ที่ประมวลผลอินสแตนซ์ TotalCaptureResult และแสดงผล CaptureStageImpl ครั้งเพื่ออัปเดตคำขอซ้ำ PreviewExtenderImpl.getCaptureStage() ควรจะแสดงผลลัพธ์ของ กำลังประมวลผล และแสดงผล CaptureStageImpl เวอร์ชันล่าสุด

  • PROCESSOR_TYPE_IMAGE_PROCESSOR: ประเภทนี้จะช่วยให้คุณติดตั้งใช้งาน ตัวประมวลผลเพื่อประมวลผลภาพ YUV_420_888 และเขียนเอาต์พุตไปยัง PRIVATE แพลตฟอร์ม

    คุณจำเป็นต้องติดตั้งใช้งานและแสดงผล PreviewImageProcessorImpl อินสแตนซ์ใน PreviewExtenderImpl.getProcessor ผู้ประมวลผลข้อมูล สำหรับการประมวลผลรูปภาพอินพุต YUV_420_888 ภาพ ซึ่งควรเขียนเอาต์พุตไปยัง ตัวอย่างรูปแบบ PRIVATE Camera2/X ใช้พื้นผิว YUV_420_888 แทน ของ PRIVATE เพื่อกำหนดค่า CameraCaptureSession สำหรับการแสดงตัวอย่าง

    โปรดดูภาพประกอบต่อไปนี้สำหรับโฟลว์

โปรเซสเซอร์ตัวอย่าง

รูปที่ 6 แสดงตัวอย่างขั้นตอนด้วย PreviewImageProcessorImpl

อินเทอร์เฟซ PreviewImageProcessorImpl ขยาย ProcessImpl และมี วิธีการที่สำคัญ 3 วิธี ได้แก่

  • onOutputSurface(Surface surface, int imageFormat) กำหนดพื้นที่เอาต์พุต สำหรับผู้ประมวลผลข้อมูล สำหรับ PreviewImageProcessorImpl imageFormat คือพิกเซล เช่น PixelFormat.RGBA_8888

  • onResolutionUpdate(Size size) กำหนดขนาดของรูปภาพอินพุต

  • onImageFormatUpdate(int imageFormat) ตั้งค่ารูปแบบรูปภาพของอินพุต รูปภาพ ปัจจุบันลิงก์ได้เฉพาะ YUV_420_888 เท่านั้น

ตัวประมวลผลการจับภาพ

สำหรับการจับภาพที่ยังคงนิ่งอยู่ คุณสามารถใช้โปรเซสเซอร์ได้โดยการส่งคืน CaptureProcessorImpl โดยใช้ ImageCaptureExtenderImpl.getCaptureProcessor โปรเซสเซอร์คือ มีหน้าที่ประมวลผลรายการรูปภาพที่บันทึกไว้ YUV_420_888 รูป และ TotalCaptureResult อินสแตนซ์และเขียนเอาต์พุตไปยังแพลตฟอร์ม YUV_420_888

คุณสามารถสันนิษฐานว่าการแสดงตัวอย่างเปิดอยู่และทำงานอยู่ก่อนส่ง ยังคงจับภาพคำขอ

ดูขั้นตอนในแผนภาพด้านล่าง

แคปเจอร์โปรเซสเซอร์

รูปที่ 7 ยังคงบันทึกโฟลว์ด้วย CaptureProcessorImpl

  1. Camera2/X ใช้พื้นผิวรูปแบบ YUV_420_888 ในการจับภาพต่อเนื่องเพื่อกำหนดค่า การจับภาพ Camera2/X จะเตรียม CaptureProcessorImpl ด้วยการโทร

    • CaptureProcessorImpl.onImageFormatUpdate() ด้วย YUV_420_888
    • CaptureProcessorImpl.onResolutionUpdate() ตามขนาดรูปภาพที่ป้อน
    • CaptureProcessorImpl.onOutputSurface() ที่มีเอาต์พุต YUV_420_888 แพลตฟอร์ม
  2. ImageCaptureExtenderImpl.getCaptureStages แสดงผลรายการของ CaptureStageImpl โดยที่แต่ละองค์ประกอบจะแมปกับอินสแตนซ์ CaptureRequest ด้วยพารามิเตอร์การจับภาพ ที่ส่งโดย Camera2/X เช่น ถ้าระบบแสดงผลลัพธ์เป็น CaptureStageImpl อินสแตนซ์ Camera2/X จะส่งคำขอจับภาพ 3 รายการพร้อมด้วย พารามิเตอร์การบันทึกที่เกี่ยวข้องโดยใช้ captureBurst API

  3. อิมเมจที่ได้รับและอินสแตนซ์ TotalCaptureResult รายการจะรวมอยู่ด้วยกัน และส่งไปยัง CaptureProcessorImpl เพื่อประมวลผลแล้ว

  4. CaptureProcessorImpl เขียนผลลัพธ์รูปภาพ (รูปแบบ YUV_420_888) ไปยังฟังก์ชัน แพลตฟอร์มเอาต์พุตที่ระบุโดยการเรียก onOutputSurface() Camera2/X แปลง เป็นภาพ JPEG หากจำเป็น

รองรับคีย์และผลลัพธ์ของคำขอบันทึก

นอกจากการแสดงตัวอย่างและจับภาพจากกล้องแล้ว แอปยังสามารถตั้งค่าการซูม พารามิเตอร์แฟลช หรือทริกเกอร์ การแตะเพื่อโฟกัส พารามิเตอร์เหล่านี้อาจไม่ได้ เข้ากันได้กับการติดตั้งส่วนขยายของคุณ

มีการเพิ่มเมธอดต่อไปนี้ลงใน extensions-interface 1.3.0 เพื่ออนุญาต เพื่อแสดงพารามิเตอร์ที่การติดตั้งใช้งานของคุณรองรับ

  • ImageCaptureExtenderImpl.getAvailableCaptureRequestKeys() แสดงผล บันทึกคีย์คำขอที่การติดตั้งใช้งานของคุณรองรับ
  • ImageCaptureExtenderImpl.getAvailableCaptureResultKeys() แสดงผล บันทึกคีย์ผลลัพธ์ที่มีอยู่ในผลลัพธ์การจับภาพ

หาก HAL ของกล้องประมวลผลส่วนขยาย Camera2/X จะดึงข้อมูลการจับภาพ ผลการค้นหาในภาษาCameraCaptureSession.CaptureCallback อย่างไรก็ตาม หาก มีการใช้งานตัวประมวลผล จากนั้น Camera2/X จะดึงผลลัพธ์การบันทึกใน ProcessResultImpl ซึ่งจะส่งไปยัง process() ใน PreviewImageProcessorImpl และ CaptureProcessorImpl คุณเป็นผู้รับผิดชอบในการรายงาน ผลการจับภาพผ่าน ProcessResultImpl ไปยัง Camera2/X

ดูคำจำกัดความของอินเทอร์เฟซ CaptureProcessorImpl ด้านล่างเป็นตัวอย่าง ใน extensions-interface 1.3.0 ขึ้นไป จะมีการเรียก process() ครั้งที่ 2:

Interface CaptureProcessorImpl extends ProcessorImpl {
    // invoked when extensions-interface version < 1.3.0
    void process(Map<Integer, Pair<Image, TotalCaptureResult>> results);
    // invoked when extensions-interface version >= 1.3.0
    void process(Map<Integer, Pair<Image, TotalCaptureResult>> results,
            ProcessResultImpl resultCallback, Executor executor);
}

สำหรับการทำงานทั่วไปของกล้อง เช่น การซูม แตะเพื่อโฟกัส แฟลช และการรับแสง เราขอแนะนำให้รองรับคีย์ต่อไปนี้สำหรับทั้ง ส่งคำขอและบันทึกผลลัพธ์:

  • ซูม
    • CaptureRequest#CONTROL_ZOOM_RATIO
    • CaptureRequest#SCALER_CROP_REGION
  • แตะเพื่อโฟกัส:
    • CaptureRequest#CONTROL_AF_MODE
    • CaptureRequest#CONTROL_AF_TRIGGER
    • CaptureRequest#CONTROL_AF_REGIONS
    • CaptureRequest#CONTROL_AE_REGIONS
    • CaptureRequest#CONTROL_AWB_REGIONS
  • แฟลช
    • CaptureRequest#CONTROL_AE_MODE
    • CaptureRequest#CONTROL_AE_PRECAPTURE_TRIGGER
    • CaptureRequest#FLASH_MODE
  • การชดเชยแสง:
    • CaptureRequest#CONTROL_AE_EXPOSURE_COMPENSATION

สำหรับตัวขยายพื้นฐานที่ใช้เวอร์ชัน 1.2.0 หรือเวอร์ชันก่อนหน้า CameraX Extensions API รองรับคีย์ข้างต้นทั้งหมดอย่างชัดเจน สำหรับ extensions-interface 1.3.0 ทั้ง CameraX และ Camera2 ใช้รายการส่งคืน และรองรับเฉพาะคีย์ที่อยู่ในนั้น ตัวอย่างเช่น หากคุณตัดสินใจส่งคืน เฉพาะ CaptureRequest#CONTROL_ZOOM_RATIO และ CaptureRequest#SCALER_CROP_REGION ในการใช้งาน 1.3.0 จากนั้น หมายความว่าแอปรองรับการซูมเท่านั้นขณะแตะเพื่อโฟกัส แฟลช และเปิดรับแสง ชดเชยไม่ได้

อุปกรณ์ขยายสัญญาณขั้นสูง

Advanced Extender เป็นประเภทการติดตั้งใช้งานของผู้ให้บริการที่ใช้ Camera2 API ประเภท Extender นี้เพิ่มเข้ามาใน extensions-interface 1.2.0 ขึ้นอยู่กับ ผู้ผลิตอุปกรณ์ ส่วนขยายอาจนำไปใช้ในเลเยอร์ของแอป ขึ้นอยู่กับปัจจัยต่อไปนี้

  • การกำหนดค่าสตรีมที่กำหนดเอง: กำหนดค่าสตรีมที่กำหนดเอง เช่น สตรีม RAW หรือมีสตรีมหลายรายการสำหรับรหัสกล้องจริงที่แตกต่างกัน

  • ความสามารถในการส่งคำขอ Camera2: รองรับการโต้ตอบที่ซับซ้อน ลอจิกที่สามารถส่งคำขอการบันทึกพร้อมพารามิเตอร์ซึ่งขึ้นอยู่กับผลลัพธ์ของ คำขอก่อนหน้า

ตัวขยายสัญญาณขั้นสูงให้ Wrapper หรือชั้นกลางเพื่อให้คุณสามารถ ปรับแต่งการกำหนดค่าสตรีมและส่งคำขอจับภาพตามคำขอ

ไฟล์ที่จะนำมาใช้

หากต้องการเปลี่ยนไปใช้การติดตั้งใช้งาน Advanced Extender isAdvancedExtenderImplemented() วิธีใน ExtensionVersionImpl ต้องแสดงผล true สำหรับส่วนขยายแต่ละประเภท OEM ต้องใช้ คลาส Extender ที่เกี่ยวข้อง ไฟล์การใช้งาน Advanced Extender ในแพ็กเกจขั้นสูง

คลาส Extender ที่จะนำไปใช้
กลางคืน advanced/NightAdvancedExtenderImpl.java
HDR advanced/HdrAdvancedExtenderImpl.java
อัตโนมัติ advanced/AutoAdvancedExtenderImpl.java
โบเก้ advanced/BokehAdvancedExtenderImpl.java
รีทัชใบหน้า advanced/BeautyAdvancedExtenderImpl.java

เราใช้ AdvancedExtenderImpl เป็นตัวยึดตำแหน่งในตัวอย่างต่อไปนี้ แทนที่ด้วยชื่อไฟล์ Extender สำหรับส่วนขยายที่คุณ ที่กำลังใช้งานอยู่

มาดูกันว่า Camera2/X เรียกใช้ extensions-interface เพื่อทำเป้าหมาย 3 อย่างนี้ได้อย่างไร ขั้นตอนต่างๆ ของแอป

ขั้นตอนของแอป 1: ตรวจสอบความพร้อมใช้งานของส่วนขยาย

โฟลว์แอปขั้นสูง1

รูปที่ 8 ขั้นตอนของแอป 1 เกี่ยวกับ Advanced Extender

ก่อนอื่น แอปจะตรวจสอบว่าส่วนขยายที่ระบุได้รับการสนับสนุนหรือไม่

ขั้นตอนของแอป 2: ค้นหาข้อมูล

โฟลว์แอปขั้นสูง2

รูปที่ 9 ขั้นตอนของแอป 2 ใน Advanced Extender

หลังจากโทรหา AdvancedExtenderImpl.init() แอปสามารถค้นหา ต่อไปนี้เพื่อดูข้อมูลเกี่ยวกับ AdvancedExtenderImpl:

  • เวลาในการตอบสนองสำหรับการจับภาพยังคงโดยประมาณ: AdvancedExtenderImpl.getEstimatedCaptureLatencyRange() แสดงผลช่วงของ เวลาในการตอบสนองของการบันทึกเพื่อให้แอปประเมินว่าเหมาะสมที่จะ เปิดใช้งานส่วนขยายสำหรับสถานการณ์ปัจจุบัน

  • ความละเอียดที่รองรับสำหรับการแสดงตัวอย่างและภาพนิ่งมีดังนี้

    • AdvancedExtenderImpl.getSupportedPreviewOutputResolutions() แสดงแผนที่ ของรูปแบบรูปภาพลงในรายการขนาดที่รองรับสำหรับรูปแบบพื้นผิวตัวอย่าง และขนาด OEM ต้องรองรับรูปแบบ PRIVATE เป็นอย่างน้อย

    • AdvancedExtenderImpl.getSupportedCaptureOutputResolutions() แสดงผล รูปแบบและขนาดที่รองรับสำหรับแพลตฟอร์มการจับภาพต่อเนื่อง OEM ต้องรองรับทั้ง เอาต์พุตรูปแบบ JPEG และ YUV_420_888

    • AdvancedExtenderImpl.getSupportedYuvAnalysisResolutions() แสดงผล ขนาดที่รองรับสำหรับสตรีมเพิ่มเติม YUV_420_888 เพื่อการวิเคราะห์รูปภาพ หาก ไม่รองรับพื้นผิว YUV สำหรับการวิเคราะห์รูปภาพ getSupportedYuvAnalysisResolutions() ควรแสดงผล null หรือรายการที่ว่างเปล่า

  • คีย์/ผลลัพธ์ของคำขอบันทึกที่ใช้ได้ (เพิ่มใน extensions-interface 1.3.0) Camera2/X จะเรียกเมธอดต่อไปนี้เพื่อเรียกข้อมูลการจับภาพที่รองรับ คีย์คำขอและคีย์ผลลัพธ์จากการใช้งานของคุณ:

    • AdvancedExtenderImpl.getAvailableCaptureRequestKeys
    • AdvancedExtenderImpl.getAvailableCaptureResultKeys

สำหรับข้อมูลเพิ่มเติม โปรดดู รองรับคีย์และผลลัพธ์ของคำขอบันทึก

ขั้นตอนของแอป 3: แสดงตัวอย่าง/ยังคงจับภาพโดยเปิดใช้ส่วนขยาย

AdvancedAppFlow3 ขั้นสูง

รูปที่ 10 ขั้นตอนของแอป 3 เรื่อง Advanced Extender

แผนภาพด้านบนแสดงโฟลว์หลักสำหรับการเริ่มแสดงตัวอย่างและยังคงจับภาพเป็นเวลา ประเภทตัวขยายขั้นสูง มาดูไปทีละขั้นตอนกัน

  1. อินสแตนซ์ SessionProcessorImpl รายการ

    การใช้งาน Advanced Extender หลักคือใน SessionProcessorImpl ซึ่ง มีหน้าที่ในการกำหนดค่าเซสชันที่กำหนดเองและส่ง บันทึกคำขอเพื่อเริ่มการแสดงตัวอย่างและยังคงบันทึกคำขอ มีการเรียก AdvancedExtenderImpl.createSessionProcessor() ให้ส่งคืน SessionProcessorImpl

  2. initSession

    SessionProcessorImpl.initSession() เริ่มต้นเซสชันสำหรับส่วนขยาย ส่วนนี้เป็นที่สำหรับจัดสรรทรัพยากรและแสดงผลการกำหนดค่าเซสชันสำหรับ กำลังเตรียม CameraCaptureSession

    สำหรับพารามิเตอร์อินพุต Camera2/X จะระบุการกำหนดค่าพื้นผิวเอาต์พุต สำหรับการดูตัวอย่าง การจับภาพนิ่ง และการวิเคราะห์รูปภาพ YUV ที่ไม่บังคับ เอาต์พุตนี้ การกำหนดค่าแพลตฟอร์ม (OutputSurfaceImpl) ประกอบด้วยพื้นผิว ขนาด และรูปภาพ รูปแบบที่ดึงมาโดยเมธอดต่อไปนี้ใน AdvancedExtenderImpl:

    • getSupportedPreviewOutputResolutions()
    • getSupportedCaptureOutputResolutions()
    • getSupportedYuvAnalysisResolutions()

    คุณต้องแสดงผลอินสแตนซ์ Camera2SessionConfigImpl ซึ่งประกอบด้วย รายการอินสแตนซ์ Camera2OutputConfigImpl รายการและพารามิเตอร์เซสชันที่ใช้ สำหรับการกำหนดค่า CameraCaptureSession คุณมีหน้าที่รับผิดชอบใน การแสดงรูปภาพกล้องที่ถูกต้องไปยังแพลตฟอร์มเอาต์พุตที่ส่งผ่าน Camera2/X ตัวเลือกในการเปิดใช้เอาต์พุตมีดังนี้

    • การประมวลผลใน HAL ของกล้อง: คุณจะเพิ่มส่วนเอาต์พุตได้โดยตรง เป็น CameraCaptureSession ด้วย SurfaceOutputConfigImpl การใช้งานของคุณ การดำเนินการนี้จะกำหนดค่าพื้นที่เอาต์พุตที่ให้มาให้กับกล้อง และอนุญาตให้ HAL ของกล้องประมวลผลรูปภาพได้
    • กำลังประมวลผลพื้นผิว ImageReader ระดับกลาง (RAW, YUV ฯลฯ): ให้เพิ่ม ระดับกลางของ ImageReader ไปยัง CameraCaptureSession ที่มี อินสแตนซ์ ImageReaderOutputConfigImpl

      คุณต้องประมวลผลภาพระดับกลาง และเขียนภาพผลลัพธ์ลงใน แสดงเอาต์พุต

    • ใช้การแชร์แพลตฟอร์มของ Camera2: ใช้การแชร์พื้นผิวกับแพลตฟอร์มอื่น โดยเพิ่มอินสแตนซ์ Camera2OutputConfigImpl ใดก็ได้ไปยัง getSurfaceSharingOutputConfigs() เมธอดของอีกวิธี Camera2OutputConfigImpl อินสแตนซ์ รูปแบบและขนาดของพื้นผิวจะต้องเป็น เหมือนกัน

    Camera2OutputConfigImpl ทั้งหมด รวมถึง SurfaceOutputConfigImpl และ ImageReaderOutputConfigImpl ต้องมีรหัสที่ไม่ซ้ำกัน (getId()) ซึ่งก็คือ ใช้เพื่อระบุพื้นผิวเป้าหมายและเรียกรูปภาพจาก ImageReaderOutputConfigImpl

  3. onCaptureSessionStart และ RequestProcessorImpl

    เมื่อ CameraCaptureSession เริ่มทำงานและเฟรมเวิร์กของกล้องเรียกใช้ onConfigured() จากนั้น Camera2/X จะเรียกใช้ SessionProcessorImpl.onCaptureSessionStart() ด้วยคำขอ Camera2 Wrapper RequestProcessImpl Camera2/X ใช้ RequestProcessImpl ซึ่งจะทำให้คุณสามารถดำเนินการตามคำขอบันทึก และ ดึงรูปภาพ หากใช้ ImageReaderOutputConfigImpl

    RequestProcessImpl API คล้ายกับ Camera2 CameraCaptureSession API ในแง่ของการดำเนินการตามคำขอ ความแตกต่างมีดังนี้

    • แพลตฟอร์มเป้าหมายจะระบุโดยรหัสของ Camera2OutputConfigImpl
    • ความสามารถในการเรียกรูปภาพของ ImageReader

    คุณสามารถโทรหา RequestProcessorImpl.setImageProcessor() พร้อมระบุ รหัส Camera2OutputConfigImpl สำหรับลงทะเบียนอินสแตนซ์ ImageProcessorImpl รับรูปภาพ

    อินสแตนซ์ RequestProcessImpl จะใช้ไม่ได้หลังจากการเรียกใช้ Camera2/X SessionProcessorImpl.onCaptureSessionEnd()

  4. เริ่มทดลองใช้และถ่ายรูป

    ในการใช้งาน Advanced Extender คุณสามารถส่งคำขอจับภาพได้ ผ่านอินเทอร์เฟซของ RequestProcessorImpl Camera2/X แจ้งให้คุณทราบถึง เริ่มคำขอซ้ำเพื่อดูตัวอย่างหรือลำดับการจับภาพต่อเนื่องตาม กำลังโทรหา SessionProcessorImpl#startRepeating และ SessionProcessorImpl#startCapture ตามลำดับ คุณควรส่งการจับภาพ เพื่อตอบสนองคำขอตัวอย่างและภาพนิ่งเหล่านี้

    Camera2/X ยังตั้งค่าพารามิเตอร์คำขอจับภาพผ่าน SessionProcessorImpl#setParameters คุณต้องตั้งค่าพารามิเตอร์คำขอเหล่านี้ (หากรองรับพารามิเตอร์) ทั้งในคำขอซ้ำและคำขอเดี่ยว

    คุณต้องรองรับอย่างน้อย CaptureRequest.JPEG_ORIENTATION และ CaptureRequest.JPEG_QUALITY extensions-interface 1.3.0 รองรับคำขอ และคีย์ผลลัพธ์ ซึ่งแสดงด้วยวิธีการต่อไปนี้

    • AdvancedExtenderImpl.getAvailableCaptureRequestKeys()
    • AdvancedExtenderImpl.getAvailableCaptureResultKeys()

    เมื่อนักพัฒนาแอปตั้งค่าคีย์ในรายการ getAvailableCaptureRequestKeys คุณต้องเปิดใช้พารามิเตอร์ และตรวจสอบว่าได้บันทึก ผลลัพธ์มีคีย์ในรายการ getAvailableCaptureResultKeys

  5. startTrigger

    ระบบเรียกใช้ SessionProcessorImpl.startTrigger() เพื่อเริ่มทริกเกอร์ดังกล่าว ในฐานะ CaptureRequest.CONTROL_AF_TRIGGER และ CaptureRequest.CONTROL_AE_PRECAPTURE_TRIGGER คุณไม่จำเป็นต้องสนใจ บันทึกคีย์คำขอที่ไม่ได้โฆษณา AdvancedExtenderImpl.getAvailableCaptureRequestKeys()

    รองรับ startTrigger() ตั้งแต่ extensions-interface 1.3.0 ทั้งนี้ ทำให้แอปพลิเคชันสามารถใช้การแตะเพื่อโฟกัสและแฟลชพร้อมด้วยส่วนขยายได้

  6. ล้างข้อมูล

    เมื่อจบเซสชันการจับภาพ มีการเรียกใช้ SessionProcessorImpl.onCaptureSessionEnd() ก่อนปิด CameraCaptureSession หลังจากเซสชันการจับภาพปิดลงแล้ว deInitSession() ดำเนินการทำความสะอาด

รองรับการแสดงตัวอย่าง การจับภาพนิ่ง และการวิเคราะห์รูปภาพ

คุณควรใช้ส่วนขยายสำหรับทั้งตัวอย่างและยังบันทึกกรณีการใช้งานได้ อย่างไรก็ตาม หากเวลาในการตอบสนองสูงเกินกว่าที่จะแสดงตัวอย่างได้ราบรื่น ให้ทำดังนี้ ให้ใช้ส่วนขยายเฉพาะสำหรับการจับภาพนิ่งเท่านั้น

สำหรับประเภทตัวขยายพื้นฐาน ไม่ว่าจะเปิดใช้ส่วนขยายสำหรับการแสดงตัวอย่างหรือไม่ก็ตาม คุณต้องใช้ทั้ง ImageCaptureExtenderImpl และ PreviewExtenderImpl สำหรับส่วนขยายที่กำหนด บ่อยครั้งที่แอปใช้สตรีม YUV เพื่อวิเคราะห์ เนื้อหาที่เป็นรูปภาพ เช่น การค้นหาคิวอาร์โค้ดหรือข้อความ เพื่อรองรับกรณีการใช้งานนี้ได้ดียิ่งขึ้น คุณควรสนับสนุนชุดค่าผสมของสตรีม ตัวอย่าง โหมดจับภาพต่อเนื่อง และ สตรีม YUV_420_888 สำหรับการกำหนดค่า CameraCaptureSession ซึ่งหมายความว่า คือหากคุณใช้โปรเซสเซอร์ คุณจะต้องรองรับสตรีม การผสมผสานของสตรีม YUV_420_888 3 รายการ

สำหรับตัวขยายสัญญาณขั้นสูง Camera2/X จะส่งเอาต์พุต 3 แพลตฟอร์มไปยัง SessionProcessorImpl.initSession() สาย แพลตฟอร์มเอาต์พุตเหล่านี้มีไว้เพื่อแสดงตัวอย่าง การจับภาพนิ่ง และการวิเคราะห์รูปภาพตามลำดับ คุณต้องตรวจสอบว่าการแสดงตัวอย่าง และยังคงจับภาพเอาต์พุตที่แสดงเอาต์พุตที่ถูกต้อง แต่สำหรับรูปภาพ เอาต์พุตการวิเคราะห์ ตรวจสอบให้แน่ใจว่าใช้งานได้เฉพาะเมื่อไม่ใช่ค่าว่าง หาก ไม่สามารถรองรับสตรีมการวิเคราะห์รูปภาพ คุณสามารถแสดงผล รายการใน AdvancedExtenderImpl.getSupportedYuvAnalysisResolutions() ช่วงเวลานี้ ตรวจสอบว่าพื้นผิวของเอาต์พุตการวิเคราะห์รูปภาพเป็นค่าว่างเสมอ SessionProcessorImpl.initSession()

รองรับการจับภาพวิดีโอ

สถาปัตยกรรมส่วนขยายกล้องในปัจจุบันรองรับเฉพาะการแสดงตัวอย่างและยังคง บันทึกกรณีการใช้งาน เราไม่รองรับการเปิดใช้ส่วนขยายใน MediaCodec หรือแพลตฟอร์ม MediaRecorder สำหรับบันทึกวิดีโอ อย่างไรก็ตาม มีความเป็นไปได้ เพื่อให้แอปบันทึกเอาต์พุตตัวอย่าง

การรองรับแพลตฟอร์ม MediaCodec และ MediaRecorder อยู่ระหว่างการตรวจสอบ

ข้อมูลเมตาเฉพาะส่วนขยาย

สำหรับ Android 14 ขึ้นไป ข้อมูลเมตาเฉพาะส่วนขยาย ช่วยให้ไคลเอ็นต์ส่วนขยายกล้องตั้งค่าและรับการจับภาพเฉพาะส่วนขยายได้ การตั้งค่าคำขอและผลลัพธ์ โดยเฉพาะอย่างยิ่ง ส่วนขยายกล้อง ลูกค้าสามารถใช้พารามิเตอร์คำขอบันทึก EXTENSION_STRENGTH เพื่อควบคุม ความรัดกุมของส่วนขยายและผลลัพธ์การบันทึก EXTENSION_CURRENT_TYPE เป็น ระบุประเภทส่วนขยายที่เปิดใช้

บันทึกคำขอ

EXTENSION_STRENGTH พารามิเตอร์คำขอบันทึก ควบคุมความแรงของเอฟเฟกต์หลังการประมวลผลส่วนขยาย ฟิลด์ ผลการบันทึกจะมีค่าความเข้มงวดเริ่มต้นหากไม่ได้ตั้งค่าพารามิเตอร์นี้ จากลูกค้าอย่างชัดเจน คุณใช้พารามิเตอร์ต่อไปนี้ได้ ประเภทส่วนขยาย:

  • BOKEH: ควบคุมปริมาณการเบลอ
  • HDR และ NIGHT: ควบคุมปริมาณรูปภาพที่รวมเข้าด้วยกันและความสว่างของ ภาพสุดท้าย
  • FACE_RETOUCH: ควบคุมปริมาณการเพิ่มประสิทธิภาพและผิว ปรับให้เรียบ

ช่วงที่รองรับพารามิเตอร์ EXTENSION_STRENGTH อยู่ระหว่าง 0 ถึง 100 โดยมี 0 ระบุว่าไม่มีการประมวลผลส่วนขยายหรือการส่งผ่านแบบง่ายๆ และ 100 บ่งชี้ระดับการขยายสูงสุดของเอฟเฟกต์การประมวลผล

หากต้องการเพิ่มการรองรับ EXTENSION_STRENGTH โปรดใช้ผู้ให้บริการ API พารามิเตอร์ที่เจาะจงที่เปิดตัวในไลบรารีส่วนขยายเวอร์ชัน 1.3.0 ของ Google สำหรับข้อมูลเพิ่มเติม โปรดดู getAvailableCaptureRequestKeys()

บันทึกผลลัพธ์

EXTENSION_CURRENT_TYPE การบันทึกผลลัพธ์ช่วยให้การติดตั้งใช้งานส่วนขยายแจ้งลูกค้าเกี่ยวกับ ประเภทส่วนขยาย

เนื่องจากส่วนขยายที่ใช้ประเภท AUTO จะสลับระหว่างส่วนขยายแบบไดนามิก ประเภท เช่น HDR และ NIGHT ขึ้นอยู่กับเงื่อนไขของฉาก กล้อง แอปส่วนขยายสามารถใช้ EXTENSION_CURRENT_TYPE เพื่อแสดงข้อมูลเกี่ยวกับ ส่วนขยายปัจจุบันที่เลือกโดยส่วนขยาย AUTO

ค่าประมาณเวลาในการตอบสนองแบบเรียลไทม์ยังคงบันทึก

สำหรับ Android 14 ขึ้นไป ไคลเอ็นต์ส่วนขยายกล้อง สามารถค้นหาแบบเรียลไทม์ ยังคงบันทึกค่าประมาณเวลาในการตอบสนอง โดยอิงตามสถานการณ์และ สภาพแวดล้อมที่ใช้ getRealtimeStillCaptureLatency() ช่วงเวลานี้ จะให้ค่าประมาณที่แม่นยำมากกว่า getEstimatedCaptureLatencyRangeMillis() แอปสามารถเลือกข้ามการขยายได้ ทั้งนี้ขึ้นอยู่กับเวลาในการตอบสนองโดยประมาณ การประมวลผล หรือเพื่อแสดงตัวบ่งชี้เพื่อแจ้งให้ผู้ใช้ทราบเกี่ยวกับ การดำเนินการอยู่

CameraExtensionSession.StillCaptureLatency latency;

latency = extensionSession.getRealtimeStillCaptureLatency();

// The capture latency from ExtensionCaptureCallback#onCaptureStarted() until ExtensionCaptureCallback#onCaptureProcessStarted().

latency.getCaptureLatency();

// The processing latency from  ExtensionCaptureCallback#onCaptureProcessStarted() until  the processed frame returns to the client.

latency.getProcessingLatency();

ในการสนับสนุนแบบเรียลไทม์ซึ่งบันทึกค่าประมาณของเวลาในการตอบสนอง ให้ใช้ ดังต่อไปนี้

บันทึก Callback ความคืบหน้าในการประมวลผล

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

แอปสามารถใช้โค้ดต่อไปนี้เพื่อผสานรวมฟีเจอร์นี้ได้

import android.hardware.camera2.CameraExtensionSession.
ExtensionCaptureCallback;

{
…
  class AppCallbackImpl extends ExtensionCaptureCallback {
…
    @Override
    public void onCaptureProcessProgressed(
      @NonNull CameraExtensionSession session,
      @NonNull CaptureRequest request,
      @IntRange(from = 0, to = 100) int progress) {
      // Update app UI with current progress
    }
  }
…
}

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

ยังคงจับภาพ Postview อยู่

สำหรับ Android 14 ขึ้นไป ส่วนขยายกล้องสามารถ ให้ Postview (แสดงตัวอย่างรูปภาพ) โดยใช้ setPostviewOutputConfiguration เพื่อปรับปรุงประสบการณ์ของผู้ใช้ แอปสามารถแสดงรูปภาพหลังดูโฆษณา ตัวยึดตำแหน่งเมื่อส่วนขยายมีเวลาในการตอบสนองเพิ่มขึ้น และแทนที่รูปภาพดังกล่าวเมื่อมีรูปภาพสุดท้ายพร้อมใช้งาน แอปสามารถกำหนดค่า และออกคำขอบันทึกมุมมองโพสต์โดยใช้รหัสอ้างอิงต่อไปนี้

{
…
if (!CameraExtensionCharacteristics.isPostviewAvailable()) {
    continue;
}
…
ExtensionSessionConfiguration extensionConfiguration = new
        ExtensionSessionConfiguration(
                CameraExtensionCharacteristics.EXTENSION_NIGHT,
                outputConfig,
                backgroundExecutor,
                extensionSessionStateCallback
    );

extensionConfiguration.setPostviewOutputConfiguration(
    postviewImageOutput);
…
CaptureRequest.Builder captureRequestBuilder =
    cameraDevice.createCaptureRequest(
        CameraDevice.TEMPLATE_STILL_CAPTURE);
captureRequestBuilder.addTarget(stillImageReader.getSurface());
captureRequestBuilder.addTarget(postviewImageSurface);

CaptureRequest captureRequest = captureRequestBuilder.build();
…
}

ในการสนับสนุนการบันทึกการดูโพสต์ต่อเนื่องได้ การใช้งานผู้ให้บริการของคุณต้องใช้ ดังต่อไปนี้:

รองรับเอาต์พุต SurfaceView

สำหรับ Android 14 ขึ้นไป ไคลเอ็นต์ส่วนขยายกล้อง สามารถใช้เส้นทางการแสดงผลการแสดงตัวอย่างที่ให้พลังงานและประสิทธิภาพได้โดยการลงทะเบียน SurfaceView อินสแตนซ์ของตัวอย่างเอาต์พุตสำหรับคำขอซ้ำ

หากต้องการรองรับเอาต์พุต SurfaceView คุณต้องติดตั้งส่วนขยายผู้ให้บริการ สามารถสตรีมและเอาต์พุตตัวอย่างไปยังอินสแตนซ์ SurfaceView ได้ ถึง เพื่อยืนยันว่ามีการรองรับ ให้เรียกใช้ SurfaceViewExtensionPreviewTest.java โมดูล CTS

ประเภทเซสชันเฉพาะผู้ให้บริการ

ฟีเจอร์นี้ช่วยให้การติดตั้งใช้งานส่วนขยายของผู้ให้บริการเลือกประเภทเซสชันเฉพาะผู้ให้บริการ ซึ่งจะตั้งค่าในเซสชันการจับภาพภายในกล้องแทนค่าเริ่มต้น

ฟีเจอร์นี้ทำงานภายในเฟรมเวิร์กและสแต็กผู้ให้บริการได้อย่างสมบูรณ์ และไม่มีผลกระทบต่อ API ที่ผู้ใช้มองเห็นได้/แบบสาธารณะ

หากต้องการเลือกประเภทเซสชันเฉพาะผู้ให้บริการ ให้ใช้รายการต่อไปนี้สำหรับไลบรารีส่วนขยาย * ExtenderStateListener.onSessionType() สำหรับส่วนขยายพื้นฐาน * Camera2SessionConfigImpl.getSessionType() สำหรับส่วนขยายขั้นสูง

ประวัติเวอร์ชันอินเทอร์เฟซของส่วนขยาย

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

เวอร์ชัน ฟีเจอร์ที่เพิ่มเข้ามา
1.0.0
  • การยืนยันเวอร์ชัน
    • ExtensionVersionImpl
  • ตัวขยายสัญญาณพื้นฐาน
    • PreviewExtenderImpl
    • ImageCaptureExtenderImpl
    • Processor
      • PreviewImageProcessorImpl
      • CaptureProcessorImpl
      • RequestUpdateProcessorImpl
1.1.0
  • การเริ่มต้นไลบรารี
    • InitializerImpl
  • แสดงความละเอียดที่รองรับ
    • PreviewExtenderImpl.getSupportedResolutions
    • ImageCaptureExtenderImpl.getSupportedResolutions
1.2.0
  • ตัวขยายสัญญาณขั้นสูง
    • AdvancedExtenderImpl
    • SessionProcessorImpl
  • รับเวลาในการตอบสนองการบันทึกโดยประมาณ
    • ImageCaptureExtenderImpl.getEstimatedCaptureLatencyRange
1.3.0
  • แสดงคีย์คำขอบันทึก/คีย์ผลลัพธ์ที่รองรับ
    • ImageCaptureExtenderImpl.getAvailableCaptureRequestKeys และ getAvailableCaptureResultKeys
    • AdvancedExtenderImpl.getAvailableCaptureRequestKeys และ getAvailableCaptureResultKeys
    • การโทร process() ใหม่ที่รับสาย ProcessResultImpl ในอีก PreviewImageProcessorImpl และ CaptureProcessorImpl
    • รองรับคำขอประเภททริกเกอร์
      • AdvancedExtenderImpl.startTrigger
1.4.0
  • ข้อมูลเมตาเฉพาะส่วนขยาย
  • ยังคงบันทึกค่าประมาณเวลาในการตอบสนองแบบไดนามิก
  • บันทึก Callback ความคืบหน้าในการประมวลผล
  • ยังคงจับภาพ Postview อยู่
  • รองรับเอาต์พุต SurfaceView
  • ประเภทเซสชันเฉพาะผู้ให้บริการ

การใช้งานข้อมูลอ้างอิง

การใช้งานไลบรารีผู้ให้บริการ OEM อ้างอิงต่อไปนี้มีอยู่ใน frameworks/ex

  • advancedSample: การใช้งาน Advanced Extender เบื้องต้น

  • sample: การใช้งานพื้นฐานของตัวขยายสัญญาณพื้นฐาน

  • service_based_sample: การใช้งานที่สาธิตวิธีการโฮสต์ ส่วนขยายกล้องใน Service การใช้งานนี้มีคอมโพเนนต์ต่อไปนี้

    • oem_library: ไลบรารี OEM ของส่วนขยายกล้องถ่ายรูปสำหรับ API ส่วนขยายของ Camera2 และ CameraX ที่ใช้ Extensions-Interface วิธีนี้เป็นเหมือนการข้ามผ่าน โอนสายจาก Extensions-Interface ไปยังบริการ ไลบรารีนี้ นอกจากนี้ยังมีไฟล์ AIDL และคลาส Wrapper ที่ใช้สื่อสารกับ service.

      Advanced Extender จะเปิดใช้โดยค่าเริ่มต้น หากต้องการเปิดใช้งานตัวขยายพื้นฐาน เปลี่ยน ExtensionsVersionImpl#isAdvancedExtenderImplemented เพื่อส่งคืน false

    • extensions_service: ตัวอย่างการใช้งานบริการส่วนขยาย เพิ่มการติดตั้งใช้งาน ที่นี่ อินเทอร์เฟซที่จะใช้ในบริการคล้ายกัน เป็น Extensions-Interface ตัวอย่างเช่น การใช้ IAdvancedExtenderImpl.Stub ดำเนินการเช่นเดียวกับ AdvancedExtenderImpl ImageWrapper และ TotalCaptureResultWrapper เพื่อทำให้ Image และ TotalCaptureResult เป็นพาร์เซลได้

ตั้งค่าไลบรารีผู้ให้บริการในอุปกรณ์

ไลบรารีของผู้ให้บริการ OEM ไม่ได้สร้างไว้ในแอป แอปโหลดจากอุปกรณ์ ที่รันไทม์โดย Camera2/X ใน CameraX แท็ก <uses-library> จะประกาศ ไลบรารี androidx.camera.extensions.impl ซึ่งระบุไว้ในฟิลด์ AndroidManifest.xml ของไลบรารี camera-extensions เป็นทรัพยากร Dependency ของ CameraX และต้องเป็น โหลดขณะรันไทม์ ใน Camera2 เฟรมเวิร์กจะโหลดบริการส่วนขยายที่ ก็ประกาศว่าโหลด<uses-library>เหมือนกัน ไลบรารี androidx.camera.extensions.impl ขณะรันไทม์

วิธีนี้ช่วยให้แอปของบุคคลที่สามที่ใช้ส่วนขยายโหลด OEM ได้โดยอัตโนมัติ ไลบรารีของผู้ให้บริการ ไลบรารี OEM มีการทำเครื่องหมายเป็นไม่บังคับเพื่อให้แอปทำงานในอุปกรณ์ได้ ที่ไม่มีไลบรารีอยู่ในอุปกรณ์ Camera2/X จะจัดการลักษณะการทำงานนี้โดยอัตโนมัติเมื่อแอปพยายามใช้กล้อง ตราบใดที่ผู้ผลิตอุปกรณ์ได้วางไลบรารี OEM ไว้ เพื่อให้แอปค้นพบอุปกรณ์ได้

วิธีตั้งค่าไลบรารี OEM ในอุปกรณ์

  1. เพิ่มไฟล์สิทธิ์ ซึ่งแท็ก <uses-library> จำเป็นต้องใช้ โดยใช้รูปแบบต่อไปนี้ /etc/permissions/ANY_FILENAME.xml สำหรับ ตัวอย่างเช่น /etc/permissions/camera_extensions.xml ไฟล์ใน ไดเรกทอรีให้การแมปไลบรารีที่มีชื่อใน <uses-library> กับ เส้นทางไฟล์จริงในอุปกรณ์ได้
  2. ใช้ตัวอย่างด้านล่างเพื่อเพิ่มข้อมูลที่จำเป็นลงในไฟล์

    • name ต้องเป็น androidx.camera.extensions.impl เนื่องจากเท่ากับ ไลบรารีที่ CameraX ค้นหา
    • file คือเส้นทางสัมบูรณ์ของไฟล์ที่มีส่วน การใช้ส่วนขยาย (เช่น /system/framework/androidx.camera.extensions.impl.jar)
    <?xml version="1.0" encoding="utf-8"?>
    <permissions>
        <library name="androidx.camera.extensions.impl"
                 file="OEM_IMPLEMENTED_JAR" />
    </permissions>
    

ใน Android 12 ขึ้นไป อุปกรณ์ที่รองรับ CameraX ส่วนขยายต้องตั้งค่าพร็อพเพอร์ตี้ ro.camerax.extensions.enabled เป็น true ซึ่งช่วยให้สอบถามว่าอุปกรณ์รองรับส่วนขยายหรือไม่ โดยเพิ่มบรรทัดต่อไปนี้ลงในไฟล์ Device create แล้ว

PRODUCT_VENDOR_PROPERTIES += \
    ro.camerax.extensions.enabled=true \

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

เพื่อทดสอบการใช้งานไลบรารีผู้ให้บริการ OEM ในช่วง ของการพัฒนาซอฟต์แวร์ ให้ใช้แอปตัวอย่างที่ androidx-main/camera/integration-tests/extensionstestapp/, ซึ่งทำงานผ่านส่วนขยายผู้ให้บริการต่างๆ

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

โหมดฉากขยายเทียบกับส่วนขยายกล้อง

สำหรับส่วนขยายโบเก้ นอกจากการแสดงโดยใช้ส่วนขยายกล้องแล้ว สามารถแสดงส่วนขยายโดยใช้โหมดฉากขยาย ซึ่งเปิดใช้งานผ่าน เวลา CONTROL_EXTENDED_SCENE_MODE ดูรายละเอียดการใช้งานเพิ่มเติมได้ที่โบเก้กล้อง

โหมดฉากขยายมีข้อจำกัดน้อยกว่าเมื่อเทียบกับส่วนขยายกล้องสำหรับ แอป Camera2 ตัวอย่างเช่น คุณสามารถเปิดใช้โหมดฉากขยายได้ใน อินสแตนซ์ CameraCaptureSession ปกติที่รองรับสตรีมที่ยืดหยุ่น ชุดค่าผสมและบันทึกพารามิเตอร์คำขอ ในทางตรงกันข้าม ส่วนขยายกล้อง รองรับสตรีมประเภทคงที่เท่านั้นและรองรับการจับภาพแบบจำกัด พารามิเตอร์คำขอ

ข้อเสียของโหมดฉากแบบขยายคือ คุณสามารถใช้งานในโหมดนี้ HAL ของกล้อง ซึ่งหมายความว่าต้องได้รับการยืนยันว่าใช้งานได้กับทุกผลิตภัณฑ์ การควบคุมแบบออร์แกนิกที่นักพัฒนาแอปใช้ได้

เราขอแนะนำให้รับแสงโบเก้โดยใช้ทั้งโหมดฉากแบบขยายและกล้อง ส่วนขยายเนื่องจากแอปอาจต้องการใช้ API บางอย่างเพื่อเปิดใช้โบเก้ เราขอแนะนำให้ใช้โหมดฉากแบบขยายก่อน เนื่องจากโหมดนี้ ซึ่งเป็นวิธีที่ยืดหยุ่นสำหรับการเปิดใช้ส่วนขยายโบเก้ จากนั้นคุณจะติดตั้งใช้งาน อินเทอร์เฟซของส่วนขยายกล้องที่ใช้โหมดฉากแบบขยาย หากติดตั้งใช้งาน โบเก้ใน HAL ของกล้องนั้นทำได้ยาก เช่น เนื่องจากต้องมีการโพสต์ ที่ทำงานในเลเยอร์แอปเพื่อประมวลผลภาพ ขอแนะนำให้ใช้ ส่วนขยายโบเก้โดยใช้อินเทอร์เฟซของส่วนขยายกล้อง

คำถามที่พบบ่อย

ระดับ API มีข้อจำกัดไหม

ใช่ ทั้งนี้ขึ้นอยู่กับชุดฟีเจอร์ Android API ที่ OEM กำหนด การใช้งานไลบรารีของผู้ให้บริการ ตัวอย่างเช่น ExtenderStateListener.onPresetSession() ใช้ SessionConfiguration.setSessionParameters() เพื่อกำหนดชุดแท็กพื้นฐาน การเรียกนี้ใช้ได้เฉพาะในระดับ API เท่านั้น 28 ปีขึ้นไป สำหรับรายละเอียดเกี่ยวกับวิธีอินเทอร์เฟซเฉพาะ ให้ดูที่ เอกสารอ้างอิง API