ผู้ผลิตอุปกรณ์สามารถแสดงส่วนขยาย เช่น โบเก้ โหมดกลางคืน และ 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 การติดตั้งใช้งานส่วนขยายกลางคืน
เพื่อสะดวกในการเรียกการยืนยันเวอร์ชัน:
Camera2/X จะเรียกใช้
ExtensionVersionImpl.checkApiVersion()
เพื่อให้แน่ใจว่าextensions-interface
เวอร์ชันที่ OEM ติดตั้งใช้งานเข้ากันได้กับเวอร์ชันที่ Camera2/X รองรับการเริ่มต้นใช้งานคลังผู้ให้บริการ:
InitializerImpl
มีเมธอดinit()
ที่เริ่มต้นไลบรารีของผู้ให้บริการ Camera2/X จะทำการเริ่มต้นให้เสร็จสมบูรณ์ก่อนที่จะเข้าถึงคลาส Extenderสร้างอินสแตนซ์คลาส 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
ตรวจสอบความพร้อมใช้งานของส่วนขยาย
ก่อนเปิดใช้ส่วนขยาย
isExtensionAvailable()
จะตรวจสอบว่าส่วนขยายพร้อมใช้งานในรหัสกล้องที่ระบุผ่านอินสแตนซ์ของ Extender หรือไม่เริ่มต้น Extender ด้วยข้อมูลกล้อง
Camera2/X จะเรียก
init()
ในอินสแตนซ์ Extender และส่งรหัสกล้องและCameraCharacteristics
ข้อมูลการค้นหา:
เรียกใช้คลาส Extender เพื่อดึงข้อมูล เช่น ความละเอียดที่รองรับ ยังคงจับเวลาในการตอบสนองโดยประมาณ และจับคีย์คำขอจาก 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 ประเภท ได้แก่ ตัวขยายพื้นฐานและตัวขยายขั้นสูง ระบบรองรับ 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 จะเรียกใช้ |
ฮุกในไปป์ไลน์ของกล้อง |
|
|
เหมาะสำหรับ | ส่วนขยายที่ติดตั้งใช้งานใน HAL ของกล้องหรือในโปรเซสเซอร์ที่ประมวลผลรูปภาพ YUV |
|
เวอร์ชัน 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
|
val cameraSelector = ExtensionsManager.
getExtensionEnabledCameraSelector
|
Basic Extender
อินเทอร์เฟซของ Basic Extender มีฮุกสำหรับเชื่อมต่อกับหลายตำแหน่งในไปป์ไลน์ของกล้อง ส่วนขยายแต่ละประเภทจะมีคลาส Extender ที่เกี่ยวข้องซึ่ง OEM ต้องใช้
ตารางต่อไปนี้แสดงคลาส Extender ที่ OEM ต้องใช้สำหรับส่วนขยายแต่ละรายการ
คลาสส่วนขยายที่จะนำไปใช้ | |
---|---|
กลางคืน | NightPreviewExtenderImpl.java
|
HDR | HdrPreviewExtenderImpl.java
|
อัตโนมัติ | AutoPreviewExtenderImpl.java
|
โบเก้ | BokehPreviewExtenderImpl.java
|
รีทัชใบหน้า | BeautyPreviewExtenderImpl.java
|
เราใช้ PreviewExtenderImpl
และ ImageCaptureExtenderImpl
เป็นตัวยึดตําแหน่งในตัวอย่างต่อไปนี้ แทนที่ชื่อเหล่านี้ด้วยชื่อไฟล์จริงที่คุณใช้งาน
ตัวขยายสัญญาณพื้นฐานมีความสามารถดังต่อไปนี้
- แทรกพารามิเตอร์เซสชันเมื่อกําหนดค่า
CameraCaptureSession
(onPresetSession
) - แจ้งให้คุณทราบเกี่ยวกับเหตุการณ์เริ่มต้นและปิดเซสชันการจับภาพ และส่งคําขอเดียวเพื่อแจ้ง HAL ด้วยพารามิเตอร์ที่แสดงผล (
onEnableSession
,onDisableSession
) - แทรกพารามิเตอร์การบันทึกสําหรับคําขอ (
PreviewExtenderImpl.getCaptureStage
,ImageCaptureExtenderImpl.getCaptureStages
) - เพิ่มตัวประมวลผลสําหรับการแสดงตัวอย่างและยังคงบันทึกได้ซึ่งสามารถประมวลผลสตรีม
YUV_420_888
มาดูว่า Camera2/X เรียกใช้ extensions-interface
อย่างไรเพื่อให้ได้ 3 ขั้นตอนของแอปที่กล่าวถึงข้างต้น
ขั้นตอนการเพิ่มส่วนขยาย 1: ตรวจสอบความพร้อมใช้งานของส่วนขยาย
รูปที่ 3 ขั้นตอนการส่งแอป 1 ในอุปกรณ์ขยายสัญญาณพื้นฐาน
ในขั้นตอนนี้ Camera2/X จะเรียกใช้เมธอด isExtensionAvailable()
ของทั้ง PreviewExtenderImpl
และ ImageCaptureExtenderImpl
โดยตรงโดยไม่ต้องเรียกใช้ init()
ทั้ง 2 คลาส Extender ต้องแสดงผลเป็น 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 ในอุปกรณ์ขยายสัญญาณพื้นฐาน
แผนภาพด้านบนแสดงขั้นตอนหลักในการเปิดใช้การแสดงตัวอย่างและการจับภาพนิ่งด้วยส่วนขยายที่ไม่มีตัวประมวลผล ซึ่งหมายความว่า 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
: ไม่มีตัวประมวลผล รูปภาพได้รับการประมวลผลในกล้อง HALPROCESSOR_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 ส่ง เช่น หากแสดงรายการอินสแตนซ์CaptureStageImpl
3 รายการ Camera2/X จะส่งคำขอจับภาพ 3 รายการพร้อมพารามิเตอร์การจับภาพที่เกี่ยวข้องโดยใช้captureBurst
APIระบบจะรวมรูปภาพและอินสแตนซ์
TotalCaptureResult
ที่ได้รับไว้ด้วยกันแล้วส่งไปยังCaptureProcessorImpl
เพื่อประมวลผล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: ตรวจสอบความพร้อมใช้งานของส่วนขยาย
รูปที่ 8 ขั้นตอนการส่งแอป 1 ใน Advanced Extender
ก่อนอื่น แอปจะตรวจสอบว่ารองรับส่วนขยายที่ระบุหรือไม่
ขั้นตอนการทํางานของแอป 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: แสดงตัวอย่าง/ถ่ายภาพนิ่งโดยเปิดใช้ส่วนขยาย
รูปที่ 10 ขั้นตอนการส่งแอป 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 ของกล้อง: คุณสามารถเพิ่มแพลตฟอร์มเอาต์พุตลงใน
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()
ด้วยRequestProcessImpl
ซึ่งเป็น Wrapper คำขอของ Camera2 Camera2/X ใช้RequestProcessImpl
ซึ่งช่วยให้คุณดำเนินการตามคำขอถ่ายภาพ และเรียกดูรูปภาพได้หากใช้ImageReaderOutputConfigImpl
RequestProcessImpl
API คล้ายกับ Camera2CameraCaptureSession
API ในแง่ของการดำเนินการตามคำขอ ความแตกต่างมีดังนี้- แพลตฟอร์มเป้าหมายจะระบุด้วยรหัสของอินสแตนซ์
Camera2OutputConfigImpl
- ความสามารถในการดึงข้อมูลรูปภาพของ
ImageReader
คุณสามารถเรียกใช้
RequestProcessorImpl.setImageProcessor()
ด้วยรหัสCamera2OutputConfigImpl
ที่ระบุเพื่อลงทะเบียนอินสแตนซ์ImageProcessorImpl
เพื่อรับรูปภาพอินสแตนซ์
RequestProcessImpl
จะใช้งานไม่ได้หลังจากการเรียกใช้ Camera2/XSessionProcessorImpl.onCaptureSessionEnd()
- แพลตฟอร์มเป้าหมายจะระบุด้วยรหัสของอินสแตนซ์
เริ่มแสดงตัวอย่างและถ่ายภาพ
ในการใช้งานตัวขยายสัญญาณขั้นสูง คุณสามารถส่งคำขอบันทึกผ่านอินเทอร์เฟซ
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
startTrigger
SessionProcessorImpl.startTrigger()
เรียกให้แสดงเพื่อเริ่มทริกเกอร์ เช่นCaptureRequest.CONTROL_AF_TRIGGER
และCaptureRequest.CONTROL_AE_PRECAPTURE_TRIGGER
คุณไม่ต้องสนใจคีย์คำขอบันทึกที่ไม่มีการโฆษณาในAdvancedExtenderImpl.getAvailableCaptureRequestKeys()
ระบบรองรับ
startTrigger()
มาตั้งแต่extensions-interface
1.3.0 ซึ่งช่วยให้แอปใช้การแตะเพื่อโฟกัสและแฟลชด้วยส่วนขยายได้ล้างข้อมูล
เมื่อเซสชันการจับภาพเสร็จสิ้น ระบบจะเรียกใช้
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();
หากต้องการรองรับค่าประมาณเวลาในการตอบสนองในการจับภาพนิ่งแบบเรียลไทม์ ให้ทำดังนี้
- ส่วนขยายพื้นฐาน
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 Extendersample
: การติดตั้งใช้งานขั้นพื้นฐานของ Basic Extenderservice_based_sample
: การใช้งานที่แสดงวิธีโฮสต์ส่วนขยายกล้องในService
การติดตั้งใช้งานนี้มีองค์ประกอบต่อไปนี้oem_library
: คลัง OEM ของส่วนขยายกล้องสำหรับ Camera2 และ CameraX Extensions API ที่ใช้Extensions-Interface
ซึ่งจะทำหน้าที่เป็นการส่งต่อที่จะส่งต่อสายเรียกเข้าจากExtensions-Interface
ไปยังบริการ ไลบรารีนี้ยังมีไฟล์ AIDL และคลาส Wrapper เพื่อสื่อสารกับบริการด้วยตัวขยายขั้นสูงจะเปิดใช้อยู่โดยค่าเริ่มต้น หากต้องการเปิดใช้ตัวขยายพื้นฐาน ให้เปลี่ยน
ExtensionsVersionImpl#isAdvancedExtenderImplemented
เป็น returnfalse
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 ของกล้องเท่านั้น ซึ่งหมายความว่าจะต้องได้รับการยืนยันให้ทำงานกับการควบคุมแบบออโตรโกนัลทั้งหมดที่นักพัฒนาแอปมีให้
เราขอแนะนำให้แสดงโบเก้โดยใช้ทั้งโหมดฉากแบบขยายและส่วนขยายกล้อง เนื่องจากแอปอาจต้องการใช้ API บางรายการเพื่อเปิดใช้โบเก้ เราขอแนะนำให้ใช้โหมดฉากแบบขยายก่อน เนื่องจากเป็นวิธีที่ยืดหยุ่นที่สุดสำหรับแอปในการเปิดใช้การขยายโบเก้ จากนั้นคุณจะใช้อินเทอร์เฟซส่วนขยายกล้องตามโหมดฉากที่ขยายได้ หากการใช้โบเก้ใน HAL ของกล้องเป็นเรื่องยาก เช่น ต้องใช้โปรแกรมประมวลผลภาพขั้นหลังที่ทำงานในเลเยอร์แอปเพื่อประมวลผลรูปภาพ เราขอแนะนำให้ใช้ส่วนขยายโบเก้โดยใช้อินเทอร์เฟซส่วนขยายกล้อง
คำถามที่พบบ่อย
ระดับ API มีข้อจํากัดไหม
ได้ การดำเนินการนี้ขึ้นอยู่กับชุดฟีเจอร์ Android API ที่จําเป็นต่อการใช้งานไลบรารีของ OEM หรือผู้ให้บริการ ตัวอย่างเช่น
ExtenderStateListener.onPresetSession()
ใช้การเรียกใช้ SessionConfiguration.setSessionParameters()
เพื่อตั้งค่าชุดแท็กพื้นฐาน การเรียกใช้นี้ใช้ได้ใน API ระดับ 28 ขึ้นไปเท่านั้น ดูรายละเอียดเกี่ยวกับเมธอดอินเทอร์เฟซที่เฉพาะเจาะจงได้ที่เอกสารอ้างอิง API