این صفحه تفاوت های بین سیستم دید گسترده (EVS) و Camera2 را مشخص می کند. همچنین نحوه تنظیم اجرای Camera2 خود را توضیح می دهد.
دوربین را باز و بسته کنید
EVS
openCamera
باز کردن دستگاه و پیکربندی یک جریان واحد را ترکیب می کند.
دوربین 2
برای باز و بسته کردن دستگاه با Camera2:
یکی از این حالت ها را انتخاب کنید:
حالت انحصاری، از
CameraManager.openCamera
(جاوا) یاACameraManager_openCamera
در کیت توسعه بومی (NDK) استفاده کنید.حالت اشتراکگذاری شده، از
openSharedCamera
یاACameraManager_openSharedCamera
استفاده کنید. وقتی اشتراکگذاری دوربین را فعال میکنید، پیکربندی جلسه اشتراکگذاری را ارائه دهید.
برای پیکربندی جریانها، یک جلسه ضبط با سطوح خروجی مربوطه ایجاد کنید. برای مثال، از ImageReader یا SurfaceView با
CameraDevice.createCaptureSession()
(جاوا) یاACameraDevice_createCaptureSession()
(NDK).Camera2 از چندین جریان همزمان پشتیبانی می کند. برای اهدافی مانند پیش نمایش، ضبط و پردازش تصویر، جریان های متعدد ایجاد کنید. جریان ها به عنوان خطوط لوله موازی عمل می کنند و به طور متوالی فریم های خام دوربین را پردازش می کنند.
برای بستن یک دستگاه دوربین، از
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، به:
- پخش جریانی را شروع کنید، از
startVideoStream
استفاده کنید. - پخش جریانی را متوقف کنید، از
stopVideoStream
استفاده کنید.
دوربین 2
در Camera2، به:
یک
CaptureRequest
مناسب برای پیش نمایش ایجاد کنید، ازTEMPLATE_PREVIEW
باCameraDevice.createCaptureRequest()
در جاوا یاACameraDevice_createCaptureRequest()
در NDK استفاده کنید.درخواست پخش مداوم را ارسال کنید، از
CameraCaptureSession.setSingleRepeatingRequest
(جاوا) یاACameraCaptureSession_setRepeatingRequestV2
(NDK) استفاده کنید.پخش جریانی را متوقف کنید، از
CameraCaptureSession.stopRepeating
(جاوا) یاACameraCaptureSession_stopRepeating
(NDK) استفاده کنید.
مدیریت بافر
در EVS،
setMaxFramesInFlight
قبلاً تعداد بافر را کنترل میکرد، که به طور بالقوه میتوانست در اواسط جریان تغییر کند. هنگامی که جریان دوربین شروع شد، EVS یک شناسه بافر برای هر فریم تصویر ارائه کرد که با همان آدرس بافر سخت افزاری در حافظه مرتبط بود.در Camera2، حداکثر تعداد تصاویر برای یک
AImageReader
یاImageReader
باAImageReader_new
یاImageReader.newInstance
هنگام شروع یک جلسه تنظیم می شود. پس از شروع جلسه، این را نمی توان به صورت پویا تغییر داد. برای به دست آوردن شناسه بافر برای هر فریم، مشتریان می توانند نقشه ای را حفظ کنند که آدرس بافر سخت افزار را که از شیImage
بدست می آید، با یک شناسه منحصر به فرد مرتبط می کند.
مکث و از سرگیری پخش جریانی
EVS از
pauseVideoStream
وresumeVideoStream
استفاده کرد.Camera2 هیچ معادل مستقیمی ندارد. در عوض، برای:
- مکث کنید، از
stopRepeating
استفاده کنید - رزومه، از
setSingleRepeatingRequest
استفاده کنید
- مکث کنید، از
پارامترهای دوربین
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، این دستورالعملها را توصیه میکنیم:
دوربین دید عقب را به عنوان دوربین سیستم علامت گذاری کنید.
با استفاده از مجوز
CAMERA_HEADLESS_SYSTEM_USER
سرویس یا برنامه ای را اجرا کنید که به عنوانUser 0
به دوربین دسترسی دارد.برنامه را به لیست مجاز حریم خصوصی دوربین اضافه کنید.
نمایش رندر
نمایشگر 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>} بر حسب میلی متر، فاصله اندازه گیری شده و خطای فاصله سنسور. اگر فقط یک محدوده پشتیبانی می شود، این حداقل فاصله در محدوده شناسایی شده است. |