หน้านี้จะระบุความแตกต่างระหว่างระบบมุมมองเพิ่มเติม (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
เพื่อจัดการไคลเอ็นต์หลักซึ่งมี สิทธิ์ในการแก้ไขพารามิเตอร์เมื่อเปิดกล้องในโหมดที่ใช้ร่วมกัน (Android 16 ขึ้นไป) Camera2 จะกำหนดไคลเอ็นต์หลักตามลำดับความสำคัญของไคลเอ็นต์ที่เข้าถึงกล้อง ไคลเอ็นต์ที่มีลำดับความสำคัญสูงสุด (โดยปกติคือแอปที่ทำงานอยู่เบื้องหน้า) สามารถแก้ไขพารามิเตอร์คำขอการจับภาพได้ ไม่มีการใช้ API โดยตรงเพื่อบังคับให้ สถานะหลัก เฟรมเวิร์กจะจัดการสถานะหลัก
กล้องระบบ
หากต้องการจำกัดไม่ให้อุปกรณ์กล้องเข้าถึงได้โดยแอปของระบบหรือแอป 1P เท่านั้น
ให้ประกาศความสามารถ ANDROID_REQUEST_AVAILABLE_CAPABILITIES_SYSTEM_CAMERA
ใน HAL ของกล้องสำหรับอุปกรณ์นั้น ไคลเอ็นต์ต้องมี android.permission.SYSTEM_CAMERA
นอกเหนือจาก android.permission.CAMERA
ที่เชื่อมต่อกับอุปกรณ์กล้องนี้
กล้องมองหลัง
EVS
ก่อนหน้านี้ EVS จะเปิดใช้สิทธิ์เข้าถึงกล้องก่อนที่ Android จะบูต ซึ่งเป็นเหตุการณ์สำคัญสำหรับ ฟีเจอร์ต่างๆ เช่น กล้องมองหลัง OEM ของยานพาหนะมีหน้าที่รับผิดชอบในการปฏิบัติตามข้อกำหนด และการรับรองตามกฎระเบียบที่ระบุไว้ใน มาตรฐานความปลอดภัยของยานยนต์ของรัฐบาลกลาง (FMVSS) ฉบับที่ 111 เรื่องทัศนวิสัยด้านหลัง นอกจากนี้ 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 เพื่อแสดงฟีดกล้อง
การแสดงผลของโฆษณา 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 ภายนอก
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>}
ระยะทางที่วัดได้และข้อผิดพลาดของระยะทางของเซ็นเซอร์ในหน่วยมิลลิเมตร หากรองรับเฉพาะช่วง นี่คือระยะทางต่ำสุดในระยะที่ตรวจพบ |