หน้านี้ระบุความแตกต่างระหว่างระบบมุมมองขยาย (EVS) กับ Camera2 และอธิบายวิธีตั้งค่าการใช้งาน Camera2
เปิดและปิดกล้อง
EVS
openCamera จะรวมการเปิดอุปกรณ์และการกำหนดค่าสตรีมเดียวเข้าด้วยกัน
Camera2
วิธีเปิดและปิดอุปกรณ์ด้วย Camera2
เลือกโหมดใดโหมดหนึ่งต่อไปนี้
โหมดเฉพาะ ให้ใช้
CameraManager.openCamera(Java) หรือACameraManager_openCameraใน Native Development Kit (NDK)โหมดแชร์ ให้ใช้
openSharedCameraหรือACameraManager_openSharedCameraเมื่อเปิดใช้การแชร์กล้อง ให้ระบุการกำหนดค่าเซสชันที่แชร์
หากต้องการกำหนดค่าสตรีม ให้สร้างเซสชันการจับภาพด้วยพื้นผิวเอาต์พุตที่เกี่ยวข้อง เช่น จาก ImageReader หรือ SurfaceView ด้วย
CameraDevice.createCaptureSession()(Java) หรือACameraDevice_createCaptureSession()(NDK)Camera2 รองรับสตรีมหลายรายการพร้อมกัน สร้างสตรีมหลายรายการเพื่อวัตถุประสงค์ต่างๆ เช่น การแสดงตัวอย่าง การบันทึก และการประมวลผลรูปภาพ สตรีมทำหน้าที่เป็นไปป์ไลน์แบบขนาน ซึ่งจะประมวลผลเฟรมดิบจากกล้องตามลำดับ
หากต้องการปิดอุปกรณ์กล้อง ให้ใช้
CameraDevice.close()(Java) หรือACameraDevice_close()(NDK)
ลองดูข้อมูลโค้ดตัวอย่างต่อไปนี้
Java
CameraManager manager = (CameraManager) getSystemService(Context.CAMERA_SERVICE);
try {
manager.openCamera(cameraId, new CameraDevice.StateCallback() {
@Override
public void onOpened(@NonNull CameraDevice camera) {
// Camera opened, now create session
}
@Override
public void onDisconnected(@NonNull CameraDevice camera) {}
@Override
public void onError(@NonNull CameraDevice camera, int error) {}
}, handler);
} catch (CameraAccessException e) {
// Handle exception
}
NDK
ACameraManager *cameraManager = ACameraManager_create();
ACameraDevice *cameraDevice = nullptr;
camera_status_t status = ACameraManager_openCamera(
cameraManager, cameraId, &deviceStateCallbacks, &cameraDevice);
สตรีมข้อมูลกล้อง
ส่วนนี้อธิบายวิธีสตรีมข้อมูลกล้อง
EVS
ใน EVS ให้ทำดังนี้
- หากต้องการเริ่มสตรีม ให้ใช้
startVideoStream - หากต้องการหยุดสตรีม ให้ใช้
stopVideoStream
Camera2
ใน Camera2 ให้ทำดังนี้
หากต้องการสร้าง
CaptureRequestที่เหมาะสำหรับการแสดงตัวอย่าง ให้ใช้TEMPLATE_PREVIEWกับCameraDevice.createCaptureRequest()ใน Java หรือACameraDevice_createCaptureRequest()ใน NDKหากต้องการส่งคำขอสตรีมต่อเนื่อง ให้ใช้
CameraCaptureSession.setSingleRepeatingRequest(Java) หรือACameraCaptureSession_setRepeatingRequestV2(NDK)หากต้องการหยุดสตรีม ให้ใช้
CameraCaptureSession.stopRepeating(Java) หรือACameraCaptureSession_stopRepeating(NDK)
การจัดการบัฟเฟอร์
ใน EVS ก่อนหน้านี้
setMaxFramesInFlightจะควบคุมจำนวนบัฟเฟอร์ ซึ่งอาจมีการเปลี่ยนแปลงระหว่างสตรีม เมื่อเริ่มสตรีมจากกล้อง EVS จะให้รหัสบัฟเฟอร์สำหรับเฟรมรูปภาพแต่ละเฟรม ซึ่งสัมพันธ์กับที่อยู่บัฟเฟอร์ฮาร์ดแวร์เดียวกันในหน่วยความจำใน Camera2 ระบบจะตั้งค่าจำนวนรูปภาพสูงสุดสำหรับ
AImageReaderหรือImageReaderด้วยAImageReader_newหรือImageReader.newInstanceเมื่อเริ่มต้นเซสชัน และจะเปลี่ยนแปลงแบบไดนามิกไม่ได้เมื่อเซสชันเริ่มขึ้น หากต้องการรับรหัสบัฟเฟอร์สำหรับแต่ละเฟรม ไคลเอ็นต์สามารถเก็บรักษาการจับคู่ที่สัมพันธ์กับที่อยู่บัฟเฟอร์ฮาร์ดแวร์ที่ได้รับจากออบเจ็กต์Imageกับตัวระบุที่ไม่ซ้ำกัน
หยุดและเล่นสตรีมต่อ
EVS ใช้
pauseVideoStreamและresumeVideoStreamCamera2 ไม่มีฟังก์ชันที่เทียบเท่าโดยตรง แต่ให้ใช้ฟังก์ชันต่อไปนี้แทน
- หากต้องการหยุดชั่วคราว ให้ใช้
stopRepeating - หากต้องการเล่นต่อ ให้ใช้
setSingleRepeatingRequest
- หากต้องการหยุดชั่วคราว ให้ใช้
พารามิเตอร์กล้อง
EVS ใช้เมธอดต่างๆ เช่น
setIntParameterเพื่อเปลี่ยนพารามิเตอร์คำขอการจับภาพจากกล้องใน Camera2 หากต้องการแก้ไขพารามิเตอร์ ให้เรียกใช้ API ของ set สำหรับ
CaptureRequestเครื่องมือสร้าง แล้วส่ง
ลองดูตัวอย่างโค้ดต่อไปนี้
Java
CaptureRequest.Builder builder = cameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
builder.set(CaptureRequest.CONTROL_EFFECT_MODE, CaptureRequest.CONTROL_EFFECT_MODE_MONO);
// Submit this request
NDK
ACaptureRequest_setEntry_i32(captureRequest, ACAMERA_CONTROL_EFFECT_MODE, 1, &effectMode);
กล้องเชิงตรรกะ
EVS: สำหรับกล้องเชิงตรรกะ เช่น กล้องมองรอบข้าง EVS Manager จะเปิดกล้องจริงที่เชื่อมโยงทั้งหมด เริ่มสตรีมวิดีโอ และแสดงอาร์เรย์รูปภาพที่สอดคล้องกัน
Camera2: เมื่อต้องการฟังก์ชันการทำงานที่คล้ายกันด้วย Camera2 แอปต้องจัดการกล้องเชิงตรรกะ ซึ่งคุณต้องทำดังนี้
- ระบุกล้องย่อยจริงที่เชื่อมโยงกับกล้องเชิงตรรกะ
- เปิดกล้องจริงที่จำเป็นแต่ละตัว
- เริ่มสตรีมในกล้องแต่ละตัว
- ซิงค์เฟรม หากจำเป็น โดยปกติแล้ว HAL จะจัดการการซิงค์ระดับฮาร์ดแวร์
เราจะจัดหาไลบรารีความเข้ากันได้ (เลเยอร์ Shim) ให้กับไคลเอ็นต์ EVS ที่มีอยู่เพื่อช่วยในการเปลี่ยนผ่าน โดยมีเป้าหมายเพื่อรองรับ Camera2 API ด้วยการเปลี่ยนแปลงโค้ดน้อยที่สุด
สิทธิ์
ส่วนนี้อธิบายการเปลี่ยนแปลงสิทธิ์
EVS
การเข้าถึงจะจำกัดไว้ที่ตัวระบุที่ไม่ซ้ำกัน (UID) ที่ได้รับสิทธิ์ เช่น
AID_AUTOMOTIVE_EVS. สิทธิ์ที่เลิกใช้งานแล้ว ได้แก่
android.car.permission.USE_CAR_EVS_CAMERA
Camera2
Camera2 ต้องใช้ android.permission.CAMERA สำหรับกรณีพิเศษ
android.permission.SYSTEM_CAMERA: เพื่อเข้าถึงกล้องที่ซ่อนจากแอปของบุคคลที่สาม และต้องมีสิทธิ์CAMERAด้วย ดูข้อมูลเพิ่มเติมได้ที่ กล้องระบบandroid.permission.CAMERA_HEADLESS_SYSTEM_USER: อนุญาตให้เข้าถึงจากUser 0ซึ่งมีความสำคัญต่อบริการต่างๆ เช่น กล้องมองหลังที่ต้องทำงานเมื่อมีการสลับผู้ใช้ ต้องมีสิทธิ์ CAMERA ที่ได้รับล่วงหน้าandroid.permission.CAMERA_PRIVACY_ALLOWLIST: อนุญาตให้ OEM ยกเว้นแอปบางแอปที่มีความสำคัญต่อความปลอดภัยจากการเปิด/ปิดความเป็นส่วนตัวของกล้องที่ผู้ใช้ควบคุม
แอปกล้องที่มีความสำคัญต่อความปลอดภัยต้องเป็นไปตามนโยบายการให้สิทธิ์ล่วงหน้าในตัวของ Google ที่ระบุไว้ใน Design for Driving
ไคลเอ็นต์หลักและไคลเอ็นต์รอง
สำหรับการเข้าถึงกล้องที่แชร์
EVS มี API ที่ชัดเจน ได้แก่
setPrimaryClientและforcePrimaryClientเพื่อจัดการไคลเอ็นต์หลัก ซึ่งมี สิทธิ์แก้ไขพารามิเตอร์Camera2 เมื่อเปิดกล้องในโหมดแชร์ (Android 16 ขึ้นไป) ลำดับความสำคัญของไคลเอ็นต์ที่เข้าถึงกล้องจะเป็นตัวกำหนดไคลเอ็นต์หลัก ไคลเอ็นต์ที่มีลำดับความสำคัญสูงสุด (โดยปกติจะเป็นแอปที่ทำงานอยู่เบื้องหน้า) จะแก้ไขพารามิเตอร์คำขอการจับภาพได้ ไม่มีการใช้ API โดยตรงเพื่อบังคับสถานะหลัก เฟรมเวิร์กจะเป็นผู้จัดการสถานะหลัก
กล้องระบบ
หากต้องการจำกัดไม่ให้อุปกรณ์กล้องเข้าถึงได้โดยแอปของระบบหรือแอป 1P เท่านั้น,
ให้ประกาศความสามารถ ANDROID_REQUEST_AVAILABLE_CAPABILITIES_SYSTEM_CAMERA
ใน Camera HAL สำหรับอุปกรณ์นั้น ไคลเอ็นต์ต้องมี android.permission.SYSTEM_CAMERA นอกเหนือจาก android.permission.CAMERA ที่เชื่อมต่อกับอุปกรณ์กล้องนี้
กล้องมองหลัง
EVS
ก่อนหน้านี้ EVS อนุญาตให้เข้าถึงกล้องก่อนที่ Android จะบูต ซึ่งเป็นเหตุการณ์สำคัญสำหรับฟีเจอร์ต่างๆ เช่น กล้องมองหลัง OEM ยานพาหนะมีหน้าที่รับผิดชอบในการปฏิบัติตาม และรับรองตามกฎระเบียบที่ระบุไว้ที่ Federal Motor Vehicle Safety Standard (FMVSS) No. 111 Rear Visibility นอกจากนี้ OEM ยานพาหนะต้องปฏิบัติตามกฎระเบียบอื่นๆ เกี่ยวกับกล้องมองหลังด้วย
การปฏิบัติตามข้อกำหนดขึ้นอยู่กับฮาร์ดแวร์ การใช้งาน HAL และการผสานรวมระบบโดยรวม หลังจากที่แพลตฟอร์มอ้างอิงบูต Android แล้ว โดยปกติ EVS จะใช้เวลา 4-6 วินาทีในการทำงานและให้สิทธิ์เข้าถึงกล้อง
Camera2
ไคลเอ็นต์ที่ได้รับสิทธิ์ ซึ่งระบุโดย AID_AUTOMOTIVE_EVS UID สามารถใช้ Camera2 API เพื่อเข้าถึงกล้องก่อนที่กระบวนการบูต Android จะเสร็จสมบูรณ์ การเข้าถึงก่อนหน้านี้จำกัดไว้เฉพาะกล้องระบบที่อยู่ภายนอกยานพาหนะ Camera2 เป็นไปตาม KPI ประสิทธิภาพเดียวกันสำหรับการเข้าถึงกล้องก่อนหน้านี้เช่นเดียวกับ EVS ซึ่งโดยปกติจะพร้อมใช้งานภายใน 4-6 วินาทีหลังจากบูต Android
เพื่อให้กล้องมองหลังแสดงผลได้อย่างสม่ำเสมอและไม่ถูกบดบัง โดยเฉพาะอย่างยิ่งระหว่างการเปลี่ยนผู้ใช้หรือเมื่อแอปอื่นๆ อาจบดบังการแสดงตัวอย่าง เราขอแนะนำให้ใช้หลักเกณฑ์ต่อไปนี้เมื่อใช้กล้องมองหลังกับ Camera2
กำหนดให้กล้องมองหลังเป็นกล้องระบบเพื่อจำกัด การเข้าถึงของแอปของบุคคลที่สาม
เรียกใช้บริการหรือแอปที่เข้าถึงกล้องในฐานะ
User 0เพื่อใช้สิทธิ์ CAMERA_HEADLESS_SYSTEM_USER ซึ่งจะช่วยให้มั่นใจได้ว่าการสตรีมจากกล้องจะไม่หยุดชะงัก ไม่ว่าผู้ใช้เบื้องหน้าจะเปลี่ยนไปใช้คนอื่นหรือไม่ก็ตามเพิ่มแอปในรายการที่อนุญาตพิเศษสำหรับความเป็นส่วนตัวของกล้อง เพื่อให้สิทธิ์เข้าถึงกล้อง แม้ว่าจะเปิดใช้การเปิด/ปิดความเป็นส่วนตัวของกล้องที่ผู้ใช้ควบคุมอยู่ก็ตาม
CarEVSManager และ CarEVSService
ก่อนหน้านี้ CarEVSManager ให้สิทธิ์เข้าถึงกล้องแก่แอป Java การเปลี่ยนไปใช้ Camera2 จะแทนที่ฟีเจอร์นี้ด้วย
standard android.hardware.camera2.CameraManager
เราวางแผนที่จะเลิกใช้งาน CarEVSService ซึ่งเป็นบริการที่ไม่บังคับที่ตรวจสอบพร็อพเพอร์ตี้ GEAR_SELECTION VHAL และเคยใช้เพื่อเริ่มกิจกรรมกล้องมองหลังที่ OEM ระบุ OEM ที่ใช้ฟีเจอร์นี้ต้องเปลี่ยนตรรกะที่เกี่ยวข้องไปเป็นแอปที่เป็นของ OEM
- ตรวจสอบพร็อพเพอร์ตี้
GEAR_SELECTION VHAL - เปิดใช้กิจกรรมกล้องมองหลังเมื่อเปิดใช้งานเกียร์ถอยหลัง
- ใช้ Camera2 API เพื่อแสดงฟีดกล้อง
การแสดงภาพ
การแสดงผล EVS และบริการการแสดงผลยานยนต์
เลิกใช้งานแล้ว
Camera2
ใช้วิธีการแสดงผล Android มาตรฐานกับ Surface,
android.hardware.display.DisplayManager และ
android.view.Display
สำหรับสถานการณ์ที่ต้องมีการแสดงผลกล้องก่อนหน้านี้ Camera2 ImageReader สามารถให้สิทธิ์เข้าถึงบัฟเฟอร์ฮาร์ดแวร์ได้โดยตรง คุณจึงผสานรวมบัฟเฟอร์ดังกล่าวกับการใช้งานการแสดงผลที่อิงตาม DRM ที่มีอยู่เพื่อการแสดงผลได้
การเข้าถึงกล้องก่อนหน้านี้ได้รับอนุญาตเฉพาะไคลเอ็นต์ที่ได้รับสิทธิ์ซึ่งมี AID_AUTOMOTIVE_EVS_UID และจำกัดไว้เฉพาะกล้องระบบที่อยู่ภายนอกยานพาหนะ
HAL ของโปรแกรมจำลอง (HAL จำลองของ EVS)
เราวางแผนที่จะเลิกใช้งาน HAL จำลองของ EVS แต่ OEM ควรใช้ HAL ของกล้องจำลอง Camera2
hardware/google/camera/devices/EmulatedCamera/
ซึ่งเราวางแผนที่จะรองรับสิ่งต่อไปนี้
- จำนวนกล้องที่กำหนดค่าได้
- รูปแบบการทดสอบแถบสี
- การจำลองไฟล์วิดีโอ
วิธีรวม HAL นี้ไว้ในการบิลด์
# In device.mk
PRODUCT_SOONG_NAMESPACES += hardware/google/camera/devices/EmulatedCamera
PRODUCT_PACKAGES += com.google.emulated.camera.provider.hal
นอกจากนี้ คุณยังต้องมีนโยบาย Security-Enhanced Linux (SELinux) ที่เหมาะสมเพื่ออนุญาตให้ cameraserver โต้ตอบกับบริการ HAL ของกล้องจำลอง
HAL ของกล้อง V4L2 UVC
เราวางแผนที่จะเลิกใช้งาน HAL ของ EVS V4L2 ใช้การรองรับกล้องภายนอกของ Camera2 สำหรับกล้อง USB (UVC) ดูข้อมูลเพิ่มเติมได้ที่ กล้อง USB ภายนอก
Ultrasonics API
เราวางแผนที่จะเลิกใช้งาน Ultrasonics API ของ EVS แต่ให้ใช้พร็อพเพอร์ตี้ VHAL ต่อไปนี้ที่เปิดตัวใน Android 15 สำหรับการตรวจจับเซ็นเซอร์อัลตราโซนิก
| พร็อพเพอร์ตี้ | ประเภท | คำจำกัดความ |
|---|---|---|
ULTRASONICS_SENSOR_POSITION |
คงที่ | {<x>, <y>, <z>}
ในหน่วยมิลลิเมตร ค่าแต่ละค่าจะแสดงตำแหน่งของเซ็นเซอร์ตาม แกนที่เกี่ยวข้องเทียบกับเฟรมพิกัดเซ็นเซอร์ AAOS |
ULTRASONICS_SENSOR_ORIENTATION |
คงที่ | {<qw>, <qx>, <qy>, <qz>}
ซึ่งเป็นการหมุนควอเทอร์เนียนของเซ็นเซอร์เทียบกับ เฟรมพิกัดเซ็นเซอร์ AAOS $$w+xi+yj+zk$$ |
ULTRASONICS_SENSOR_FIELD_OF_VIEW |
คงที่ | {<horizontal>, <vertical>}
ในหน่วยองศา ขอบเขตการมองเห็นแนวนอนและแนวตั้งของเซ็นเซอร์ |
ULTRASONICS_SENSOR_DETECTION_RANGE |
คงที่ | {<minimum>, <maximum>}
ในหน่วยมิลลิเมตร ช่วงการตรวจจับของเซ็นเซอร์ |
ULTRASONICS_SENSOR_DETECTION_RANGES |
คงที่ | {<range_min_1>, <range_max_1>, <range_min_2>,
<range_max_2>}
ในหน่วยมิลลิเมตร (รวม) อาร์เรย์ของช่วงการตรวจจับที่เซ็นเซอร์รองรับ |
ULTRASONICS_SENSOR_DETECTION_RANGES |
ต่อเนื่อง | {<distance>, <distance_error>}
ในหน่วยมิลลิเมตร ระยะทางที่วัดได้และข้อผิดพลาดของระยะทางของเซ็นเซอร์ หาก รองรับเฉพาะช่วง ค่านี้จะเป็นระยะทางต่ำสุดในระยะที่ตรวจพบ |