این صفحه تفاوتهای بین سیستم نمای توسعهیافته (EVS) و Camera2 را مشخص میکند. همچنین نحوه تنظیم پیادهسازی Camera2 را شرح میدهد.
باز و بسته کردن دوربین
ای وی اس
openCamera
باز کردن دستگاه و پیکربندی یک جریان واحد را با هم ترکیب میکند.
دوربین۲
برای باز و بسته کردن دستگاه با 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
}
ان دی کی
ACameraManager *cameraManager = ACameraManager_create();
ACameraDevice *cameraDevice = nullptr;
camera_status_t status = ACameraManager_openCamera(
cameraManager, cameraId, &deviceStateCallbacks, &cameraDevice);
دادههای دوربین را پخش کنید
این بخش نحوهی ارسال دادههای دوربین را شرح میدهد.
ای وی اس
در EVS، به:
- برای شروع پخش جریانی، از
startVideoStream
استفاده کنید. - پخش جریانی را متوقف کنید، از
stopVideoStream
استفاده کنید.
دوربین۲
در 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
ان دی کی
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، این دستورالعملها را توصیه میکنیم:
دوربین دید عقب را به عنوان دوربین سیستمی تعیین کنید تا دسترسی برنامههای شخص ثالث محدود شود.
سرویس یا برنامهای را اجرا کنید که به عنوان
User 0
به دوربین دسترسی داشته باشد و از مجوز CAMERA_HEADLESS_SYSTEM_USER استفاده کند. این کار، پخش بدون وقفه دوربین را صرف نظر از تغییر کاربر در پیشزمینه، تضمین میکند.برنامه را به لیست مجوزهای حریم خصوصی دوربین اضافه کنید تا حتی زمانی که گزینه حریم خصوصی دوربین تحت کنترل کاربر فعال است، به آن دسترسی به دوربین داده شود.
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>} بر حسب میلیمتر، فاصله اندازهگیری شده توسط سنسور و خطای فاصله. اگر فقط یک محدوده پشتیبانی شود، این حداقل فاصله در محدوده شناسایی شده است. |