ผู้ผลิตอุปกรณ์จะเผยให้เห็นส่วนขยายต่างๆ เช่น โบเก้ โหมดกลางคืน และ HDR ได้ นักพัฒนาซอฟต์แวร์บุคคลที่สามผ่านอินเทอร์เฟซของส่วนขยายกล้องที่ให้บริการโดย ไลบรารีผู้ให้บริการ OEM นักพัฒนาแอปสามารถใช้ API ส่วนขยาย Camera2 และ cameraX Extensions API เพื่อเข้าถึงส่วนขยายที่ใช้ในคลังผู้ให้บริการ OEM
สำหรับรายการส่วนขยายที่รองรับ ซึ่งจะเหมือนกันทั้งใน Camera2 และ CameraX โปรดดู CameraX Extensions API หากคุณต้องการเพิ่มส่วนขยาย รายงานข้อบกพร่องด้วย เครื่องมือติดตามปัญหา
หน้านี้จะอธิบายวิธีใช้และเปิดใช้ไลบรารีผู้ให้บริการ OEM อุปกรณ์
สถาปัตยกรรม
แผนภาพต่อไปนี้อธิบายสถาปัตยกรรมของส่วนขยายกล้อง
อินเทอร์เฟซหรือ extensions-interface
:
รูปที่ 1 แผนภาพสถาปัตยกรรมส่วนขยายกล้อง
ดังที่แสดงในแผนภาพ หากต้องการสนับสนุนส่วนขยายกล้อง คุณจะต้อง
ใช้ extensions-interface
ที่ไลบรารีผู้ให้บริการ OEM มีให้ บัญชี
ไลบรารีของผู้ให้บริการ OEM เปิดใช้ API 2 แบบดังนี้
cameraX Extensions API และ
Camera2 Extensions API
ซึ่งแอป CameraX และ Camera2 ใช้ตามลำดับเพื่อเข้าถึง
ส่วนขยายของผู้ให้บริการ
ใช้ไลบรารีผู้ให้บริการ OEM
หากต้องการใช้ไลบรารีผู้ให้บริการ OEM ให้คัดลอก
camera-extensions-stub
ไฟล์ลงในโครงการไลบรารีของระบบ ไฟล์เหล่านี้ระบุถึงส่วนขยายกล้อง
ของ Google
camera-extensions-stub
ไฟล์จะแบ่งออกเป็นหมวดหมู่ต่อไปนี้
ไฟล์อินเทอร์เฟซที่จำเป็น (ไม่ต้องแก้ไข)
PreviewExtenderImpl.java
ImageCaptureExtenderImpl.java
ExtenderStateListener.java
ProcessorImpl.java
PreviewImageProcessorImpl.java
CaptureProcessorImpl.java
CaptureStageImpl.java
RequestUpdateProcessorImpl.java
ProcessResultImpl.java
advanced/AdvancedExtenderImpl.java
advanced/Camera2OutputConfigImpl.java
advanced/Camera2SessionConfigImpl.java
advanced/ImageProcessorImpl.java
advanced/ImageReaderOutputConfigImpl.java
advanced/ImageReferenceImpl.java
advanced/MultiResolutionImageReaderOutputConfigImpl.java
advanced/OutputSurfaceImpl.java
advanced/RequestProcessorImpl.java
advanced/SessionProcessorImpl.java
advanced/SurfaceOutputConfigImpl.java
การติดตั้งใช้งานที่จำเป็น (เพิ่มการใช้งาน)
ExtensionVersionImpl.java
InitializerImpl.java
คลาสตัวขยายโบเก้ (นำมาใช้หากรองรับส่วนขยาย Bokeh)
BokehImageCaptureExtenderImpl.java
BokehPreviewExtenderImpl.java
advanced/BokehAdvancedExtenderImpl.java
คลาสเครื่องขยายเวลากลางคืน (นำมาใช้หากรองรับส่วนขยายกลางคืน)
NightImageCaptureExtenderImpl.java
NightPreviewExtenderImpl.java
advanced/NightAdvancedExtenderImpl.java
คลาสส่วนขยายอัตโนมัติ (ใช้หากรองรับส่วนขยายอัตโนมัติ)
AutoImageCaptureExtenderImpl.java
AutoPreviewExtenderImpl.java
advanced/AutoAdvancedExtenderImpl.java
คลาสตัวขยาย HDR (นำมาใช้หากรองรับส่วนขยาย HDR)
HdrImageCaptureExtenderImpl.java
HdrPreviewExtenderImpl.java
advanced/HdrAdvancedExtenderImpl.java
ชั้นเรียนเครื่องขยายรีทัชใบหน้า (นำมาใช้หากรองรับส่วนขยายรีทัชใบหน้า)
BeautyImageCaptureExtenderImpl.java
BeautyPreviewExtenderImpl.java
advanced/BeautyAdvancedExtenderImpl.java
ยูทิลิตี (ไม่บังคับ ลบได้)
advanced/Camera2OutputConfigImplBuilder.java
advanced/Camera2SessionConfigImplBuilder.java
คุณไม่จำเป็นต้องติดตั้งใช้งานส่วนขยายทุกรายการ หากคุณ
ไม่ใช้ส่วนขยาย ให้ตั้งค่า isExtensionAvailable()
ให้แสดงผล false
หรือ
นำคลาส Extender ที่เกี่ยวข้องออก ส่วนขยาย Camera2 และส่วนขยาย CameraX
API จะรายงานไปยังแอปว่าส่วนขยายไม่พร้อมใช้งาน
ลองมาดูว่า API ของส่วนขยาย Camera2 และ CameraX โต้ตอบกับ ไลบรารีผู้ให้บริการเพื่อเปิดใช้ส่วนขยาย แผนภาพต่อไปนี้แสดง ขั้นตอนจากต้นทางถึงปลายทางโดยใช้ส่วนขยายกลางคืนเป็นตัวอย่าง ดังนี้
รูปที่ 2 การใช้ส่วนขยายกลางคืน
การยืนยันเวอร์ชัน:
Camera2/X จะเรียก
ExtensionVersionImpl.checkApiVersion()
เพื่อให้แน่ใจว่า เวอร์ชันextensions-interface
ที่ใช้ OEM ใช้ได้กับ Camera2/X เวอร์ชันที่รองรับการเริ่มต้นไลบรารีของผู้ให้บริการ:
InitializerImpl
มีเมธอดinit()
ที่เริ่มต้นไลบรารีของผู้ให้บริการ Camera2/X จะเริ่มต้นทำงานให้เสร็จสมบูรณ์ก่อนเข้าถึงคลาส Extenderสร้างชั้นเรียน Extender ทันที
ยกตัวอย่างคลาส Extender สำหรับส่วนขยาย มี Extender 2 ตัว ประเภท: ตัวขยายพื้นฐานและตัวขยายสัญญาณขั้นสูง คุณต้องติดตั้งใช้งาน ประเภทตัวขยายสำหรับส่วนขยายทั้งหมด สำหรับข้อมูลเพิ่มเติม โปรดดู ตัวขยายพื้นฐานกับตัวขยายสัญญาณขั้นสูง
Camera2/X จะสร้างอินสแตนซ์และโต้ตอบกับคลาส Extender เพื่อดึงข้อมูล และเปิดใช้ส่วนขยาย สำหรับส่วนขยายหนึ่งๆ Camera2/X สามารถ สร้างอินสแตนซ์ Extender หลายครั้ง ดังนั้น อย่าทำ การเริ่มต้นแบบใช้บ่อยในเครื่องมือสร้างหรือการเรียกใช้
init()
ทำสิ่งต่อไปนี้ ลงน้ำหนักมากเฉพาะเมื่อเซสชันกล้องกำลังจะ เช่น เมื่อมีการเรียกonInit()
ใน Basic Extender หรือ มีการเรียกใช้initSession()
ใน Advanced Extenderสำหรับส่วนขยาย Night มีการสร้างอินสแตนซ์คลาส Extender ต่อไปนี้สำหรับ ประเภท Extender พื้นฐาน
NightImageCaptureExtenderImpl.java
NightPreviewExtenderImpl.java
และสำหรับประเภท Advanced Extender:
NightAdvancedExtenderImpl.java
ตรวจสอบความพร้อมใช้งานของส่วนขยาย
ก่อนเปิดใช้ส่วนขยาย
isExtensionAvailable()
จะตรวจสอบว่า มีส่วนขยายในรหัสกล้องที่ระบุผ่านอุปกรณ์ขยายสัญญาณ อินสแตนซ์เริ่มต้น 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 เพื่อพิจารณาว่าสามารถเปิดใช้ส่วนขยายได้หรือไม่และความสามารถอะไรบ้าง
ก็จะถูกเรียกใช้
ความเข้ากันได้ของเวอร์ชันหลัก
หากเวอร์ชันหลักของอินเทอร์เฟซของส่วนขยายแตกต่างกัน Camera2/X และไลบรารีของผู้ให้บริการ จะถือว่าใช้ร่วมกันไม่ได้ และ ส่วนขยายนั้นถูกปิดใช้
ความเข้ากันได้แบบย้อนหลัง
ตราบใดที่เวอร์ชันหลักเหมือนกันทุกประการ Camera2/X จะดูแลให้
ความเข้ากันได้แบบย้อนหลังกับไลบรารีผู้ให้บริการ OEM ที่สร้างขึ้น
extensions-interface
เวอร์ชัน เช่น หาก Camera2/X รองรับ
extensions-interface
1.3.0, ไลบรารีผู้ให้บริการ OEM ที่ใช้เวอร์ชัน 1.0.0
1.1.0 และ 1.2.0 ยังใช้งานร่วมกันได้อยู่ และยังหมายความว่า หลังจากที่คุณใช้
เวอร์ชันเฉพาะของไลบรารีของผู้ให้บริการ Camera2/X จะทำให้ไลบรารี
สามารถเข้ากันได้แบบย้อนหลังกับ extension-interface
เวอร์ชันที่กำลังจะมาถึง
ส่งต่อความเข้ากันได้
ส่งต่อความเข้ากันได้กับไลบรารีผู้ให้บริการของ extensions-interface
ที่ใหม่กว่า
ขึ้นอยู่กับคุณ OEM หากต้องการฟีเจอร์บางส่วนในการใช้งานส่วนขยาย
คุณอาจต้องเปิดใช้ส่วนขยายโดยเริ่มจากเวอร์ชันใดเวอร์ชันหนึ่ง ด้วยวิธีนี้
คุณสามารถแสดงผลเวอร์ชัน extensions-interface
ที่รองรับเมื่อ
เวอร์ชันไลบรารี Camera2/X เป็นไปตามข้อกําหนด หากเวอร์ชัน Camera2/X
ไม่รองรับ คุณสามารถส่งคืนค่าเวอร์ชันที่เข้ากันไม่ได้ เช่น 99.0.0 เป็น
ปิดใช้ส่วนขยาย
การเริ่มต้นไลบรารีของผู้ให้บริการ
หลังจากยืนยันเวอร์ชัน extensions-interface
ที่ OEM ใช้งาน
Camera2/X จะเริ่มต้นกระบวนการเริ่มต้น
เมธอด InitializerImpl.init()
จะส่งสัญญาณไปยังไลบรารี OEM ที่แอปกำลังทดลองใช้
ใช้ส่วนขยายได้
Camera2/X จะไม่เรียกใช้ไลบรารี OEM อื่นใด (นอกเหนือจากการตรวจสอบเวอร์ชัน)
จนกว่าไลบรารีของผู้ให้บริการ OEM จะเรียกใช้ OnExtensionsInitializedCallback.onSuccess()
เพื่อแจ้งการเริ่มต้นทำงานเสร็จแล้ว
คุณต้องติดตั้งใช้งาน
InitializerImpl
ณ วันที่ extensions-interface
1.1.0 Camera2/X ข้ามการเริ่มต้นไลบรารี
ในกรณีที่ไลบรารีของผู้ให้บริการ OEM ใช้ extensions-interface
1.0.0
ตัวขยายพื้นฐานกับตัวขยายสัญญาณขั้นสูง
การใช้งาน extensions-interface
มี 2 ประเภท ได้แก่ ตัวขยายพื้นฐานและ
อุปกรณ์ขยายสัญญาณขั้นสูง ตัวขยายสัญญาณขั้นสูงได้รับการรองรับตั้งแต่
extensions-interface
1.2.0
ใช้ตัวขยายพื้นฐานสำหรับส่วนขยายที่ประมวลผลรูปภาพใน HAL ของกล้อง หรือ ใช้โพสต์โปรเซสเซอร์ที่สามารถประมวลผลสตรีม YUV
ใช้งาน Advanced Extender สำหรับส่วนขยายที่ต้องปรับแต่ง Camera2 การกำหนดค่าสตรีม และส่งคำขอการจับภาพตามต้องการ
ดูการเปรียบเทียบในตารางต่อไปนี้
ตัวขยายสัญญาณพื้นฐาน | อุปกรณ์ขยายสัญญาณขั้นสูง | |
---|---|---|
การกำหนดค่าสตรีม | คงที่ ดูตัวอย่าง: PRIVATE หรือ YUV_420_888 (หากมีโปรเซสเซอร์) ยังจับภาพอยู่: JPEG หรือ YUV_420_888 (หากมีตัวประมวลผล)
|
OEM สามารถปรับแต่งได้ |
กำลังส่งคำขอจับภาพ | เฉพาะ Camera2/X เท่านั้นที่ส่งคำขอจับภาพได้ คุณตั้งค่าพารามิเตอร์เป็น คำขอเหล่านี้ เมื่อมีโปรเซสเซอร์สำหรับจับภาพ Camera2/X สามารถส่งคำขอจับภาพหลายรายการและส่งรูปภาพทั้งหมดและจับภาพ ไปยังโปรเซสเซอร์ | อินสแตนซ์ RequestProcessorImpl จะส่งถึงคุณเพื่อ
เรียกใช้คำขอจับภาพ Camera2 และดูผลลัพธ์และรูปภาพ
Camera2/X เรียกใช้ |
ขอเกี่ยวในไปป์ไลน์ของกล้อง |
|
|
เหมาะสำหรับ | ส่วนขยายที่ใช้งานใน HAL ของกล้อง หรือในโปรเซสเซอร์ที่ประมวลผล รูปภาพ YUV |
|
เวอร์ชัน API ที่รองรับ | ส่วนขยาย Camera2: Android 13 ขึ้นไป ส่วนขยาย CameraX: camera-extensions 1.1.0 ขึ้นไป |
ส่วนขยาย Camera2: Android 12L ขึ้นไป ส่วนขยาย CameraX: camera-extensions 1.2.0-alpha03 ขึ้นไป |
ขั้นตอนของแอป
ตารางต่อไปนี้แสดงขั้นตอนของแอป 3 ประเภทและขั้นตอน การเรียก API ของส่วนขยายกล้องที่เกี่ยวข้อง ในขณะที่ Camera2/X ให้ API เหล่านี้ คุณต้องติดตั้งไลบรารีของผู้ให้บริการอย่างเหมาะสมเพื่อรองรับ API เหล่านี้ ซึ่งเราจะอธิบายรายละเอียดเพิ่มเติมในส่วนต่อไป
ส่วนขยาย Camera2 | ส่วนขยาย CameraX | |
---|---|---|
ความพร้อมใช้งานของส่วนขยายคำค้นหา | CameraExtensionCharacteristics
.getSupportedExtensions
|
ExtensionsManager.
isExtensionAvailable
|
ข้อมูลคำค้นหา | CameraExtensionCharacteristics.
getExtensionSupportedSizes
CameraExtensionCharacteristics.
getEstimatedCaptureLatencyRangeMillis
CameraExtensionCharacteristics.
getAvailableCaptureRequestKeys
CameraExtensionCharacteristics.
getAvailableCaptureResultKeys
|
ExtensionsManager.
getEstimatedCaptureLatencyRange
CameraX จะจัดการข้อมูลที่เหลือภายในไลบรารี |
แสดงตัวอย่างและยังคงจับภาพได้ด้วยการเปิดใช้ส่วนขยาย | CameraDevice.
createExtensionSession
|
val cameraSelector = ExtensionsManager.
getExtensionEnabledCameraSelector
|
ตัวขยายสัญญาณพื้นฐาน
อินเทอร์เฟซตัวขยายพื้นฐานให้คุณเข้าถึงหลายๆ ตำแหน่งในกล้องได้ ไปป์ไลน์ ส่วนขยายแต่ละประเภทมีคลาส Extender ที่สอดคล้องกันที่ OEM ต้องมี เพื่อนำไปปฏิบัติ
ตารางต่อไปนี้แสดงรายการคลาส Extender ที่ OEMS จำเป็นต้องใช้ในแต่ละรายการ ส่วนขยาย:
ชั้นเรียนขยายการใช้งาน | |
---|---|
กลางคืน | 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()
คลาส Extender ทั้ง 2 รายการจะต้องแสดงผล true
เพื่อเปิดใช้ส่วนขยาย
ซึ่งนี่มักเป็นขั้นตอนแรกให้แอปตรวจสอบว่าส่วนขยายที่ระบุ ประเภทได้รับการรองรับสำหรับรหัสกล้องที่ระบุก่อนเปิดใช้ส่วนขยาย เนื่องจากส่วนขยายบางรายการรองรับเฉพาะรหัสกล้องบางรหัสเท่านั้น
ขั้นตอนของแอป 2: ค้นหาข้อมูล
รูปที่ 4 ขั้นตอนของแอป 2 ในส่วนขยายพื้นฐาน
หลังจากตรวจสอบว่าส่วนขยายพร้อมให้บริการแล้วหรือไม่ แอปควรสืบค้น ข้อมูลต่อไปนี้ก่อนเปิดใช้ส่วนขยาย
ช่วงเวลาในการตอบสนองของการบันทึกยังคง:
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
ที่มีพารามิเตอร์การบันทึก กล้อง 2/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
อินสแตนซ์ 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()
ครั้งที่ 2:
Interface CaptureProcessorImpl extends ProcessorImpl {
// invoked when extensions-interface version < 1.3.0
void process(Map<Integer, Pair<Image, TotalCaptureResult>> results);
// invoked when extensions-interface version >= 1.3.0
void process(Map<Integer, Pair<Image, TotalCaptureResult>> results,
ProcessResultImpl resultCallback, Executor executor);
}
สำหรับการทำงานทั่วไปของกล้อง เช่น การซูม แตะเพื่อโฟกัส แฟลช และการรับแสง เราขอแนะนำให้รองรับคีย์ต่อไปนี้สำหรับทั้ง ส่งคำขอและบันทึกผลลัพธ์:
- ซูม
CaptureRequest#CONTROL_ZOOM_RATIO
CaptureRequest#SCALER_CROP_REGION
- แตะเพื่อโฟกัส:
CaptureRequest#CONTROL_AF_MODE
CaptureRequest#CONTROL_AF_TRIGGER
CaptureRequest#CONTROL_AF_REGIONS
CaptureRequest#CONTROL_AE_REGIONS
CaptureRequest#CONTROL_AWB_REGIONS
- แฟลช
CaptureRequest#CONTROL_AE_MODE
CaptureRequest#CONTROL_AE_PRECAPTURE_TRIGGER
CaptureRequest#FLASH_MODE
- การชดเชยแสง:
CaptureRequest#CONTROL_AE_EXPOSURE_COMPENSATION
สำหรับตัวขยายพื้นฐานที่ใช้เวอร์ชัน 1.2.0 หรือเวอร์ชันก่อนหน้า CameraX
Extensions API รองรับคีย์ข้างต้นทั้งหมดอย่างชัดเจน สำหรับ
extensions-interface
1.3.0 ทั้ง CameraX และ Camera2 ใช้รายการส่งคืน
และรองรับเฉพาะคีย์ที่อยู่ในนั้น ตัวอย่างเช่น หากคุณตัดสินใจส่งคืน
เฉพาะ CaptureRequest#CONTROL_ZOOM_RATIO
และ
CaptureRequest#SCALER_CROP_REGION
ในการใช้งาน 1.3.0 จากนั้น
หมายความว่าแอปรองรับการซูมเท่านั้นขณะแตะเพื่อโฟกัส แฟลช และเปิดรับแสง
ชดเชยไม่ได้
อุปกรณ์ขยายสัญญาณขั้นสูง
Advanced Extender เป็นประเภทการติดตั้งใช้งานของผู้ให้บริการที่ใช้ Camera2 API
ประเภท Extender นี้เพิ่มเข้ามาใน extensions-interface
1.2.0 ขึ้นอยู่กับ
ผู้ผลิตอุปกรณ์ ส่วนขยายอาจนำไปใช้ในเลเยอร์ของแอป
ขึ้นอยู่กับปัจจัยต่อไปนี้
การกำหนดค่าสตรีมที่กำหนดเอง: กำหนดค่าสตรีมที่กำหนดเอง เช่น สตรีม RAW หรือมีสตรีมหลายรายการสำหรับรหัสกล้องจริงที่แตกต่างกัน
ความสามารถในการส่งคำขอ Camera2: รองรับการโต้ตอบที่ซับซ้อน ลอจิกที่สามารถส่งคำขอการบันทึกพร้อมพารามิเตอร์ซึ่งขึ้นอยู่กับผลลัพธ์ของ คำขอก่อนหน้า
ตัวขยายสัญญาณขั้นสูงให้ Wrapper หรือชั้นกลางเพื่อให้คุณสามารถ ปรับแต่งการกำหนดค่าสตรีมและส่งคำขอจับภาพตามคำขอ
ไฟล์ที่จะนำมาใช้
หากต้องการเปลี่ยนไปใช้การติดตั้งใช้งาน Advanced Extender
isAdvancedExtenderImplemented()
วิธีใน
ExtensionVersionImpl
ต้องแสดงผล true
สำหรับส่วนขยายแต่ละประเภท OEM ต้องใช้
คลาส Extender ที่เกี่ยวข้อง ไฟล์การใช้งาน Advanced Extender
ในแพ็กเกจขั้นสูง
คลาส Extender ที่จะนำไปใช้ | |
---|---|
กลางคืน | advanced/NightAdvancedExtenderImpl.java
|
HDR | advanced/HdrAdvancedExtenderImpl.java
|
อัตโนมัติ | advanced/AutoAdvancedExtenderImpl.java
|
โบเก้ | advanced/BokehAdvancedExtenderImpl.java
|
รีทัชใบหน้า | advanced/BeautyAdvancedExtenderImpl.java
|
เราใช้ AdvancedExtenderImpl
เป็นตัวยึดตำแหน่งในตัวอย่างต่อไปนี้
แทนที่ด้วยชื่อไฟล์ Extender สำหรับส่วนขยายที่คุณ
ที่กำลังใช้งานอยู่
มาดูกันว่า Camera2/X เรียกใช้ extensions-interface
เพื่อทำเป้าหมาย 3 อย่างนี้ได้อย่างไร
ขั้นตอนต่างๆ ของแอป
ขั้นตอนของแอป 1: ตรวจสอบความพร้อมใช้งานของส่วนขยาย
รูปที่ 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()
ด้วยคำขอ Camera2 WrapperRequestProcessImpl
Camera2/X ใช้RequestProcessImpl
ซึ่งจะทำให้คุณสามารถดำเนินการตามคำขอบันทึก และ ดึงรูปภาพ หากใช้ImageReaderOutputConfigImpl
RequestProcessImpl
API คล้ายกับ Camera2CameraCaptureSession
API ในแง่ของการดำเนินการตามคำขอ ความแตกต่างมีดังนี้- แพลตฟอร์มเป้าหมายจะระบุโดยรหัสของ
Camera2OutputConfigImpl
- ความสามารถในการเรียกรูปภาพของ
ImageReader
คุณสามารถโทรหา
RequestProcessorImpl.setImageProcessor()
พร้อมระบุ รหัสCamera2OutputConfigImpl
สำหรับลงทะเบียนอินสแตนซ์ImageProcessorImpl
รับรูปภาพอินสแตนซ์
RequestProcessImpl
จะใช้ไม่ได้หลังจากการเรียกใช้ Camera2/XSessionProcessorImpl.onCaptureSessionEnd()
- แพลตฟอร์มเป้าหมายจะระบุโดยรหัสของ
เริ่มทดลองใช้และถ่ายรูป
ในการใช้งาน Advanced Extender คุณสามารถส่งคำขอจับภาพได้ ผ่านอินเทอร์เฟซของ
RequestProcessorImpl
Camera2/X แจ้งให้คุณทราบถึง เริ่มคำขอซ้ำเพื่อดูตัวอย่างหรือลำดับการจับภาพต่อเนื่องตาม กำลังโทรหาSessionProcessorImpl#startRepeating
และSessionProcessorImpl#startCapture
ตามลำดับ คุณควรส่งการจับภาพ เพื่อตอบสนองคำขอตัวอย่างและภาพนิ่งเหล่านี้Camera2/X ยังตั้งค่าพารามิเตอร์คำขอจับภาพผ่าน
SessionProcessorImpl#setParameters
คุณต้องตั้งค่าพารามิเตอร์คำขอเหล่านี้ (หากรองรับพารามิเตอร์) ทั้งในคำขอซ้ำและคำขอเดี่ยวคุณต้องรองรับอย่างน้อย
CaptureRequest.JPEG_ORIENTATION
และCaptureRequest.JPEG_QUALITY
extensions-interface
1.3.0 รองรับคำขอ และคีย์ผลลัพธ์ ซึ่งแสดงด้วยวิธีการต่อไปนี้AdvancedExtenderImpl.getAvailableCaptureRequestKeys()
AdvancedExtenderImpl.getAvailableCaptureResultKeys()
เมื่อนักพัฒนาแอปตั้งค่าคีย์ในรายการ
getAvailableCaptureRequestKeys
คุณต้องเปิดใช้พารามิเตอร์ และตรวจสอบว่าได้บันทึก ผลลัพธ์มีคีย์ในรายการgetAvailableCaptureResultKeys
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
ซึ่งหมายความว่า
คือหากคุณใช้โปรเซสเซอร์ คุณจะต้องรองรับสตรีม
การผสมผสานของสตรีม YUV_420_888
3 รายการ
สำหรับตัวขยายสัญญาณขั้นสูง Camera2/X จะส่งเอาต์พุต 3 แพลตฟอร์มไปยัง
SessionProcessorImpl.initSession()
สาย แพลตฟอร์มเอาต์พุตเหล่านี้มีไว้เพื่อแสดงตัวอย่าง
การจับภาพนิ่ง และการวิเคราะห์รูปภาพตามลำดับ คุณต้องตรวจสอบว่าการแสดงตัวอย่าง
และยังคงจับภาพเอาต์พุตที่แสดงเอาต์พุตที่ถูกต้อง แต่สำหรับรูปภาพ
เอาต์พุตการวิเคราะห์ ตรวจสอบให้แน่ใจว่าใช้งานได้เฉพาะเมื่อไม่ใช่ค่าว่าง หาก
ไม่สามารถรองรับสตรีมการวิเคราะห์รูปภาพ คุณสามารถแสดงผล
รายการใน AdvancedExtenderImpl.getSupportedYuvAnalysisResolutions()
ช่วงเวลานี้
ตรวจสอบว่าพื้นผิวของเอาต์พุตการวิเคราะห์รูปภาพเป็นค่าว่างเสมอ
SessionProcessorImpl.initSession()
รองรับการจับภาพวิดีโอ
สถาปัตยกรรมส่วนขยายกล้องในปัจจุบันรองรับเฉพาะการแสดงตัวอย่างและยังคง
บันทึกกรณีการใช้งาน เราไม่รองรับการเปิดใช้ส่วนขยายใน MediaCodec
หรือแพลตฟอร์ม MediaRecorder
สำหรับบันทึกวิดีโอ อย่างไรก็ตาม มีความเป็นไปได้
เพื่อให้แอปบันทึกเอาต์พุตตัวอย่าง
การรองรับแพลตฟอร์ม MediaCodec
และ MediaRecorder
อยู่ระหว่างการตรวจสอบ
ข้อมูลเมตาเฉพาะส่วนขยาย
สำหรับ Android 14 ขึ้นไป ข้อมูลเมตาเฉพาะส่วนขยาย
ช่วยให้ไคลเอ็นต์ส่วนขยายกล้องตั้งค่าและรับการจับภาพเฉพาะส่วนขยายได้
การตั้งค่าคำขอและผลลัพธ์ โดยเฉพาะอย่างยิ่ง ส่วนขยายกล้อง
ลูกค้าสามารถใช้พารามิเตอร์คำขอบันทึก EXTENSION_STRENGTH
เพื่อควบคุม
ความรัดกุมของส่วนขยายและผลลัพธ์การบันทึก EXTENSION_CURRENT_TYPE
เป็น
ระบุประเภทส่วนขยายที่เปิดใช้
บันทึกคำขอ
EXTENSION_STRENGTH
พารามิเตอร์คำขอบันทึก
ควบคุมความแรงของเอฟเฟกต์หลังการประมวลผลส่วนขยาย ฟิลด์
ผลการบันทึกจะมีค่าความเข้มงวดเริ่มต้นหากไม่ได้ตั้งค่าพารามิเตอร์นี้
จากลูกค้าอย่างชัดเจน คุณใช้พารามิเตอร์ต่อไปนี้ได้
ประเภทส่วนขยาย:
BOKEH
: ควบคุมปริมาณการเบลอHDR
และNIGHT
: ควบคุมปริมาณรูปภาพที่รวมเข้าด้วยกันและความสว่างของ ภาพสุดท้ายFACE_RETOUCH
: ควบคุมปริมาณการเพิ่มประสิทธิภาพและผิว ปรับให้เรียบ
ช่วงที่รองรับพารามิเตอร์ EXTENSION_STRENGTH
อยู่ระหว่าง 0
ถึง
100
โดยมี 0
ระบุว่าไม่มีการประมวลผลส่วนขยายหรือการส่งผ่านแบบง่ายๆ และ
100
บ่งชี้ระดับการขยายสูงสุดของเอฟเฟกต์การประมวลผล
หากต้องการเพิ่มการรองรับ EXTENSION_STRENGTH
โปรดใช้ผู้ให้บริการ
API พารามิเตอร์ที่เจาะจงที่เปิดตัวในไลบรารีส่วนขยายเวอร์ชัน 1.3.0
ของ Google สำหรับข้อมูลเพิ่มเติม โปรดดู
getAvailableCaptureRequestKeys()
บันทึกผลลัพธ์
EXTENSION_CURRENT_TYPE
การบันทึกผลลัพธ์ช่วยให้การติดตั้งใช้งานส่วนขยายแจ้งลูกค้าเกี่ยวกับ
ประเภทส่วนขยาย
เนื่องจากส่วนขยายที่ใช้ประเภท AUTO
จะสลับระหว่างส่วนขยายแบบไดนามิก
ประเภท เช่น HDR
และ NIGHT
ขึ้นอยู่กับเงื่อนไขของฉาก กล้อง
แอปส่วนขยายสามารถใช้ EXTENSION_CURRENT_TYPE
เพื่อแสดงข้อมูลเกี่ยวกับ
ส่วนขยายปัจจุบันที่เลือกโดยส่วนขยาย AUTO
ค่าประมาณเวลาในการตอบสนองแบบเรียลไทม์ยังคงบันทึก
สำหรับ Android 14 ขึ้นไป ไคลเอ็นต์ส่วนขยายกล้อง
สามารถค้นหาแบบเรียลไทม์ ยังคงบันทึกค่าประมาณเวลาในการตอบสนอง โดยอิงตามสถานการณ์และ
สภาพแวดล้อมที่ใช้
getRealtimeStillCaptureLatency()
ช่วงเวลานี้
จะให้ค่าประมาณที่แม่นยำมากกว่า
getEstimatedCaptureLatencyRangeMillis()
แอปสามารถเลือกข้ามการขยายได้ ทั้งนี้ขึ้นอยู่กับเวลาในการตอบสนองโดยประมาณ
การประมวลผล หรือเพื่อแสดงตัวบ่งชี้เพื่อแจ้งให้ผู้ใช้ทราบเกี่ยวกับ
การดำเนินการอยู่
CameraExtensionSession.StillCaptureLatency latency;
latency = extensionSession.getRealtimeStillCaptureLatency();
// The capture latency from ExtensionCaptureCallback#onCaptureStarted() until ExtensionCaptureCallback#onCaptureProcessStarted().
latency.getCaptureLatency();
// The processing latency from ExtensionCaptureCallback#onCaptureProcessStarted() until the processed frame returns to the client.
latency.getProcessingLatency();
ในการสนับสนุนแบบเรียลไทม์ซึ่งบันทึกค่าประมาณของเวลาในการตอบสนอง ให้ใช้ ดังต่อไปนี้
- ส่วนขยายพื้นฐาน:
ImageCaptureExtenderImpl.getRealtimeCaptureLatency()
- ส่วนขยายขั้นสูง:
SessionProcessorImpl.getRealtimeCaptureLatency
บันทึก Callback ความคืบหน้าในการประมวลผล
สำหรับ Android 14 ขึ้นไป ไคลเอ็นต์ส่วนขยายกล้อง สามารถรับการเรียกกลับสำหรับความคืบหน้าของการทำงานที่ใช้เวลานานยังคงบันทึกการประมวลผล การดำเนินงาน แอปสามารถแสดงความคืบหน้าปัจจุบันแก่ผู้ใช้เพื่อปรับปรุง ประสบการณ์ของผู้ใช้โดยรวม
แอปสามารถใช้โค้ดต่อไปนี้เพื่อผสานรวมฟีเจอร์นี้ได้
import android.hardware.camera2.CameraExtensionSession.
ExtensionCaptureCallback;
{
…
class AppCallbackImpl extends ExtensionCaptureCallback {
…
@Override
public void onCaptureProcessProgressed(
@NonNull CameraExtensionSession session,
@NonNull CaptureRequest request,
@IntRange(from = 0, to = 100) int progress) {
// Update app UI with current progress
}
}
…
}
ผู้ให้บริการส่วนขยายของคุณรองรับการบันทึก Callback ความคืบหน้าในการประมวลผล การใช้งานจะต้องเรียก Callback ต่อไปนี้พร้อมด้วยความคืบหน้าปัจจุบัน ค่า:
- ส่วนขยายพื้นฐาน:
ProcessResultImpl.onCaptureProcessProgressed()
- ส่วนขยายขั้นสูง:
CaptureCallback.onCaptureProcessProgressed()
ยังคงจับภาพ Postview อยู่
สำหรับ Android 14 ขึ้นไป ส่วนขยายกล้องสามารถ
ให้ Postview (แสดงตัวอย่างรูปภาพ) โดยใช้
setPostviewOutputConfiguration
เพื่อปรับปรุงประสบการณ์ของผู้ใช้ แอปสามารถแสดงรูปภาพหลังดูโฆษณา
ตัวยึดตำแหน่งเมื่อส่วนขยายมีเวลาในการตอบสนองเพิ่มขึ้น
และแทนที่รูปภาพดังกล่าวเมื่อมีรูปภาพสุดท้ายพร้อมใช้งาน แอปสามารถกำหนดค่า
และออกคำขอบันทึกมุมมองโพสต์โดยใช้รหัสอ้างอิงต่อไปนี้
{
…
if (!CameraExtensionCharacteristics.isPostviewAvailable()) {
continue;
}
…
ExtensionSessionConfiguration extensionConfiguration = new
ExtensionSessionConfiguration(
CameraExtensionCharacteristics.EXTENSION_NIGHT,
outputConfig,
backgroundExecutor,
extensionSessionStateCallback
);
extensionConfiguration.setPostviewOutputConfiguration(
postviewImageOutput);
…
CaptureRequest.Builder captureRequestBuilder =
cameraDevice.createCaptureRequest(
CameraDevice.TEMPLATE_STILL_CAPTURE);
captureRequestBuilder.addTarget(stillImageReader.getSurface());
captureRequestBuilder.addTarget(postviewImageSurface);
CaptureRequest captureRequest = captureRequestBuilder.build();
…
}
ในการสนับสนุนการบันทึกการดูโพสต์ต่อเนื่องได้ การใช้งานผู้ให้บริการของคุณต้องใช้ ดังต่อไปนี้:
ส่วนขยายพื้นฐาน:
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
: การใช้งานพื้นฐานของตัวขยายสัญญาณพื้นฐานservice_based_sample
: การใช้งานที่สาธิตวิธีการโฮสต์ ส่วนขยายกล้องในService
การใช้งานนี้มีคอมโพเนนต์ต่อไปนี้oem_library
: ไลบรารี OEM ของส่วนขยายกล้องถ่ายรูปสำหรับ API ส่วนขยายของ Camera2 และ CameraX ที่ใช้Extensions-Interface
วิธีนี้เป็นเหมือนการข้ามผ่าน โอนสายจากExtensions-Interface
ไปยังบริการ ไลบรารีนี้ นอกจากนี้ยังมีไฟล์ AIDL และคลาส Wrapper ที่ใช้สื่อสารกับ service.Advanced Extender จะเปิดใช้โดยค่าเริ่มต้น หากต้องการเปิดใช้งานตัวขยายพื้นฐาน เปลี่ยน
ExtensionsVersionImpl#isAdvancedExtenderImplemented
เพื่อส่งคืนfalse
extensions_service
: ตัวอย่างการใช้งานบริการส่วนขยาย เพิ่มการติดตั้งใช้งาน ที่นี่ อินเทอร์เฟซที่จะใช้ในบริการคล้ายกัน เป็นExtensions-Interface
ตัวอย่างเช่น การใช้IAdvancedExtenderImpl.Stub
ดำเนินการเช่นเดียวกับAdvancedExtenderImpl
ImageWrapper
และTotalCaptureResultWrapper
เพื่อทำให้Image
และTotalCaptureResult
เป็นพาร์เซลได้
ตั้งค่าไลบรารีผู้ให้บริการในอุปกรณ์
ไลบรารีของผู้ให้บริการ OEM ไม่ได้สร้างไว้ในแอป แอปโหลดจากอุปกรณ์
ที่รันไทม์โดย Camera2/X ใน CameraX แท็ก <uses-library>
จะประกาศ
ไลบรารี androidx.camera.extensions.impl
ซึ่งระบุไว้ในฟิลด์
AndroidManifest.xml
ของไลบรารี camera-extensions
เป็นทรัพยากร Dependency ของ CameraX และต้องเป็น
โหลดขณะรันไทม์ ใน Camera2 เฟรมเวิร์กจะโหลดบริการส่วนขยายที่
ก็ประกาศว่าโหลด<uses-library>
เหมือนกัน
ไลบรารี androidx.camera.extensions.impl
ขณะรันไทม์
วิธีนี้ช่วยให้แอปของบุคคลที่สามที่ใช้ส่วนขยายโหลด OEM ได้โดยอัตโนมัติ ไลบรารีของผู้ให้บริการ ไลบรารี OEM มีการทำเครื่องหมายเป็นไม่บังคับเพื่อให้แอปทำงานในอุปกรณ์ได้ ที่ไม่มีไลบรารีอยู่ในอุปกรณ์ Camera2/X จะจัดการลักษณะการทำงานนี้โดยอัตโนมัติเมื่อแอปพยายามใช้กล้อง ตราบใดที่ผู้ผลิตอุปกรณ์ได้วางไลบรารี OEM ไว้ เพื่อให้แอปค้นพบอุปกรณ์ได้
วิธีตั้งค่าไลบรารี OEM ในอุปกรณ์
- เพิ่มไฟล์สิทธิ์ ซึ่งแท็ก
<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
ซึ่งช่วยให้สอบถามว่าอุปกรณ์รองรับส่วนขยายหรือไม่
โดยเพิ่มบรรทัดต่อไปนี้ลงในไฟล์ Device create แล้ว
PRODUCT_VENDOR_PROPERTIES += \
ro.camerax.extensions.enabled=true \
การตรวจสอบความถูกต้อง
เพื่อทดสอบการใช้งานไลบรารีผู้ให้บริการ OEM ในช่วง
ของการพัฒนาซอฟต์แวร์ ให้ใช้แอปตัวอย่างที่
androidx-main/camera/integration-tests/extensionstestapp/
,
ซึ่งทำงานผ่านส่วนขยายผู้ให้บริการต่างๆ
หลังจากที่คุณติดตั้งใช้งานเสร็จแล้ว ให้ใช้ เครื่องมือตรวจสอบส่วนขยายกล้อง ทำการทดสอบแบบอัตโนมัติและด้วยตนเอง เพื่อยืนยันว่าไลบรารีของผู้ให้บริการ นำไปใช้อย่างถูกต้อง
โหมดฉากขยายเทียบกับส่วนขยายกล้อง
สำหรับส่วนขยายโบเก้ นอกจากการแสดงโดยใช้ส่วนขยายกล้องแล้ว
สามารถแสดงส่วนขยายโดยใช้โหมดฉากขยาย ซึ่งเปิดใช้งานผ่าน
เวลา
CONTROL_EXTENDED_SCENE_MODE
ดูรายละเอียดการใช้งานเพิ่มเติมได้ที่โบเก้กล้อง
โหมดฉากขยายมีข้อจำกัดน้อยกว่าเมื่อเทียบกับส่วนขยายกล้องสำหรับ
แอป Camera2 ตัวอย่างเช่น คุณสามารถเปิดใช้โหมดฉากขยายได้ใน
อินสแตนซ์ CameraCaptureSession
ปกติที่รองรับสตรีมที่ยืดหยุ่น
ชุดค่าผสมและบันทึกพารามิเตอร์คำขอ ในทางตรงกันข้าม ส่วนขยายกล้อง
รองรับสตรีมประเภทคงที่เท่านั้นและรองรับการจับภาพแบบจำกัด
พารามิเตอร์คำขอ
ข้อเสียของโหมดฉากแบบขยายคือ คุณสามารถใช้งานในโหมดนี้ HAL ของกล้อง ซึ่งหมายความว่าต้องได้รับการยืนยันว่าใช้งานได้กับทุกผลิตภัณฑ์ การควบคุมแบบออร์แกนิกที่นักพัฒนาแอปใช้ได้
เราขอแนะนำให้รับแสงโบเก้โดยใช้ทั้งโหมดฉากแบบขยายและกล้อง ส่วนขยายเนื่องจากแอปอาจต้องการใช้ API บางอย่างเพื่อเปิดใช้โบเก้ เราขอแนะนำให้ใช้โหมดฉากแบบขยายก่อน เนื่องจากโหมดนี้ ซึ่งเป็นวิธีที่ยืดหยุ่นสำหรับการเปิดใช้ส่วนขยายโบเก้ จากนั้นคุณจะติดตั้งใช้งาน อินเทอร์เฟซของส่วนขยายกล้องที่ใช้โหมดฉากแบบขยาย หากติดตั้งใช้งาน โบเก้ใน HAL ของกล้องนั้นทำได้ยาก เช่น เนื่องจากต้องมีการโพสต์ ที่ทำงานในเลเยอร์แอปเพื่อประมวลผลภาพ ขอแนะนำให้ใช้ ส่วนขยายโบเก้โดยใช้อินเทอร์เฟซของส่วนขยายกล้อง
คำถามที่พบบ่อย
ระดับ API มีข้อจำกัดไหม
ใช่ ทั้งนี้ขึ้นอยู่กับชุดฟีเจอร์ Android API ที่ OEM กำหนด
การใช้งานไลบรารีของผู้ให้บริการ ตัวอย่างเช่น
ExtenderStateListener.onPresetSession()
ใช้
SessionConfiguration.setSessionParameters()
เพื่อกำหนดชุดแท็กพื้นฐาน การเรียกนี้ใช้ได้เฉพาะในระดับ API เท่านั้น
28 ปีขึ้นไป สำหรับรายละเอียดเกี่ยวกับวิธีอินเทอร์เฟซเฉพาะ ให้ดูที่
เอกสารอ้างอิง API