หน้านี้จะระบุความแตกต่างระหว่างระบบมุมมองเพิ่มเติม (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
และresumeVideoStream
Camera2 ไม่มีฟีเจอร์ที่เทียบเท่าโดยตรง แต่ให้ทำดังนี้
- หยุดชั่วคราว ใช้
stopRepeating
- กลับมาใช้
setSingleRepeatingRequest
- หยุดชั่วคราว ใช้
พารามิเตอร์กล้อง
EVS ใช้เมธอด เช่น
setIntParameter
เพื่อเปลี่ยนพารามิเตอร์คำขอกล้อง จับภาพใน Camera2 หากต้องการแก้ไขพารามิเตอร์ ให้เรียก API set สำหรับ
CaptureRequest
Builder แล้วส่ง
ลองดูตัวอย่างโค้ดต่อไปนี้
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 จะเปิดกล้องจริงที่เชื่อมโยงทั้งหมด เริ่มสตรีมวิดีโอ และจัดเตรียมอาร์เรย์รูปภาพที่สอดคล้องกัน
Camera2: เมื่อต้องการฟังก์ชันการทำงานที่คล้ายกันด้วย Camera2 แอปต้อง จัดการกล้องตรรกะ ซึ่งกำหนดให้คุณต้องทำดังนี้
- ระบุกล้องย่อยทางกายภาพที่เชื่อมโยงกับกล้องตรรกะ
- เปิดกล้องจริงที่จำเป็นแต่ละตัว
- เริ่มสตรีมในกล้องแต่ละตัว
- ซิงค์เฟรมหากจำเป็น โดยปกติแล้ว การซิงค์ระดับฮาร์ดแวร์จะจัดการที่ HAL
เราจะจัดหาไลบรารีความเข้ากันได้ (เลเยอร์ Shim) ให้กับไคลเอ็นต์ EVS ที่มีอยู่เพื่อ อำนวยความสะดวกในการเปลี่ยน โดยมีเป้าหมายเพื่อรองรับ API ของ Camera2 โดยมีการเปลี่ยนแปลงโค้ดน้อยที่สุด
สิทธิ์
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 ที่ระบุไว้ในออกแบบมาเพื่อการขับขี่
ไคลเอ็นต์หลักและรอง
สำหรับสิทธิ์เข้าถึงกล้องที่แชร์ ให้ทำดังนี้
EVS มี API ที่ชัดเจน
setPrimaryClient
และforcePrimaryClient
เพื่อจัดการไคลเอ็นต์หลักซึ่งมี สิทธิ์ในการแก้ไขพารามิเตอร์Camera2 เมื่อเปิดกล้องในโหมดที่ใช้ร่วมกัน (Android 16 ขึ้นไป) ลำดับความสำคัญของไคลเอ็นต์ที่เข้าถึงกล้องจะเป็นตัวกำหนดไคลเอ็นต์หลัก ไคลเอ็นต์ที่มีลำดับความสำคัญสูงสุด (โดยปกติคือแอปที่ทำงานอยู่เบื้องหน้า) สามารถแก้ไขพารามิเตอร์คำขอจับภาพได้ ไม่มีการใช้ API โดยตรงเพื่อบังคับ สถานะหลัก เฟรมเวิร์กจะจัดการสถานะหลัก
กล้องระบบ
หากต้องการจำกัดไม่ให้อุปกรณ์กล้องเข้าถึงได้โดยแอปของระบบหรือแอป 1P เท่านั้น
ให้ประกาศความสามารถ ANDROID_REQUEST_AVAILABLE_CAPABILITIES_SYSTEM_CAMERA
ใน HAL ของกล้องสำหรับอุปกรณ์นั้น ไคลเอ็นต์ต้องมี
android.permission.SYSTEM_CAMERA
นอกเหนือจาก
android.permission.CAMERA
ที่เชื่อมต่อกับอุปกรณ์กล้องนี้
CarEVSManager และ CarEVSService
สำหรับการเข้าถึง API แอป Java ควรใช้
android.hardware.camera2.CameraManager
มาตรฐานแทน CarEVSManager
สำหรับกล้องมองหลัง ตรรกะใน CarEVSService
ที่ตรวจสอบพร็อพเพอร์ตี้ VHAL ของ GEAR_SELECTION
และเปิดใช้กิจกรรม ต้อง ย้ายข้อมูลไปยังแอปที่เป็นของ OEM แอปนี้มีลักษณะดังนี้
- ตรวจสอบพร็อพเพอร์ตี้
GEAR_SELECTION
ของ VHAL - เปิดกิจกรรมกล้องมองหลังเมื่อเข้าเกียร์ถอย
- ใช้ Camera2 API เพื่อแสดงฟีดกล้อง
เพื่อให้กล้องมองหลังแสดงผลได้อย่างสม่ำเสมอและไม่ถูกบดบัง โดยเฉพาะ ในระหว่างการเปลี่ยนหน้าของผู้ใช้หรือเมื่อแอปอื่นๆ อาจบดบังตัวอย่าง เรา ขอแนะนำให้ปฏิบัติตามหลักเกณฑ์เหล่านี้เมื่อใช้ฟังก์ชันกล้องมองหลังด้วย Camera2
ทำเครื่องหมายกล้องมองหลังเป็นกล้องระบบ
เรียกใช้บริการหรือแอปที่เข้าถึงกล้องในฐานะ
User 0
โดยใช้สิทธิ์CAMERA_HEADLESS_SYSTEM_USER
เพิ่มแอปไปยังรายการที่อนุญาตสำหรับความเป็นส่วนตัวของกล้อง
การแสดงผลของโฆษณา Display
บริการแสดงผล EVS และบริการแสดงผลยานยนต์
ซึ่งเลิกใช้งานแล้ว
Camera2
ใช้วิธีการแสดงผลมาตรฐานของ Android กับ Surface,
android.hardware.display.DisplayManager
และ
android.view.Display
สำหรับสถานการณ์ที่ต้องแสดงกล้องก่อนเวลาอันควร ImageReader ของ Camera2 จะให้สิทธิ์เข้าถึงบัฟเฟอร์ฮาร์ดแวร์โดยตรงเพื่อให้คุณผสานรวมกับ การใช้งานการแสดงผลที่อิงตาม DRM ที่มีอยู่สำหรับการแสดงผลได้
สิทธิ์เข้าถึงกล้องก่อนเปิดตัวนี้อนุญาตให้เฉพาะไคลเอ็นต์ที่ได้รับสิทธิ์
ซึ่งมี AID_AUTOMOTIVE_EVS_UID
และจำกัดเฉพาะกล้องของระบบที่อยู่
ภายนอกยานพาหนะ
HAL ของโปรแกรมจำลอง (HAL จำลองของ EVS)
เรามีแผนที่จะเลิกใช้งาน EVS Mock HAL แต่ OEM ควรใช้ Camera2
HAL ของกล้องจำลอง 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
นอกจากนี้ คุณยังต้องมีนโยบาย Linux (SELinux) ที่ได้รับการปรับปรุงด้านความปลอดภัยที่เหมาะสมเพื่อ
อนุญาตให้ cameraserver
โต้ตอบกับบริการ HAL ของกล้องจำลอง
HAL กล้อง V4L2 UVC
เราวางแผนที่จะเลิกใช้งาน EVS V4L2 HAL ใช้การรองรับกล้องภายนอก Camera2 สำหรับ กล้อง USB (UVC) ดูข้อมูลเพิ่มเติมได้ที่กล้อง USB ภายนอก
สิทธิ์เข้าถึงกล้องก่อนเปิดตัว
การเข้าถึงกล้อง EVS ถูกจำกัดไว้สำหรับไคลเอ็นต์ที่มีสิทธิ์ซึ่งมี
AID_AUTOMOTIVE_EVS
UID สำหรับการเข้าถึงกล้องก่อนที่กระบวนการบูต Android จะเสร็จสมบูรณ์
โดยมี UID เป็น AID_AUTOMOTIVE_EVS
อย่างไรก็ตาม การเข้าถึงกล้องก่อนเปิดตัวจะจำกัดไว้สำหรับกล้องระบบที่อยู่ภายนอกรถเท่านั้น
Ultrasonics APIs
เราวางแผนที่จะเลิกใช้งาน EVS Ultrasonics API แต่ให้ใช้พร็อพเพอร์ตี้ 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>}
ระยะทางที่วัดได้และข้อผิดพลาดของระยะทางของเซ็นเซอร์ในหน่วยมิลลิเมตร หากรองรับเฉพาะช่วง นี่คือระยะทางต่ำสุดในระยะที่ตรวจพบ |