ย้ายข้อมูลไปยัง 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 เพื่อจัดการไคลเอ็นต์หลักซึ่งมี สิทธิ์ในการแก้ไขพารามิเตอร์

  • เมื่อเปิดกล้องในโหมดที่ใช้ร่วมกัน (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

  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 เพื่อแสดงฟีดกล้อง

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

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