ผู้ผลิตอุปกรณ์สามารถแสดงส่วนขยาย เช่น โบเก้ โหมดกลางคืน และ 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 (ใช้หากรองรับส่วนขยาย HDR)
- HdrImageCaptureExtenderImpl.java
- HdrPreviewExtenderImpl.java
- advanced/HdrAdvancedExtenderImpl.java
คลาสตัวขยายการรีทัชใบหน้า (ใช้หากส่วนขยายการรีทัชใบหน้ารองรับ)
- BeautyImageCaptureExtenderImpl.java
- BeautyPreviewExtenderImpl.java
- advanced/BeautyAdvancedExtenderImpl.java
ยูทิลิตี (ไม่บังคับ ลบได้)
- advanced/Camera2OutputConfigImplBuilder.java
- advanced/Camera2SessionConfigImplBuilder.java
คุณไม่จำเป็นต้องระบุการติดตั้งใช้งานสำหรับส่วนขยายทุกรายการ หากไม่ได้ใช้ส่วนขยาย ให้ตั้งค่า isExtensionAvailable() เพื่อแสดงผล false หรือ
นำคลาส Extender ที่เกี่ยวข้องออก API ของส่วนขยาย Camera2 และ CameraX
จะรายงานต่อแอปว่าส่วนขยายไม่พร้อมใช้งาน
มาดูวิธีที่ Camera2 และ CameraX Extensions API โต้ตอบกับ ไลบรารีของผู้ให้บริการเพื่อเปิดใช้ส่วนขยายกัน แผนภาพต่อไปนี้แสดงโฟลว์แบบครบวงจรโดยใช้ส่วนขยาย Night เป็นตัวอย่าง
 
 
รูปที่ 2 การติดตั้งใช้งานส่วนขยายกลางคืน
- การยืนยันเวอร์ชัน: - การเรียกใช้ Camera2/X - ExtensionVersionImpl.checkApiVersion()เพื่อให้มั่นใจว่าเวอร์ชัน- extensions-interfaceที่ OEM นำมาใช้จะเข้ากันได้กับ Camera2/X เวอร์ชันที่รองรับ
- การเริ่มต้นใช้งานไลบรารีของผู้ให้บริการ: - InitializerImplมีเมธอด- init()ที่เริ่มต้นไลบรารีของผู้ให้บริการ Camera2/X จะทำการเริ่มต้นให้เสร็จสมบูรณ์ก่อนที่จะเข้าถึงคลาส Extender
- สร้างอินสแตนซ์ของคลาส Extender: - สร้างอินสแตนซ์ของคลาส Extender สำหรับส่วนขยาย โดยตัวขยายมี 2 ประเภท ได้แก่ ตัวขยายพื้นฐานและตัวขยายขั้นสูง คุณต้องใช้ Extender ประเภทใดประเภทหนึ่งกับส่วนขยายทั้งหมด ดูข้อมูลเพิ่มเติมได้ที่ ตัวขยายสัญญาณพื้นฐานเทียบกับตัวขยายสัญญาณขั้นสูง - Camera2/X จะสร้างอินสแตนซ์และโต้ตอบกับคลาส Extender เพื่อดึงข้อมูลและเปิดใช้ส่วนขยาย สำหรับส่วนขยายที่กำหนด Camera2/X สามารถ สร้างอินสแตนซ์ของคลาส Extender ได้หลายครั้ง ดังนั้น อย่าทำการเริ่มต้นที่ซับซ้อนในเครื่องมือสร้างหรือการเรียก - init()ดำเนินการที่ต้องใช้ทรัพยากรมากเฉพาะเมื่อเซสชันกล้องกำลังจะเริ่ม เช่น เมื่อมีการเรียกใช้- onInit()ใน Basic Extender หรือมีการเรียกใช้- initSession()ใน Advanced Extender- สำหรับส่วนขยายกลางคืน ระบบจะสร้างอินสแตนซ์ของคลาส Extender ต่อไปนี้สำหรับ ประเภท Extender พื้นฐาน - NightImageCaptureExtenderImpl.java
- NightPreviewExtenderImpl.java
 - และสำหรับประเภท Advanced Extender ให้ทำดังนี้ - NightAdvancedExtenderImpl.java
 
- ตรวจสอบความพร้อมใช้งานของส่วนขยาย - ก่อนเปิดใช้ส่วนขยาย - isExtensionAvailable()จะตรวจสอบว่าส่วนขยายพร้อมใช้งานในรหัสกล้องที่ระบุผ่านอินสแตนซ์ Extender หรือไม่
- เริ่มต้นตัวขยายสัญญาณด้วยข้อมูลกล้อง - Camera2/X จะเรียก - init()ในอินสแตนซ์ Extender และส่งรหัสกล้อง และ- CameraCharacteristicsไปให้
- ข้อมูลการค้นหา: - เรียกใช้คลาส Extender เพื่อดึงข้อมูล เช่น ความละเอียดที่รองรับ ค่าเวลาในการตอบสนองโดยประมาณของการจับภาพนิ่ง และคีย์คำขอจาก Extender เพื่อเตรียมพร้อมสำหรับการเปิดใช้ส่วนขยาย 
- เปิดใช้ส่วนขยายในตัวขยาย: - คลาส Extender มีอินเทอร์เฟซทั้งหมดที่จำเป็นต่อการเปิดใช้ คลาส โดยมีกลไกในการเชื่อมต่อการติดตั้งใช้งาน OEM เข้ากับไปป์ไลน์ Camera2 เช่น การแทรกพารามิเตอร์คำขอจับภาพ หรือการเปิดใช้โปรแกรมประมวลผลภายหลัง - สำหรับประเภท Extender ขั้นสูง Camera2/X จะโต้ตอบกับ - SessionProcessorImplเพื่อเปิดใช้ส่วนขยาย Camera2/X จะเรียกข้อมูลอินสแตนซ์- SessionProcessorImplโดยการเรียก- createSessionProcessor()ใน Extender
ส่วนต่อไปนี้จะอธิบายขั้นตอนการขยายเวลาโดยละเอียด
การยืนยันเวอร์ชัน
เมื่อโหลดไลบรารีของผู้ให้บริการ 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
Basic Extender เทียบกับ Advanced Extender
extensions-interface มี 2 ประเภท ได้แก่ Basic Extender และ
Advanced Extender เราได้รองรับ Advanced Extender ตั้งแต่
extensions-interface 1.2.0
ใช้ Basic Extender สำหรับส่วนขยายที่ประมวลผลรูปภาพใน HAL ของกล้องหรือ ใช้ Post Processor ที่ประมวลผลสตรีม YUV ได้
ใช้ Advanced Extender สำหรับส่วนขยายที่ต้องปรับแต่งการกำหนดค่าสตรีม Camera2 และส่งคำขอจับภาพตามต้องการ
ดูการเปรียบเทียบได้ในตารางต่อไปนี้
| Basic Extender | Advanced Extender | |
|---|---|---|
| การกำหนดค่าสตรีม | แก้ไขแล้ว ตัวอย่าง: PRIVATEหรือYUV_420_888(หากมีโปรเซสเซอร์)ภาพนิ่ง: JPEGหรือYUV_420_888(หากมีโปรเซสเซอร์) | OEM ปรับแต่งได้ | 
| กำลังส่งคำขอแคปเจอร์ | มีเพียง Camera2/X เท่านั้นที่ส่งคำขอจับภาพได้ คุณตั้งค่าพารามิเตอร์สำหรับคำขอเหล่านี้ได้ เมื่อมีการจัดเตรียมโปรเซสเซอร์สำหรับการจับภาพ Camera2/X จะส่งคำขอจับภาพหลายรายการและส่งรูปภาพทั้งหมดพร้อมผลลัพธ์การจับภาพ ไปยังโปรเซสเซอร์ได้ | เราจะจัดเตรียมอินสแตนซ์ RequestProcessorImplให้คุณเพื่อ
   เรียกใช้คำขอจับภาพของ Camera2 และรับผลลัพธ์และรูปภาพ
Camera2/X เรียกใช้  | 
| Hook ในไปป์ไลน์ของกล้อง | 
 | 
 | 
| เหมาะสำหรับ | ส่วนขยายที่ใช้ใน HAL ของกล้องหรือในโปรเซสเซอร์ที่ประมวลผลรูปภาพ YUV | 
 | 
| เวอร์ชัน API ที่รองรับ | ส่วนขยาย Camera2: Android 13 ขึ้นไป ส่วนขยาย CameraX: camera-extensions1.1.0 ขึ้นไป | ส่วนขยาย Camera2: Android 12L ขึ้นไป ส่วนขยาย CameraX: camera-extensions1.2.0-alpha03 ขึ้นไป | 
โฟลว์ของแอป
ตารางต่อไปนี้แสดงโฟลว์ของแอป 3 ประเภทและการเรียก Camera Extensions API ที่เกี่ยวข้อง แม้ว่า Camera2/X จะมี API เหล่านี้ แต่คุณต้องติดตั้งใช้งานไลบรารีของผู้ให้บริการอย่างถูกต้องเพื่อรองรับโฟลว์เหล่านี้ ซึ่งเราจะอธิบายรายละเอียดเพิ่มเติมในส่วนถัดไป
| ส่วนขยาย Camera2 | ส่วนขยาย CameraX | |
|---|---|---|
| ความพร้อมใช้งานของส่วนขยายคำค้นหา | CameraExtensionCharacteristics
   .getSupportedExtensions | ExtensionsManager.
   isExtensionAvailable | 
| ข้อมูลการค้นหา | CameraExtensionCharacteristics.
   getExtensionSupportedSizesCameraExtensionCharacteristics.
getEstimatedCaptureLatencyRangeMillisCameraExtensionCharacteristics.
getAvailableCaptureRequestKeysCameraExtensionCharacteristics.
getAvailableCaptureResultKeys | ExtensionsManager.
   getEstimatedCaptureLatencyRangeCameraX จะจัดการข้อมูลที่เหลือภายในไลบรารี | 
| แสดงตัวอย่างและถ่ายภาพนิ่งเมื่อเปิดใช้ส่วนขยาย | CameraDevice.
   createExtensionSession
 
 | val cameraSelector = ExtensionsManager.
   getExtensionEnabledCameraSelector
 | 
Basic Extender
อินเทอร์เฟซของ Basic Extender มีฮุกไปยังหลายที่ในไปป์ไลน์ของกล้อง ส่วนขยายแต่ละประเภทมีคลาส Extender ที่สอดคล้องกันซึ่ง OEM ต้อง นำไปใช้
ตารางต่อไปนี้แสดงรายการคลาส Extender ที่ OEM ต้องใช้สำหรับส่วนขยายแต่ละรายการ
| คลาส Extender ที่จะใช้ | |
|---|---|
| กลางคืน | NightPreviewExtenderImpl.java
     | 
| HDR | HdrPreviewExtenderImpl.java
 | 
| อัตโนมัติ | AutoPreviewExtenderImpl.java
 | 
| โบเก้ | BokehPreviewExtenderImpl.java
 | 
| รีทัชใบหน้า | BeautyPreviewExtenderImpl.java
 | 
เราใช้ PreviewExtenderImpl และ ImageCaptureExtenderImpl เป็นตัวยึดตำแหน่ง
ในตัวอย่างต่อไปนี้ แทนที่ด้วยชื่อของไฟล์จริงที่คุณกำลังใช้
Basic Extender มีความสามารถต่อไปนี้
- แทรกพารามิเตอร์เซสชันเมื่อกำหนดค่า CameraCaptureSession(onPresetSession)
- แจ้งให้คุณทราบถึงเหตุการณ์การเริ่มต้นและปิดเซสชันการจับภาพ และส่งคำขอเดียว
เพื่อแจ้ง HAL ด้วยพารามิเตอร์ที่ส่งคืน (onEnableSession,onDisableSession)
- แทรกพารามิเตอร์การจับภาพสำหรับคำขอ
(PreviewExtenderImpl.getCaptureStage,ImageCaptureExtenderImpl.getCaptureStages)
- เพิ่มตัวประมวลผลสำหรับการแสดงตัวอย่างและการจับภาพนิ่งที่ประมวลผลสตรีม YUV_420_888ได้
มาดูกันว่า Camera2/X เรียกใช้ extensions-interface เพื่อให้ได้โฟลว์ของแอป 3 รายการ
ที่กล่าวถึงข้างต้นได้อย่างไร
ขั้นตอนการทำงานของแอป 1: ตรวจสอบความพร้อมให้บริการของส่วนขยาย
 
 
รูปที่ 3 โฟลว์แอป 1 ใน Basic Extender
ในโฟลว์นี้ Camera2/X จะเรียกใช้เมธอด isExtensionAvailable() ของทั้ง PreviewExtenderImpl และ ImageCaptureExtenderImpl โดยตรงโดยไม่ต้องเรียกใช้ init() คลาส Extender ทั้ง 2 คลาสต้องส่งคืน true เพื่อเปิดใช้ส่วนขยาย
โดยปกติแล้ว ขั้นตอนนี้จะเป็นขั้นตอนแรกสำหรับแอปในการตรวจสอบว่ากล้องที่ระบุรองรับส่วนขยายประเภทใดก่อนที่จะเปิดใช้ส่วนขยาย เนื่องจากส่วนขยายบางรายการรองรับเฉพาะรหัสกล้องบางรายการ
ขั้นตอนการทำงานของแอป 2: ค้นหาข้อมูล
 
 
รูปที่ 4 โฟลว์ของแอป 2 ใน Basic Extender
หลังจากพิจารณาว่าส่วนขยายพร้อมใช้งานหรือไม่แล้ว แอปควรค้นหาข้อมูลต่อไปนี้ก่อนเปิดใช้ส่วนขยาย
- ยังคงบันทึกช่วงเวลาในการจับภาพ: - ImageCaptureExtenderImpl.getEstimatedCaptureLatencyRangeแสดงช่วงของ เวลาในการจับภาพเพื่อให้แอปประเมินว่าเหมาะสมที่จะ เปิดใช้ส่วนขยายสำหรับสถานการณ์ปัจจุบันหรือไม่
- ขนาดที่รองรับสำหรับพื้นผิวการแสดงตัวอย่างและการจับภาพ: - ImageCaptureExtenderImpl.getSupportedResolutionsและ- PreviewExtenderImpl.getSupportedResolutionsจะแสดงรายการรูปแบบรูปภาพและ ขนาดที่รองรับสำหรับรูปแบบและขนาดของพื้นผิว
- คีย์คำขอและผลลัพธ์ที่รองรับ: Camera2/X จะเรียกใช้เมธอดต่อไปนี้เพื่อดึงคีย์คำขอและคีย์ผลลัพธ์ของการจับภาพที่รองรับจากการติดตั้งใช้งานของคุณ - ImageCaptureExtenderImpl.getAvailableCaptureRequestKeys
- ImageCaptureExtenderImpl.getAvailableCapturetResultKeys
 
Camera2/X จะเรียกใช้ init() ในคลาส Extender เหล่านี้ก่อนเสมอ
ก่อนที่จะค้นหาข้อมูลเพิ่มเติม
โฟลว์ของแอป 3: แสดงตัวอย่าง/จับภาพนิ่งโดยเปิดใช้ส่วนขยาย (การติดตั้งใช้งาน HAL)
 
 
รูปที่ 5 โฟลว์ของแอป 3 ใน Basic Extender
แผนภาพด้านบนแสดงโฟลว์หลักของการเปิดใช้การแสดงตัวอย่างและการจับภาพนิ่ง ด้วยส่วนขยายโดยไม่ต้องใช้โปรเซสเซอร์ ซึ่งหมายความว่า 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สำหรับการแสดงตัวอย่าง- ดูภาพประกอบต่อไปนี้เพื่อดูขั้นตอน 
 
 
รูปที่ 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
- Camera2/X ใช้พื้นผิวรูปแบบ - YUV_420_888สำหรับการจับภาพนิ่งเพื่อกำหนดค่า เซสชันการจับภาพ Camera2/X เตรียม- CaptureProcessorImplโดยการเรียกใช้- CaptureProcessorImpl.onImageFormatUpdate()ด้วย- YUV_420_888
- CaptureProcessorImpl.onResolutionUpdate()ที่มีขนาดรูปภาพอินพุต
- CaptureProcessorImpl.onOutputSurface()ที่มีเอาต์พุตเป็น- YUV_420_888พื้นผิว
 
- ImageCaptureExtenderImpl.getCaptureStagesจะแสดงรายการของ- CaptureStageImplโดยแต่ละองค์ประกอบจะแมปกับอินสแตนซ์- CaptureRequestที่มีพารามิเตอร์การจับภาพ ซึ่งส่งโดย Camera2/X เช่น หากแสดงรายการอินสแตนซ์ 3 รายการ Camera2/X จะส่งคำขอจับภาพ 3 รายการพร้อมพารามิเตอร์การจับภาพที่เกี่ยวข้องโดยใช้ API- captureBurst- CaptureStageImpl
- ระบบจะรวมรูปภาพที่ได้รับและอินสแตนซ์ - TotalCaptureResultเข้าด้วยกัน แล้วส่งไปยัง- CaptureProcessorImplเพื่อประมวลผล
- CaptureProcessorImplจะเขียนรูปภาพผลลัพธ์ (รูปแบบ- YUV_420_888) ไปยัง เอาต์พุต Surface ที่ระบุโดยการเรียกใช้- 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
 
สำหรับ Basic Extenders ที่ใช้เวอร์ชัน 1.2.0 หรือเวอร์ชันก่อนหน้า API ของ CameraX
Extensions จะรองรับคีย์ทั้งหมดข้างต้นอย่างชัดเจน สำหรับ
extensions-interface 1.3.0 ทั้ง CameraX และ Camera2 จะใช้รายการที่ส่งคืน
และรองรับเฉพาะคีย์ที่อยู่ในรายการนั้น ตัวอย่างเช่น หากคุณตัดสินใจที่จะส่งคืนเฉพาะ CaptureRequest#CONTROL_ZOOM_RATIO และ CaptureRequest#SCALER_CROP_REGION ในการติดตั้งใช้งานเวอร์ชัน 1.3.0 นั่นหมายความว่าแอปจะรองรับเฉพาะการซูมเท่านั้น ส่วนการแตะเพื่อโฟกัส แฟลช และการชดเชยแสงจะไม่อนุญาต
Advanced Extender
Advanced Extender เป็นการติดตั้งใช้งานของผู้ให้บริการประเภทหนึ่งที่อิงตาม Camera2 API
มีการเพิ่ม Extender ประเภทนี้ใน extensions-interface 1.2.0 ส่วนขยายอาจได้รับการติดตั้งใช้งานในเลเยอร์แอป ทั้งนี้ขึ้นอยู่กับผู้ผลิตอุปกรณ์
และปัจจัยต่อไปนี้
- การกำหนดค่าสตรีมที่กำหนดเอง: กำหนดค่าสตรีมที่กำหนดเอง เช่น สตรีม RAW หรือมีสตรีมหลายรายการสำหรับรหัสกล้องจริงที่แตกต่างกัน 
- ความสามารถในการส่งคำขอ Camera2: รองรับตรรกะการโต้ตอบที่ซับซ้อน ซึ่งสามารถส่งคำขอจับภาพพร้อมพารามิเตอร์ตามผลลัพธ์ของ คำขอก่อนหน้า 
Advanced Extender มี 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: ตรวจสอบความพร้อมให้บริการของส่วนขยาย
 
 
รูปที่ 8 โฟลว์แอป 1 ใน Advanced Extender
ก่อนอื่น แอปจะตรวจสอบว่ารองรับส่วนขยายที่ระบุหรือไม่
ขั้นตอนการทำงานของแอป 2: ค้นหาข้อมูล
 
 
รูปที่ 9 App flow 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-interface1.3.0) Camera2/X จะเรียกใช้เมธอดต่อไปนี้เพื่อดึงคีย์คำขอในการจับภาพและคีย์ผลลัพธ์ที่รองรับจากการติดตั้งใช้งานของคุณ- AdvancedExtenderImpl.getAvailableCaptureRequestKeys
- AdvancedExtenderImpl.getAvailableCaptureResultKeys
 
ดูข้อมูลเพิ่มเติมได้ที่รองรับคีย์และผลลัพธ์ของคำขอการจับภาพ
ขั้นตอนของแอป 3: แสดงตัวอย่าง/จับภาพนิ่งเมื่อเปิดใช้ส่วนขยาย
 
 
รูปที่ 10 App flow 3 ใน Advanced Extender
แผนภาพด้านบนแสดงโฟลว์หลักสำหรับการเริ่มการแสดงตัวอย่างและการจับภาพนิ่งสำหรับ ประเภทตัวขยายขั้นสูง มาดูแต่ละขั้นตอนกัน
- อินสแตนซ์ - SessionProcessorImpl- การติดตั้งใช้งาน Advanced Extender หลักอยู่ใน - SessionProcessorImplซึ่ง มีหน้าที่ในการกำหนดค่าเซสชันที่กำหนดเองและส่ง คำขอแคปเจอร์เพื่อเริ่มการแสดงตัวอย่างและคำขอแคปเจอร์ภาพนิ่ง- AdvancedExtenderImpl.createSessionProcessor()จะเรียกใช้เพื่อแสดงผลอินสแตนซ์- SessionProcessorImpl
- initSession- SessionProcessorImpl.initSession()จะเริ่มต้นเซสชันสำหรับส่วนขยาย ส่วนนี้คือที่ที่คุณจัดสรรทรัพยากรและส่งคืนการกำหนดค่าเซสชันเพื่อ เตรียม- CameraCaptureSession- สำหรับพารามิเตอร์อินพุต Camera2/X จะระบุการกำหนดค่าพื้นผิวเอาต์พุต สำหรับการแสดงตัวอย่าง การจับภาพนิ่ง และการวิเคราะห์รูปภาพ YUV ที่ไม่บังคับ การกำหนดค่าเอาต์พุต พื้นผิวนี้ ( - OutputSurfaceImpl) มีพื้นผิว ขนาด และรูปแบบรูปภาพ ที่ดึงข้อมูลโดยใช้วิธีการต่อไปนี้ใน- AdvancedExtenderImpl- getSupportedPreviewOutputResolutions()
- getSupportedCaptureOutputResolutions()
- getSupportedYuvAnalysisResolutions()
 - คุณต้องส่งคืนอินสแตนซ์ - Camera2SessionConfigImplซึ่งประกอบด้วยรายการอินสแตนซ์- Camera2OutputConfigImplและพารามิเตอร์เซสชันที่ใช้ ในการกําหนดค่า- CameraCaptureSessionคุณมีหน้าที่ ส่งออกรูปภาพกล้องที่ถูกต้องไปยังพื้นผิวเอาต์พุตที่ส่งผ่านโดย Camera2/X ตัวเลือกบางอย่างในการเปิดใช้เอาต์พุตมีดังนี้- การประมวลผลใน HAL ของกล้อง: คุณเพิ่มเอาต์พุต Surface ลงใน CameraCaptureSessionได้โดยตรงด้วยการติดตั้งใช้งานSurfaceOutputConfigImplซึ่งจะกำหนดค่าพื้นผิวเอาต์พุตที่ระบุให้กับไปป์ไลน์กล้อง และอนุญาตให้ HAL ของกล้องประมวลผลรูปภาพ
- การประมวลผลพื้นผิว - ImageReaderระดับกลาง (RAW, YUV ฯลฯ): เพิ่มพื้นผิว- ImageReaderระดับกลางลงใน- CameraCaptureSessionด้วยอินสแตนซ์- ImageReaderOutputConfigImpl- คุณต้องประมวลผลรูปภาพกลางและเขียนรูปภาพผลลัพธ์ไปยัง พื้นผิวเอาต์พุต 
 - ใช้การแชร์พื้นผิว Camera2: ใช้การแชร์พื้นผิวกับพื้นผิวอื่น
โดยการเพิ่มอินสแตนซ์ Camera2OutputConfigImplใดก็ได้ลงใน เมธอดgetSurfaceSharingOutputConfigs()ของอินสแตนซ์Camera2OutputConfigImplอื่น รูปแบบและขนาดของพื้นผิวต้องเหมือนกัน
 - Camera2OutputConfigImplทั้งหมด รวมถึง- SurfaceOutputConfigImplและ- ImageReaderOutputConfigImplต้องมีรหัสที่ไม่ซ้ำกัน (- getId()) ซึ่งใช้เพื่อ ระบุแพลตฟอร์มเป้าหมายและดึงรูปภาพจาก- ImageReaderOutputConfigImpl
- onCaptureSessionStartและ- RequestProcessorImpl- เมื่อ - CameraCaptureSessionเริ่มทำงานและเฟรมเวิร์กกล้องเรียกใช้- onConfigured()แล้ว Camera2/X จะเรียกใช้- SessionProcessorImpl.onCaptureSessionStart()พร้อมกับโปรแกรมห่อหุ้มคำขอ Camera2- RequestProcessImplCamera2/X ใช้- RequestProcessImplซึ่งช่วยให้คุณดำเนินการตามคำขอจับภาพและ ดึงข้อมูลรูปภาพได้หากใช้- ImageReaderOutputConfigImpl- API ของ - RequestProcessImplคล้ายกับ API ของ Camera2- CameraCaptureSessionในแง่ของการดำเนินการคำขอ ความแตกต่างมีดังนี้- พื้นผิวเป้าหมายจะระบุโดยรหัสของอินสแตนซ์ Camera2OutputConfigImpl
- ความสามารถในการดึงรูปภาพของ ImageReader
 - คุณสามารถโทรหา - RequestProcessorImpl.setImageProcessor()พร้อมระบุรหัส- Camera2OutputConfigImplเพื่อลงทะเบียนอินสแตนซ์- ImageProcessorImplเพื่อรับรูปภาพ- อินสแตนซ์ - RequestProcessImplจะใช้ไม่ได้หลังจากเรียกใช้ Camera2/X- SessionProcessorImpl.onCaptureSessionEnd()
- พื้นผิวเป้าหมายจะระบุโดยรหัสของอินสแตนซ์ 
- เริ่มการแสดงตัวอย่างและถ่ายรูป - ในการติดตั้งใช้งาน Extender ขั้นสูง คุณสามารถส่งคำขอการจับภาพ ผ่านอินเทอร์เฟซ - RequestProcessorImplได้ Camera2/X จะแจ้งให้คุณ เริ่มคำขอที่ทำซ้ำสำหรับตัวอย่างหรือลำดับการจับภาพนิ่งโดย เรียกใช้- SessionProcessorImpl#startRepeatingและ- SessionProcessorImpl#startCaptureตามลำดับ คุณควรส่งคำขอ Capture เพื่อตอบสนองคำขอแสดงตัวอย่างและคำขอจับภาพนิ่งเหล่านี้- Camera2/X ยังตั้งค่าพารามิเตอร์คำขอจับภาพผ่าน - SessionProcessorImpl#setParametersด้วย คุณต้องตั้งค่าพารามิเตอร์คำขอเหล่านี้ (หากระบบรองรับพารามิเตอร์) ทั้งในคำขอที่ทำซ้ำและคำขอเดียว- คุณต้องรองรับอย่างน้อย - CaptureRequest.JPEG_ORIENTATIONและ- CaptureRequest.JPEG_QUALITY- extensions-interface1.3.0 รองรับคีย์คำขอ และผลลัพธ์ ซึ่งแสดงโดยเมธอดต่อไปนี้- AdvancedExtenderImpl.getAvailableCaptureRequestKeys()
- AdvancedExtenderImpl.getAvailableCaptureResultKeys()
 - เมื่อนักพัฒนาแอปตั้งค่าคีย์ใน - getAvailableCaptureRequestKeysรายการ คุณต้องเปิดใช้พารามิเตอร์และตรวจสอบว่าผลลัพธ์การจับภาพ มีคีย์ใน- getAvailableCaptureResultKeysรายการ
- startTrigger- SessionProcessorImpl.startTrigger()จะเรียกใช้เพื่อเริ่มทริกเกอร์ เช่น- CaptureRequest.CONTROL_AF_TRIGGERและ- CaptureRequest.CONTROL_AE_PRECAPTURE_TRIGGERคุณสามารถละเว้นคีย์คำขอการจับภาพที่ไม่ได้โฆษณาใน- AdvancedExtenderImpl.getAvailableCaptureRequestKeys()ได้- startTrigger()ได้รับการรองรับตั้งแต่- extensions-interface1.3.0 ซึ่งช่วยให้แอปใช้การแตะเพื่อโฟกัสและแฟลชกับส่วนขยายได้
- ล้างข้อมูล - เมื่อสิ้นสุดเซสชันการจับภาพ - SessionProcessorImpl.onCaptureSessionEnd()จะเรียกใช้ก่อนปิด- CameraCaptureSessionหลังจากปิดเซสชันการจับภาพแล้ว- deInitSession()จะทำการล้างข้อมูล
รองรับการแสดงตัวอย่าง การจับภาพนิ่ง และการวิเคราะห์รูปภาพ
คุณควรใช้ส่วนขยายสำหรับทั้งกรณีการใช้งานการแสดงตัวอย่างและการจับภาพนิ่ง อย่างไรก็ตาม หากเวลาในการตอบสนองสูงเกินไปจนแสดงตัวอย่างได้อย่างไม่ราบรื่น คุณจะ ใช้ส่วนขยายสำหรับการจับภาพนิ่งเท่านั้นได้
สำหรับประเภท Extender พื้นฐาน ไม่ว่าคุณจะเปิดใช้ส่วนขยายเพื่อแสดงตัวอย่างหรือไม่
คุณต้องใช้ทั้ง ImageCaptureExtenderImpl และ PreviewExtenderImpl
สำหรับส่วนขยายที่กำหนด บ่อยครั้งที่แอปยังใช้สตรีม YUV เพื่อวิเคราะห์
เนื้อหารูปภาพ เช่น การค้นหาคิวอาร์โค้ดหรือข้อความ หากต้องการรองรับกรณีการใช้งานนี้ได้ดียิ่งขึ้น
 คุณควรสนับสนุนการรวมสตรีมของตัวอย่าง การจับภาพนิ่ง และสตรีม YUV_420_888 สำหรับการกำหนดค่า CameraCaptureSession ซึ่งหมายความว่า
หากคุณใช้โปรเซสเซอร์ คุณจะต้องรองรับสตรีม
ที่รวมสตรีม YUV_420_888 3 รายการ
สำหรับ Advanced Extender, Camera2/X จะส่งพื้นผิวเอาต์พุต 3 รายการไปยังการเรียก SessionProcessorImpl.initSession() พื้นผิวเอาต์พุตเหล่านี้มีไว้สำหรับการแสดงตัวอย่าง
 การจับภาพนิ่ง และการวิเคราะห์รูปภาพ ตามลำดับ คุณต้องตรวจสอบว่าพื้นผิวเอาต์พุตของตัวอย่าง
และภาพนิ่งแสดงเอาต์พุตที่ถูกต้อง อย่างไรก็ตาม สำหรับพื้นผิวเอาต์พุตการวิเคราะห์รูปภาพ
 ให้ตรวจสอบว่าพื้นผิวทำงานเฉพาะเมื่อไม่ใช่ค่า Null หากการติดตั้งใช้งานไม่รองรับสตรีมการวิเคราะห์รูปภาพ คุณจะแสดงผลรายการว่างใน AdvancedExtenderImpl.getSupportedYuvAnalysisResolutions() ได้ ซึ่งจะช่วยให้มั่นใจได้ว่าพื้นผิวเอาต์พุตการวิเคราะห์รูปภาพจะเป็น Null เสมอใน SessionProcessorImpl.initSession()
รองรับการจับภาพวิดีโอ
สถาปัตยกรรมส่วนขยายกล้องปัจจุบันรองรับเฉพาะ Use Case ของการแสดงตัวอย่างและการจับภาพนิ่ง
 เราไม่รองรับการเปิดใช้ส่วนขยายใน 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 ของอินเทอร์เฟซ
ไลบรารีส่วนขยาย ดูข้อมูลเพิ่มเติมได้ที่
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();
หากต้องการรองรับค่าประมาณเวลาในการตอบสนองของการจับภาพนิ่งแบบเรียลไทม์ ให้ใช้ รายการต่อไปนี้
- ส่วนขยายพื้นฐาน
ImageCaptureExtenderImpl.getRealtimeCaptureLatency()
- ส่วนขยายขั้นสูง
SessionProcessorImpl.getRealtimeCaptureLatency
การเรียกกลับความคืบหน้าในการประมวลผลการจับภาพ
สำหรับ 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
    }
  }
…
}
หากต้องการรองรับการเรียกกลับความคืบหน้าในการประมวลผลการจับภาพ การติดตั้งใช้งานของผู้ให้บริการส่วนขยาย จะต้องเรียกการเรียกกลับต่อไปนี้ด้วยค่าความคืบหน้าปัจจุบัน
- ส่วนขยายพื้นฐาน: ProcessResultImpl.onCaptureProcessProgressed()
- ส่วนขยายขั้นสูง: CaptureCallback.onCaptureProcessProgressed()
การจับภาพหลังดูโฆษณา
สำหรับ 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();
…
}
การติดตั้งใช้งานของผู้ให้บริการต้องติดตั้งใช้งานสิ่งต่อไปนี้เพื่อรองรับการจับภาพนิ่งหลังการดู
- ส่วนขยายพื้นฐาน - CaptureProcessorImpl.onPostviewOutputSurfaceและ- CaptureProcessorImpl.processWithPostview
- ส่วนขยายขั้นสูง - SessionProcessorImpl.startCaptureWithPostview
รองรับเอาต์พุต SurfaceView
สำหรับ Android 14 ขึ้นไป ไคลเอ็นต์ส่วนขยายกล้อง
สามารถใช้เส้นทางการแสดงตัวอย่างที่เพิ่มประสิทธิภาพด้านพลังงานและประสิทธิภาพได้โดยการลงทะเบียนอินสแตนซ์
SurfaceView
สำหรับเอาต์พุตตัวอย่างสำหรับคำขอที่ทำซ้ำ
การติดตั้งใช้งานส่วนขยายของผู้ให้บริการต้องสามารถสตรีมและแสดงตัวอย่างเอาต์พุตไปยังอินสแตนซ์ SurfaceView เพื่อรองรับเอาต์พุต SurfaceView หากต้องการ
ยืนยันว่าระบบรองรับ ให้เรียกใช้SurfaceViewExtensionPreviewTest.java
โมดูล CTS
ประเภทเซสชันเฉพาะผู้ให้บริการ
ฟีเจอร์นี้ช่วยให้การติดตั้งใช้งานส่วนขยายของผู้ให้บริการสามารถเลือกประเภทเซสชันที่เฉพาะเจาะจงของผู้ให้บริการที่จะตั้งค่าในเซสชันการจับภาพกล้องภายในแทนค่าเริ่มต้นได้
ฟีเจอร์นี้ทำงานภายในเฟรมเวิร์กและสแต็กของผู้ให้บริการอย่างสมบูรณ์ และไม่มีผลกระทบต่อ API ที่ไคลเอ็นต์/สาธารณะมองเห็น
หากต้องการเลือกประเภทเซสชันที่เฉพาะเจาะจงของผู้ให้บริการ ให้ใช้ข้อมูลต่อไปนี้กับไลบรารีส่วนขยาย
* ExtenderStateListener.onSessionType() สำหรับส่วนขยายพื้นฐาน
* Camera2SessionConfigImpl.getSessionType() สำหรับส่วนขยายขั้นสูง
ประวัติเวอร์ชันของอินเทอร์เฟซส่วนขยาย
ตารางต่อไปนี้แสดงประวัติเวอร์ชันของอินเทอร์เฟซส่วนขยายกล้อง คุณควรใช้ไลบรารีของผู้ให้บริการที่มีเวอร์ชันล่าสุดเสมอ
| เวอร์ชัน | ฟีเจอร์ที่เพิ่มเข้ามา | 
|---|---|
| 1.0.0 | 
 | 
| 1.1.0 | 
 | 
| 1.2.0 | 
 | 
| 1.3.0 | 
 | 
| 1.4.0 | 
 | 
การใช้งานอ้างอิง
การติดตั้งใช้งานไลบรารีของผู้ให้บริการ 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 จะเปิดใช้อยู่โดยค่าเริ่มต้น หากต้องการเปิดใช้ Basic 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 ในอุปกรณ์ ให้ทำดังนี้
- เพิ่มไฟล์สิทธิ์ซึ่งต้องใช้แท็ก <uses-library>โดยใช้รูปแบบต่อไปนี้/etc/permissions/ANY_FILENAME.xmlเช่น/etc/permissions/camera_extensions.xmlไฟล์ในไดเรกทอรีนี้จะแสดงการแมปของไลบรารีที่ระบุชื่อใน<uses-library>กับเส้นทางไฟล์จริงในอุปกรณ์
- ใช้ตัวอย่างด้านล่างเพื่อเพิ่มข้อมูลที่จำเป็นลงในไฟล์ - 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 ของกล้อง ซึ่งหมายความว่าต้องได้รับการยืนยันว่าทำงานได้ในการควบคุมที่ตั้งฉากทั้งหมดที่นักพัฒนาแอปใช้ได้
เราขอแนะนำให้แสดงโบเก้โดยใช้ทั้งโหมดฉากเพิ่มเติมและ Camera Extensions เนื่องจากแอปอาจต้องการใช้ API เฉพาะเพื่อเปิดใช้โบเก้ เราขอแนะนำให้ใช้โหมดฉากแบบขยายก่อน เนื่องจากเป็นวิธีที่ยืดหยุ่นที่สุดสำหรับแอปในการเปิดใช้ส่วนขยายโบเก้ จากนั้นคุณจะใช้ อินเทอร์เฟซส่วนขยายกล้องตามโหมดฉากที่ขยายได้ หากการติดตั้งใช้งานโบเก้ใน HAL ของกล้องเป็นเรื่องยาก เช่น เนื่องจากต้องมี โปรแกรมประมวลผลภายหลังที่ทำงานในเลเยอร์แอปเพื่อประมวลผลรูปภาพ เราขอแนะนำให้ติดตั้งใช้งาน ส่วนขยายโบเก้โดยใช้อินเทอร์เฟซส่วนขยายของกล้อง
คำถามที่พบบ่อย
ระดับ API มีข้อจำกัดไหม
ได้ ซึ่งขึ้นอยู่กับชุดฟีเจอร์ Android API ที่การติดตั้งใช้งานไลบรารีของผู้ให้บริการ OEM
 ต้องใช้ เช่น
ExtenderStateListener.onPresetSession() ใช้การเรียก
SessionConfiguration.setSessionParameters()
เพื่อตั้งค่าพื้นฐานของแท็ก การเรียกนี้ใช้ได้ใน API ระดับ
28 ขึ้นไปเท่านั้น ดูรายละเอียดเกี่ยวกับเมธอดอินเทอร์เฟซที่เฉพาะเจาะจงได้ใน
เอกสารอ้างอิง API
