ย้ายข้อมูลไปยัง Camera2

หน้านี้ระบุความแตกต่างระหว่างระบบมุมมองขยาย (EVS) กับ Camera2 และอธิบายวิธีตั้งค่าการใช้งาน Camera2

เปิดและปิดกล้อง

EVS

openCamera จะรวมการเปิดอุปกรณ์และการกำหนดค่าสตรีมเดียวเข้าด้วยกัน

Camera2

วิธีเปิดและปิดอุปกรณ์ด้วย Camera2

  1. เลือกโหมดใดโหมดหนึ่งต่อไปนี้

  2. หากต้องการกำหนดค่าสตรีม ให้สร้างเซสชันการจับภาพด้วยพื้นผิวเอาต์พุตที่เกี่ยวข้อง เช่น จาก ImageReader หรือ SurfaceView ด้วย CameraDevice.createCaptureSession() (Java) หรือ ACameraDevice_createCaptureSession() (NDK)

    Camera2 รองรับสตรีมหลายรายการพร้อมกัน สร้างสตรีมหลายรายการเพื่อวัตถุประสงค์ต่างๆ เช่น การแสดงตัวอย่าง การบันทึก และการประมวลผลรูปภาพ สตรีมทำหน้าที่เป็นไปป์ไลน์แบบขนาน ซึ่งจะประมวลผลเฟรมดิบจากกล้องตามลำดับ

  3. หากต้องการปิดอุปกรณ์กล้อง ให้ใช้ 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 ให้ทำดังนี้

  1. หากต้องการเริ่มสตรีม ให้ใช้ startVideoStream
  2. หากต้องการหยุดสตรีม ให้ใช้ stopVideoStream

Camera2

ใน Camera2 ให้ทำดังนี้

  1. หากต้องการสร้าง CaptureRequest ที่เหมาะสำหรับการแสดงตัวอย่าง ให้ใช้ TEMPLATE_PREVIEW กับ CameraDevice.createCaptureRequest() ใน Java หรือ ACameraDevice_createCaptureRequest() ใน NDK

  2. หากต้องการส่งคำขอสตรีมต่อเนื่อง ให้ใช้ CameraCaptureSession.setSingleRepeatingRequest (Java) หรือ ACameraCaptureSession_setRepeatingRequestV2 (NDK)

  3. หากต้องการหยุดสตรีม ให้ใช้ 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 เครื่องมือสร้าง แล้วส่ง

ลองดูตัวอย่างโค้ดต่อไปนี้

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

  1. กำหนดให้กล้องมองหลังเป็นกล้องระบบเพื่อจำกัด การเข้าถึงของแอปของบุคคลที่สาม

  2. เรียกใช้บริการหรือแอปที่เข้าถึงกล้องในฐานะ User 0 เพื่อใช้สิทธิ์ CAMERA_HEADLESS_SYSTEM_USER ซึ่งจะช่วยให้มั่นใจได้ว่าการสตรีมจากกล้องจะไม่หยุดชะงัก ไม่ว่าผู้ใช้เบื้องหน้าจะเปลี่ยนไปใช้คนอื่นหรือไม่ก็ตาม

  3. เพิ่มแอปในรายการที่อนุญาตพิเศษสำหรับความเป็นส่วนตัวของกล้อง เพื่อให้สิทธิ์เข้าถึงกล้อง แม้ว่าจะเปิดใช้การเปิด/ปิดความเป็นส่วนตัวของกล้องที่ผู้ใช้ควบคุมอยู่ก็ตาม

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>}

ในหน่วยมิลลิเมตร ระยะทางที่วัดได้และข้อผิดพลาดของระยะทางของเซ็นเซอร์ หาก รองรับเฉพาะช่วง ค่านี้จะเป็นระยะทางต่ำสุดในระยะที่ตรวจพบ