ผู้ผลิตอุปกรณ์สามารถแสดงส่วนขยาย เช่น โบเก้ โหมดกลางคืน และ 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()
ในตัวขยายพื้นฐาน หรือมีการเรียกinitSession()
ใน Advanced Extenderสำหรับส่วนขยาย Night ระบบจะสร้างอินสแตนซ์คลาส Extender ต่อไปนี้สำหรับประเภทตัวขยายพื้นฐาน
NightImageCaptureExtenderImpl.java
NightPreviewExtenderImpl.java
และสำหรับประเภทตัวขยายขั้นสูง ให้ทำดังนี้
NightAdvancedExtenderImpl.java
ตรวจสอบความพร้อมใช้งานของส่วนขยาย
ก่อนเปิดใช้ส่วนขยาย
isExtensionAvailable()
จะตรวจสอบว่าส่วนขยายพร้อมใช้งานในรหัสกล้องที่ระบุผ่านอินสแตนซ์ของ Extender หรือไม่เริ่มต้น Extender ด้วยข้อมูลกล้อง
Camera2/X จะเรียก
init()
ในอินสแตนซ์ Extender และส่งรหัสกล้องและCameraCharacteristics
ข้อมูลการค้นหา:
เรียกใช้คลาส Extender เพื่อดึงข้อมูล เช่น ความละเอียดที่รองรับ ยังคงจับเวลาในการตอบสนองโดยประมาณ และจับคีย์คำขอจาก 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 ประเภท ได้แก่ ตัวขยายพื้นฐานและตัวขยายขั้นสูง ตัวขยายสัญญาณขั้นสูงได้รับการรองรับตั้งแต่
extensions-interface
1.2.0
ใช้ตัวขยายพื้นฐานสำหรับส่วนขยายที่ประมวลผลรูปภาพใน HAL ของกล้อง หรือใช้โปรเซสเซอร์โพสต์ที่สามารถประมวลผลสตรีม YUV
ใช้ Advanced Extender สำหรับส่วนขยายที่ต้องปรับแต่งการกำหนดค่า Camera2 stream และส่งคำขอจับภาพตามต้องการ
ดูการเปรียบเทียบได้ในตารางต่อไปนี้
ตัวขยายสัญญาณพื้นฐาน | ตัวขยายสัญญาณขั้นสูง | |
---|---|---|
การกำหนดค่าสตรีม | คงที่ แสดงตัวอย่าง: PRIVATE หรือ YUV_420_888 (หากมีหน่วยประมวลผล) การจับภาพนิ่ง: JPEG หรือ YUV_420_888 (หากมีหน่วยประมวลผล)
|
OEM ปรับแต่งได้ |
ส่งคำขอบันทึก | เฉพาะ Camera2/X เท่านั้นที่ส่งคำขอจับภาพได้ คุณสามารถตั้งค่าพารามิเตอร์สำหรับคำขอเหล่านี้ได้ เมื่อระบุตัวประมวลผลสำหรับการจับภาพแล้ว Camera2/X จะส่งคำขอจับภาพหลายรายการและส่งรูปภาพและผลการจับภาพทั้งหมดไปยังตัวประมวลผลได้ | ระบบจะจัดเตรียมอินสแตนซ์ RequestProcessorImpl ให้คุณเพื่อดำเนินการตามคำขอถ่ายภาพด้วย Camera2 และรับผลลัพธ์และรูปภาพ
Camera2/X จะเรียกใช้ |
ฮุกในไปป์ไลน์ของกล้อง |
|
|
เหมาะสำหรับ | ส่วนขยายที่ใช้งานใน 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 มีฮุกสำหรับเชื่อมต่อกับหลายตำแหน่งในไปป์ไลน์ของกล้อง ส่วนขยายแต่ละประเภทจะมีคลาส 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()
ทั้ง 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 ใน Basic Extender
แผนภาพด้านบนแสดงขั้นตอนหลักในการเปิดใช้การแสดงตัวอย่างและการจับภาพนิ่งด้วยส่วนขยายที่ไม่มีตัวประมวลผล ซึ่งหมายความว่า HAL ของกล้องจะประมวลผลส่วนขยาย
ในขั้นตอนนี้ Camera2/X จะเรียกใช้ init()
ก่อนแล้วตามด้วย onInit
ซึ่งจะแจ้งให้คุณทราบว่าเซสชันกล้องกำลังจะเริ่มด้วยส่วนขยายที่ระบุ
คุณทำการเริ่มต้นที่สำคัญได้ใน onInit()
เมื่อกําหนดค่า CameraCaptureSession
ทาง Camera2/X จะเรียกใช้ onPresetSession
เพื่อรับพารามิเตอร์เซสชัน หลังจากกําหนดค่าเซสชันการจับภาพเรียบร้อยแล้ว Camera2/X จะเรียกใช้ onEnableSession
ซึ่งจะแสดงผลCaptureStageImpl
ที่มีพารามิเตอร์การจับภาพ Camera2/X จะส่งคำขอ 1 รายการที่มีพารามิเตอร์การจับภาพเหล่านี้ทันทีเพื่อแจ้ง HAL ในทำนองเดียวกัน ก่อนที่เซสชันการจับภาพจะปิดลง Camera2/X จะเรียกใช้ onDisableSession
จากนั้นส่งคําขอเดียวพร้อมพารามิเตอร์การจับภาพที่ส่งคืน
คำขอที่ซ้ำกันซึ่งทริกเกอร์โดย Camera2/X มีพารามิเตอร์คำขอที่ PreviewExtenderImpl.getCaptureStage()
แสดงผล นอกจากนี้ คำขอยังคงจับภาพยังมีพารามิเตอร์ที่แสดงผลโดย ImageCaptureExtenderImpl.getCaptureStages()
สุดท้าย Camera2/X จะเรียกใช้ onDeInit()
หลังจากเซสชันกล้องสิ้นสุด
คุณปล่อยทรัพยากรได้ใน onDeinit()
แสดงตัวอย่างโปรเซสเซอร์
นอกจาก HAL ของกล้องแล้ว คุณยังใช้ส่วนขยายในโปรเซสเซอร์ได้ด้วย
ใช้ PreviewExtenderImpl.getProcessorType
เพื่อระบุประเภทโปรเซสเซอร์ดังที่อธิบายไว้ด้านล่าง
PROCESSOR_TYPE_NONE
: ไม่มีตัวประมวลผล รูปภาพได้รับการประมวลผลในกล้อง 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
extension API รองรับคีย์ข้างต้นทั้งหมดอย่างชัดเจน สำหรับ extensions-interface
1.3.0 ทั้ง CameraX และ Camera2 จะยึดตามรายการที่แสดงและรองรับเฉพาะคีย์ที่อยู่ในรายการเท่านั้น ตัวอย่างเช่น หากคุณเลือกที่จะแสดงเฉพาะ CaptureRequest#CONTROL_ZOOM_RATIO
และ CaptureRequest#SCALER_CROP_REGION
ในการนำไปใช้งาน 1.3.0 หมายความว่าแอปจะรองรับเฉพาะการซูมเท่านั้น โดยไม่อนุญาตให้ใช้การแตะเพื่อโฟกัส แฟลช และการชดเชยแสง
ตัวขยายสัญญาณขั้นสูง
Advanced Extender เป็นประเภทการติดตั้งใช้งานของผู้ให้บริการที่อิงตาม Camera2 API
เราได้เพิ่มประเภทตัวขยายนี้ใน extensions-interface
1.2.0 อาจมีการใช้ส่วนขยายในเลเยอร์แอป ทั้งนี้ขึ้นอยู่กับผู้ผลิตอุปกรณ์และปัจจัยต่อไปนี้
การกำหนดค่าสตรีมที่กำหนดเอง: กำหนดค่าสตรีมที่กำหนดเอง เช่น สตรีม RAW หรือมีสตรีมหลายรายการสำหรับรหัสกล้องจริงที่แตกต่างกัน
ความสามารถในการส่งคำขอ Camera2: รองรับตรรกะการโต้ตอบที่ซับซ้อนซึ่งสามารถส่งคำขอจับภาพพร้อมพารามิเตอร์ตามผลลัพธ์ของคำขอก่อนหน้า
ตัวขยายขั้นสูงมี Wrapper หรือเลเยอร์กลางเพื่อให้คุณปรับแต่งการกำหนดค่าสตรีมและส่งคำขอบันทึกได้ตามต้องการ
ไฟล์ที่จะติดตั้งใช้งาน
หากต้องการเปลี่ยนไปใช้การติดตั้งใช้งานตัวขยายขั้นสูง isAdvancedExtenderImplemented()
method ใน ExtensionVersionImpl
ต้องแสดงผลเป็น true
OEM ต้องใช้คลาส Extender ที่เกี่ยวข้องสำหรับส่วนขยายแต่ละประเภท ไฟล์การใช้งานตัวขยายขั้นสูงอยู่ในแพ็กเกจขั้นสูง
คลาส Extender ที่จะติดตั้งใช้งาน | |
---|---|
กลางคืน | advanced/NightAdvancedExtenderImpl.java
|
HDR | advanced/HdrAdvancedExtenderImpl.java
|
อัตโนมัติ | advanced/AutoAdvancedExtenderImpl.java
|
โบเก้ | advanced/BokehAdvancedExtenderImpl.java
|
รีทัชใบหน้า | advanced/BeautyAdvancedExtenderImpl.java
|
เราใช้ AdvancedExtenderImpl
เป็นตัวยึดตำแหน่งในตัวอย่างต่อไปนี้
แทนที่ด้วยชื่อไฟล์ Extender ของส่วนขยายที่คุณกำลังติดตั้งใช้งาน
มาดูกันว่า Camera2/X เรียกใช้ extensions-interface
อย่างไรเพื่อให้ได้ 3 ขั้นตอนในการใช้งานแอป
ขั้นตอนการทํางานของแอป 1: ตรวจสอบความพร้อมใช้งานของส่วนขยาย
รูปที่ 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 รายการ
สำหรับตัวขยายขั้นสูง 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 ขึ้นไป ไคลเอ็นต์ส่วนขยายกล้องจะได้รับ Callback สำหรับความคืบหน้าของการทำงานที่ใช้เวลานานยังคงจับภาพการดำเนินการประมวลผลอยู่ แอปสามารถแสดงความคืบหน้าปัจจุบันต่อผู้ใช้เพื่อปรับปรุงประสบการณ์โดยรวมของผู้ใช้
แอปสามารถใช้โค้ดต่อไปนี้เพื่อผสานรวมฟีเจอร์นี้
import android.hardware.camera2.CameraExtensionSession.
ExtensionCaptureCallback;
{
…
class AppCallbackImpl extends ExtensionCaptureCallback {
…
@Override
public void onCaptureProcessProgressed(
@NonNull CameraExtensionSession session,
@NonNull CaptureRequest request,
@IntRange(from = 0, to = 100) int progress) {
// Update app UI with current progress
}
}
…
}
หากต้องการรองรับการเรียกกลับความคืบหน้าในการประมวลผลภาพ การใช้งานผู้ให้บริการส่วนขยายของคุณต้องเรียกใช้การเรียกกลับต่อไปนี้พร้อมค่าความคืบหน้าปัจจุบัน
- ส่วนขยายพื้นฐาน:
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 ที่ใช้สื่อสารกับบริการAdvanced Extender จะเปิดใช้โดยค่าเริ่มต้น หากต้องการเปิดใช้ตัวขยายพื้นฐาน ให้เปลี่ยน
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
ซึ่งจะช่วยให้สามารถค้นหาได้ว่าอุปกรณ์รองรับส่วนขยายหรือไม่
โดยในการดำเนินการ ให้เพิ่มบรรทัดต่อไปนี้ในไฟล์ 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