ย้ายข้อมูลไปยัง 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 ไม่มีฟีเจอร์ที่เทียบเท่าโดยตรง แต่ให้ทำดังนี้

พารามิเตอร์กล้อง

  • 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

การแสดงผลของโฆษณา 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>}

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