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

این صفحه تفاوت‌های بین سیستم نمای توسعه‌یافته (EVS) و Camera2 را مشخص می‌کند. همچنین نحوه تنظیم پیاده‌سازی Camera2 را شرح می‌دهد.

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

ای وی اس

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

دوربین۲

برای باز و بسته کردن دستگاه با 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
}

ان دی کی

ACameraManager *cameraManager = ACameraManager_create();
ACameraDevice *cameraDevice = nullptr;
camera_status_t status = ACameraManager_openCamera(
    cameraManager, cameraId, &deviceStateCallbacks, &cameraDevice);

داده‌های دوربین را پخش کنید

این بخش نحوه‌ی ارسال داده‌های دوربین را شرح می‌دهد.

ای وی اس

در EVS، به:

  1. برای شروع پخش جریانی، از startVideoStream استفاده کنید.
  2. پخش جریانی را متوقف کنید، از stopVideoStream استفاده کنید.

دوربین۲

در 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

ان دی کی

ACaptureRequest_setEntry_i32(captureRequest, ACAMERA_CONTROL_EFFECT_MODE, 1, &effectMode);

دوربین‌های منطقی

  • EVS: برای دوربین‌های منطقی، مانند Surround View، EVS Manager تمام دوربین‌های فیزیکی مرتبط را باز کرد، جریان‌های ویدیویی را آغاز کرد و مجموعه‌ای منسجم از تصاویر را ارائه داد.

  • Camera2: وقتی به عملکرد مشابهی با Camera2 نیاز باشد، برنامه‌ها باید دوربین‌های منطقی را مدیریت کنند، که این امر مستلزم آن است که:

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

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

مجوزها

این بخش تغییرات در مجوزها را شرح می‌دهد.

ای وی اس

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

دوربین۲

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

  • android.permission.SYSTEM_CAMERA : برای دسترسی به دوربین‌های مخفی از برنامه‌های 3P. همچنین به مجوز CAMERA نیاز دارد. برای کسب اطلاعات بیشتر، به System cameras مراجعه کنید.

  • android.permission.CAMERA_HEADLESS_SYSTEM_USER : اجازه دسترسی از User 0 را می‌دهد، که برای سرویس‌هایی مانند دوربین‌های دید عقب که باید بین سوئیچ‌های کاربر اجرا شوند، بسیار مهم است. به مجوز CAMERA از پیش اعطا شده نیاز دارد.

  • android.permission.CAMERA_PRIVACY_ALLOWLIST : به تولیدکنندگان اصلی تجهیزات (OEM) اجازه می‌دهد تا برخی از برنامه‌های حیاتی از نظر ایمنی را از تاگل حریم خصوصی دوربین که توسط کاربر کنترل می‌شود، مستثنی کنند.

برنامه‌های دوربین با اهمیت ایمنی باید از سیاست‌های پیش از اعطای مجوز داخلی گوگل که در بخش «طراحی برای رانندگی» ارائه شده است، پیروی کنند.

مشتریان اولیه و ثانویه

برای دسترسی مشترک به دوربین:

  • EVS رابط‌های برنامه‌نویسی کاربردی (API) صریحی به نام‌های setPrimaryClient و forcePrimaryClient را برای مدیریت کلاینت اصلی ارائه داد که اختیار تغییر پارامترها را داشت.

  • در Camera2، وقتی دوربین در حالت اشتراکی (اندروید ۱۶ و بالاتر) باز می‌شود، اولویت کلاینتی که به دوربین دسترسی دارد، کلاینت اصلی را تعیین می‌کند. کلاینتی که بالاترین اولویت را دارد (معمولاً برنامه‌ی پیش‌زمینه) می‌تواند پارامترهای درخواست ضبط را تغییر دهد. هیچ API مستقیمی برای اعمال وضعیت اصلی استفاده نمی‌شود. وضعیت اصلی توسط چارچوب مدیریت می‌شود.

دوربین‌های سیستم

برای محدود کردن دسترسی به یک دستگاه دوربین فقط توسط برنامه‌های سیستمی یا تک‌برنامه‌ای، قابلیت ANDROID_REQUEST_AVAILABLE_CAPABILITIES_SYSTEM_CAMERA را در Camera HAL برای آن دستگاه تعریف کنید. کلاینت‌ها باید علاوه بر android.permission.SYSTEM_CAMERA ، android.permission.CAMERA را نیز به این دستگاه دوربین متصل داشته باشند.

دوربین دید عقب

ای وی اس

EVS پیش از این، دسترسی به دوربین را قبل از بوت اندروید فعال کرده بود، که یک رویداد حیاتی برای ویژگی‌هایی مانند دوربین‌های دید عقب است. تولیدکنندگان اصلی تجهیزات خودرو مسئول انطباق و صدور گواهینامه با مقررات ارائه شده در استاندارد ایمنی وسایل نقلیه موتوری فدرال (FMVSS)، شماره 111 دید عقب هستند. علاوه بر این، تولیدکنندگان اصلی تجهیزات خودرو باید سایر مقررات دوربین دید عقب را نیز رعایت کنند.

انطباق با استانداردها به سخت‌افزار، پیاده‌سازی HAL و یکپارچه‌سازی کلی سیستم بستگی دارد. پس از بوت شدن پلتفرم مرجع توسط اندروید، EVS معمولاً چهار تا شش ثانیه زمان نیاز دارد تا عملیاتی شود و دسترسی به دوربین را فراهم کند.

دوربین۲

یک کلاینت ممتاز، که با شناسه AID_AUTOMOTIVE_EVS UID شناسایی می‌شود، می‌تواند از APIهای Camera2 برای دسترسی به دوربین قبل از تکمیل فرآیند بوت اندروید استفاده کند. این دسترسی زودهنگام محدود به دوربین‌های سیستمی در قسمت بیرونی خودرو است. Camera2 برای دسترسی زودهنگام به دوربین، همان KPIهای عملکردی EVS را دارد که معمولاً ظرف چهار تا شش ثانیه پس از بوت اندروید در دسترس قرار می‌گیرد.

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

  1. دوربین دید عقب را به عنوان دوربین سیستمی تعیین کنید تا دسترسی برنامه‌های شخص ثالث محدود شود.

  2. سرویس یا برنامه‌ای را اجرا کنید که به عنوان User 0 به دوربین دسترسی داشته باشد و از مجوز CAMERA_HEADLESS_SYSTEM_USER استفاده کند. این کار، پخش بدون وقفه دوربین را صرف نظر از تغییر کاربر در پیش‌زمینه، تضمین می‌کند.

  3. برنامه را به لیست مجوزهای حریم خصوصی دوربین اضافه کنید تا حتی زمانی که گزینه حریم خصوصی دوربین تحت کنترل کاربر فعال است، به آن دسترسی به دوربین داده شود.

CarEVSManager و CarEVSService

CarEVSManager قبلاً به برنامه‌های جاوا امکان دسترسی به دوربین را می‌داد. انتقال به Camera2 این ویژگی را با standard android.hardware.camera2.CameraManager جایگزین می‌کند.

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

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

رندر نمایش

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

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

دوربین۲

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

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

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

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

ما قصد داریم EVS Mock HAL را منسوخ کنیم. در عوض، تولیدکنندگان اصلی تجهیزات (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

همچنین سیاست‌های مناسب امنیتی پیشرفته لینوکس (SELinux) برای امکان تعامل cameraserver با سرویس شبیه‌سازی شده دوربین HAL مورد نیاز است.

دوربین UVC مدل V4L2 HAL

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

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

ما قصد داریم APIهای EVS Ultrasonics را منسوخ کنیم. در عوض، از این ویژگی‌های VHAL که در اندروید ۱۵ برای تشخیص حسگرهای اولتراسونیک معرفی شده‌اند، استفاده کنیم.

ملک نوع تعریف
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>}

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