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

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

ไฟล์ 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

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

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

คลาสขยายเวลาช่วงกลางคืน (ติดตั้งใช้งานหากระบบรองรับการขยายเวลาช่วงกลางคืน)

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

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

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

คลาส HDR Extender (ติดตั้งใช้งานหากรองรับส่วนขยาย 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 Extension API จะรายงานให้แอปทราบว่าส่วนขยายไม่พร้อมใช้งาน

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

กระแสหลัก

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

เพื่อสะดวกในการเรียก
  1. การยืนยันเวอร์ชัน:

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

  2. การเริ่มต้นใช้งานคลังผู้ให้บริการ:

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

  3. สร้างอินสแตนซ์คลาส Extender:

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

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

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

    • NightImageCaptureExtenderImpl.java
    • NightPreviewExtenderImpl.java

    และสำหรับประเภทตัวขยายขั้นสูง ให้ทำดังนี้

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

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

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

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

  6. ข้อมูลการค้นหา:

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

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

หากเวอร์ชันหลักของ extension-interface ระหว่าง 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 stream และส่งคำขอจับภาพตามต้องการ

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

ตัวขยายสัญญาณพื้นฐาน ตัวขยายสัญญาณขั้นสูง
การกำหนดค่าสตรีม คงที่
แสดงตัวอย่าง: 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 จะเริ่มต้นและแสดงผลการกำหนดค่าเซสชัน Camera2 ที่ปรับแต่งสำหรับการสร้างเซสชันการจับภาพ
  • 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 ขึ้นไป

ขั้นตอนการทํางานของแอป

ตารางต่อไปนี้แสดงขั้นตอนการเรียก API ของส่วนขยายกล้องที่สอดคล้องกันสำหรับแอป 3 ประเภท แม้ว่า Camera2/X จะมี 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, ...)

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

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

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

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

BasicExtenderAppFlow2

รูปที่ 4 ขั้นตอนการส่งแอป 2 ใน Basic Extender

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

  • ช่วงเวลาในการตอบสนองในการจับภาพนิ่ง: 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 ที่มีพารามิเตอร์การจับภาพ Camera2/X จะส่งคำขอ 1 รายการที่มีพารามิเตอร์การจับภาพเหล่านี้ทันทีเพื่อแจ้ง 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 สำหรับการแสดงตัวอย่าง

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

PreviewProcessor

รูปที่ 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

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

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

CaptureProcessor

รูปที่ 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 3 รายการ 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() ครั้งที่สองจะเรียกให้แสดงผลดังนี้

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
  • Flash:
    • CaptureRequest#CONTROL_AE_MODE
    • CaptureRequest#CONTROL_AE_PRECAPTURE_TRIGGER
    • CaptureRequest#FLASH_MODE
  • การชดเชยแสง:
    • CaptureRequest#CONTROL_AE_EXPOSURE_COMPENSATION

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

ตัวขยายสัญญาณขั้นสูง

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

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

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

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

ไฟล์ที่จะติดตั้งใช้งาน

หากต้องการเปลี่ยนไปใช้การติดตั้งใช้งานตัวขยายขั้นสูง isAdvancedExtenderImplemented() method ใน ExtensionVersionImpl ต้องแสดงผลเป็น true OEM ต้องใช้คลาส 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: ตรวจสอบความพร้อมใช้งานของส่วนขยาย

AdvancedAppFlow1

รูปที่ 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() ด้วย RequestProcessImpl ซึ่งเป็น Wrapper คำขอของ Camera2 Camera2/X ใช้ RequestProcessImpl ซึ่งช่วยให้คุณส่งคำขอจับภาพและเรียกดูรูปภาพ หากใช้ ImageReaderOutputConfigImpl

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

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

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

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

  4. เริ่มแสดงตัวอย่างและถ่ายภาพ

    ในการใช้งานตัวขยายขั้นสูง คุณจะส่งคำขอการจับภาพผ่านอินเทอร์เฟซ 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 เพื่อให้รองรับ Use Case นี้ได้ดีขึ้น ซึ่งหมายความว่าหากใช้โปรเซสเซอร์ คุณจะต้องรองรับการรวมสตรีมของสตรีม YUV_420_888 3 รายการ

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

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

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

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

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

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

บันทึกคำขอ

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

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

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

หากต้องการเพิ่มการรองรับ EXTENSION_STRENGTH ให้ใช้ API พารามิเตอร์เฉพาะผู้ให้บริการที่เปิดตัวในเวอร์ชัน 1.3.0 ของอินเทอร์เฟซไลบรารีส่วนขยาย ดูข้อมูลเพิ่มเติมได้ที่ 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();

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

บันทึกการเรียกกลับความคืบหน้าการประมวลผล

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

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

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
    }
  }

}

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

ภาพนิ่งหลังดู

สำหรับ Android 14 ขึ้นไป ส่วนขยายกล้องสามารถระบุภาพหลังดู (ภาพตัวอย่าง) ได้โดยใช้ 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.javaCTS

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

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

ฟีเจอร์นี้ทํางานภายในเฟรมเวิร์กและสแต็กของผู้ให้บริการโดยสมบูรณ์ และไม่ส่งผลกระทบต่อ 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
  • AdvancedExtender
    • AdvancedExtenderImpl
    • SessionProcessorImpl
  • รับเวลาในการตอบสนองการบันทึกโดยประมาณ
    • ImageCaptureExtenderImpl.getEstimatedCaptureLatencyRange
1.3.0
  • แสดงคีย์คำขอการบันทึก/คีย์ผลลัพธ์ที่รองรับ
    • ImageCaptureExtenderImpl.getAvailableCaptureRequestKeys และ getAvailableCaptureResultKeys
    • AdvancedExtenderImpl.getAvailableCaptureRequestKeys และ getAvailableCaptureResultKeys
    • การโทร process() ใหม่ที่รับสาย ProcessResultImpl ในอีก PreviewImageProcessorImpl และ CaptureProcessorImpl
    • ส่งคำขอประเภททริกเกอร์การสนับสนุน
      • AdvancedExtenderImpl.startTrigger
1.4.0
  • ข้อมูลเมตาเฉพาะส่วนขยาย
  • ค่าประมาณเวลาในการตอบสนองของการจับภาพนิ่งแบบไดนามิก
  • บันทึกการเรียกกลับความคืบหน้าการประมวลผล
  • ยังคงจับภาพ Postview อยู่
  • การรองรับเอาต์พุต SurfaceView
  • ประเภทเซสชันเฉพาะผู้ให้บริการ

การใช้งานอ้างอิง

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

  • advancedSample: การติดตั้งใช้งานขั้นพื้นฐานของ Advanced Extender

  • sample: การติดตั้งใช้งานขั้นพื้นฐานของ Basic Extender

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

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

      Advanced Extender จะเปิดใช้โดยค่าเริ่มต้น หากต้องการเปิดใช้ตัวขยายพื้นฐาน ให้เปลี่ยน ExtensionsVersionImpl#isAdvancedExtenderImplemented เป็น return 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