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

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

Mainflow

รูปที่ 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() ใน Basic Extender หรือเรียก initSession() ใน Advanced Extender

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

    • NightImageCaptureExtenderImpl.java
    • NightPreviewExtenderImpl.java

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

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

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

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

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

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

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

  7. เปิดใช้ส่วนขยายในอุปกรณ์ขยายระยะสัญญาณ

    คลาส 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 ประเภท ได้แก่ ตัวขยายพื้นฐานและตัวขยายขั้นสูง ระบบรองรับ Advanced Extender มาตั้งแต่extensions-interface 1.2.0

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

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

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

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

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

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

ตารางต่อไปนี้แสดงคลาส Extender ที่ OEM ต้องใช้สำหรับส่วนขยายแต่ละรายการ

คลาสส่วนขยายที่จะนำไปใช้
กลางคืน 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)

BasicExtenderAppFlow3

รูปที่ 5 ขั้นตอนการทํางานของแอป 3 ในอุปกรณ์ขยายสัญญาณพื้นฐาน

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

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

เมื่อกําหนดค่า CameraCaptureSession แล้ว Camera2/X จะเรียกใช้ onPresetSession เพื่อรับพารามิเตอร์เซสชัน หลังจากกําหนดค่าเซสชันการจับภาพเรียบร้อยแล้ว Camera2/X จะเรียกใช้ onEnableSession ซึ่งจะแสดงผลCaptureStageImpl อินสแตนซ์ที่มีพารามิเตอร์การจับภาพ Camera2/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 สำหรับการแสดงตัวอย่าง

    ดูขั้นตอนในภาพต่อไปนี้

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 รองรับคีย์ข้างต้นทั้งหมดอย่างชัดเจนผ่าน Extensions 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 ที่เกี่ยวข้องสำหรับส่วนขยายแต่ละประเภท ไฟล์การติดตั้งใช้งาน Advanced Extender จะอยู่ในแพ็กเกจ advanced

คลาส 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: ค้นหาข้อมูล

AdvancedAppFlow2

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

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

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

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

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

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