به Camera2 مهاجرت کنید

این صفحه تفاوت های بین سیستم دید گسترده (EVS) و Camera2 را مشخص می کند. همچنین نحوه تنظیم اجرای Camera2 خود را توضیح می دهد.

دوربین را باز و بسته کنید

EVS

openCamera باز کردن دستگاه و پیکربندی یک جریان واحد را ترکیب می کند.

دوربین 2

برای باز و بسته کردن دستگاه با Camera2:

  1. یکی از این حالت ها را انتخاب کنید:

  2. برای پیکربندی جریان‌ها، یک جلسه ضبط با سطوح خروجی مربوطه ایجاد کنید. برای مثال، از ImageReader یا SurfaceView با CameraDevice.createCaptureSession() (جاوا) یا ACameraDevice_createCaptureSession() (NDK).

    Camera2 از چندین جریان همزمان پشتیبانی می کند. برای اهدافی مانند پیش نمایش، ضبط و پردازش تصویر، جریان های متعدد ایجاد کنید. جریان ها به عنوان خطوط لوله موازی عمل می کنند و به طور متوالی فریم های خام دوربین را پردازش می کنند.

  3. برای بستن یک دستگاه دوربین، از CameraDevice.close() (جاوا) یا ACameraDevice_close() (NDK) استفاده کنید.

این قطعه کد نمونه را در نظر بگیرید:

جاوا

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 استفاده کنید.

دوربین 2

در Camera2، به:

  1. یک CaptureRequest مناسب برای پیش نمایش ایجاد کنید، از TEMPLATE_PREVIEW با CameraDevice.createCaptureRequest() در جاوا یا ACameraDevice_createCaptureRequest() در NDK استفاده کنید.

  2. درخواست پخش مداوم را ارسال کنید، از CameraCaptureSession.setSingleRepeatingRequest (جاوا) یا ACameraCaptureSession_setRepeatingRequestV2 (NDK) استفاده کنید.

  3. پخش جریانی را متوقف کنید، از CameraCaptureSession.stopRepeating (جاوا) یا ACameraCaptureSession_stopRepeating (NDK) استفاده کنید.

مدیریت بافر

  • در EVS، setMaxFramesInFlight قبلاً تعداد بافر را کنترل می‌کرد، که به طور بالقوه می‌توانست در اواسط جریان تغییر کند. هنگامی که جریان دوربین شروع شد، EVS یک شناسه بافر برای هر فریم تصویر ارائه کرد که با همان آدرس بافر سخت افزاری در حافظه مرتبط بود.

  • در Camera2، حداکثر تعداد تصاویر برای یک AImageReader یا ImageReader با AImageReader_new یا ImageReader.newInstance هنگام شروع یک جلسه تنظیم می شود. پس از شروع جلسه، این را نمی توان به صورت پویا تغییر داد. برای به دست آوردن شناسه بافر برای هر فریم، مشتریان می توانند نقشه ای را حفظ کنند که آدرس بافر سخت افزار را که از شی Image بدست می آید، با یک شناسه منحصر به فرد مرتبط می کند.

مکث و از سرگیری پخش جریانی

  • EVS از pauseVideoStream و resumeVideoStream استفاده کرد.

  • Camera2 هیچ معادل مستقیمی ندارد. در عوض، برای:

پارامترهای دوربین

  • EVS از روش هایی مانند setIntParameter برای تغییر پارامتر درخواست عکسبرداری دوربین استفاده می کند.

  • در Camera2، برای تغییر پارامترها، API تنظیم شده برای سازنده CaptureRequest را فراخوانی کرده و سپس آن را ارسال کنید.

این نمونه کد را در نظر بگیرید:

جاوا

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 برای همگام سازی در سطح سخت افزار انجام می شود.

ما یک کتابخانه سازگاری (لایه شیم) برای مشتریان EVS موجود ارائه خواهیم کرد تا انتقال را تسهیل کنیم. هدف این است که از API های Camera2 با حداقل تغییرات در کد پشتیبانی شود.

مجوزها

EVS

دسترسی به شناسه های منحصر به فرد ممتاز (UID) محدود شده است. به عنوان مثال، AID_AUTOMOTIVE_EVS . مجوزهای منسوخ شده عبارتند از android.car.permission.USE_CAR_EVS_CAMERA .

دوربین 2

Camera2 به android.permission.CAMERA نیاز دارد. برای موارد خاص:

  • android.permission.SYSTEM_CAMERA : برای دسترسی به دوربین های پنهان شده از برنامه های 3P. همچنین به مجوز 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 را در دوربین HAL آن دستگاه اعلام کنید. مشتریان باید android.permission.SYSTEM_CAMERA را علاوه بر android.permission.CAMERA که به این دستگاه دوربین متصل می شود، داشته باشند.

CarEVSManager و CarEVSSservice

برای دسترسی به API، برنامه‌های جاوا باید از android.hardware.camera2.CameraManager استاندارد به جای CarEVSManager استفاده کنند.

برای دوربین دید عقب، منطق CarEVSService که ویژگی GEAR_SELECTION VHAL را نظارت می‌کند و یک فعالیت را راه‌اندازی می‌کند باید به یک برنامه متعلق به OEM منتقل شود. این برنامه:

  • ویژگی GEAR_SELECTION VHAL را نظارت می کند.
  • هنگامی که دنده عقب درگیر است، فعالیت دوربین دید عقب را راه اندازی می کند.
  • از Camera2 API برای نمایش فید دوربین استفاده می کند.

برای نمایش ثابت و بدون مانع از دوربین دید عقب، به ویژه در هنگام انتقال کاربر یا زمانی که برنامه‌های دیگر می‌توانند پیش‌نمایش را مبهم کنند، هنگام اجرای عملکرد دوربین دید عقب با Camera2، این دستورالعمل‌ها را توصیه می‌کنیم:

نمایش رندر

نمایشگر EVS و خدمات نمایش خودرو.

اینها منسوخ شده اند.

دوربین 2

از روش‌های استاندارد رندر اندروید با Surface، android.hardware.display.DisplayManager و android.view.Display استفاده کنید.

برای سناریوهایی که نیاز به نمایش اولیه دوربین دارند، Camera2 ImageReader می‌تواند دسترسی مستقیم به بافر سخت‌افزاری را فراهم کند تا بتوانید آن را با پیاده‌سازی‌های نمایشگر مبتنی بر DRM موجود برای رندر ادغام کنید.

این دسترسی اولیه به دوربین منحصراً برای مشتریان ممتازی که دارای AID_AUTOMOTIVE_EVS_UID هستند مجاز است و محدود به دوربین‌های سیستمی است که در قسمت بیرونی خودرو قرار دارند.

شبیه ساز HAL (EVS mock HAL)

ما قصد داریم 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

خط‌مشی‌های امنیتی تقویت‌شده لینوکس (SELinux) نیز لازم است تا cameraserver بتواند با سرویس HAL دوربین شبیه‌سازی شده تعامل داشته باشد.

دوربین UVC V4L2 HAL

ما قصد داریم EVS V4L2 HAL را منسوخ کنیم. از پشتیبانی دوربین خارجی Camera2 برای دوربین های USB (UVC) استفاده کنید. برای کسب اطلاعات بیشتر، دوربین‌های USB خارجی را ببینید.

دسترسی اولیه به دوربین

دسترسی به دوربین EVS به مشتریان ممتاز با UID AID_AUTOMOTIVE_EVS محدود شد. برای دسترسی به دوربین قبل از تکمیل فرآیند بوت Android، به شرط اینکه UID AID_AUTOMOTIVE_EVS باقی بماند. با این حال، دسترسی اولیه به دوربین محدود به دوربین‌های سیستمی است که در قسمت بیرونی خودرو قرار دارند.

API های اولتراسونیک

ما قصد داریم APIهای EVS Ultrasonics را منسوخ کنیم. در عوض، از این ویژگی های VHAL معرفی شده در اندروید 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>}

بر حسب میلی متر، فاصله اندازه گیری شده و خطای فاصله سنسور. اگر فقط یک محدوده پشتیبانی می شود، این حداقل فاصله در محدوده شناسایی شده است.