इस पेज पर, एक्सटेंडेड व्यू सिस्टम (ईवीएस) और Camera2 के बीच के अंतर के बारे में बताया गया है. इसमें Camera2 API को लागू करने का तरीका भी बताया गया है.
कैमरा ऐप्लिकेशन को खोलना और बंद करना
ईवीएस
openCamera
में, डिवाइस को खोलने और एक स्ट्रीम को कॉन्फ़िगर करने की सुविधा मिलती है.
Camera2
Camera2 की सुविधा वाले डिवाइस को खोलने और बंद करने के लिए:
इनमें से कोई एक मोड चुनें:
एक्सक्लूसिव मोड के लिए, नेटिव डेवलपमेंट किट (NDK) पर
CameraManager.openCamera
(Java) याACameraManager_openCamera
का इस्तेमाल करें.शेयर किए गए मोड में,
openSharedCamera
याACameraManager_openSharedCamera
का इस्तेमाल करें. कैमरा शेयर करने की सुविधा चालू करने पर, शेयर किए गए सेशन का कॉन्फ़िगरेशन दें.
स्ट्रीम कॉन्फ़िगर करने के लिए, काम के आउटपुट सर्फ़ेस के साथ एक कैप्चर सेशन बनाएं. उदाहरण के लिए,
CameraDevice.createCaptureSession()
(Java) याACameraDevice_createCaptureSession()
(NDK) के साथ ImageReader या SurfaceView से.Camera2, एक साथ कई स्ट्रीम को सपोर्ट करता है. झलक देखने, रिकॉर्ड करने, और इमेज प्रोसेसिंग जैसे कामों के लिए, एक से ज़्यादा स्ट्रीम बनाएं. स्ट्रीम, पैरलल पाइपलाइन के तौर पर काम करती हैं. ये कैमरे से मिले रॉ फ़्रेम को क्रम से प्रोसेस करती हैं.
कैमरा डिवाइस को बंद करने के लिए,
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
}
एनडीके
ACameraManager *cameraManager = ACameraManager_create();
ACameraDevice *cameraDevice = nullptr;
camera_status_t status = ACameraManager_openCamera(
cameraManager, cameraId, &deviceStateCallbacks, &cameraDevice);
कैमरे का डेटा स्ट्रीम करना
इस सेक्शन में, कैमरे के डेटा को स्ट्रीम करने का तरीका बताया गया है.
ईवीएस
ईवीएस पर, ये काम करने के लिए:
- स्ट्रीमिंग शुरू करने के लिए,
startVideoStream
का इस्तेमाल करें. - स्ट्रीमिंग बंद करें और
stopVideoStream
का इस्तेमाल करें.
Camera2
Camera2 पर, इन कामों के लिए:
झलक देखने के लिए,
CaptureRequest
बनाएं. Java मेंCameraDevice.createCaptureRequest()
के साथTEMPLATE_PREVIEW
का इस्तेमाल करें या NDK परACameraDevice_createCaptureRequest()
का इस्तेमाल करें.लगातार स्ट्रीमिंग के लिए अनुरोध सबमिट करें. इसके लिए,
CameraCaptureSession.setSingleRepeatingRequest
(Java) याACameraCaptureSession_setRepeatingRequestV2
(NDK) का इस्तेमाल करें.स्ट्रीमिंग बंद करें. इसके लिए,
CameraCaptureSession.stopRepeating
(Java) याACameraCaptureSession_stopRepeating
(NDK) का इस्तेमाल करें.
बफ़र मैनेजमेंट
ईवीएस में,
setMaxFramesInFlight
पहले बफ़र की संख्या को कंट्रोल करता था. हालांकि, स्ट्रीम के बीच में इसे बदला जा सकता था. कैमरा स्ट्रीमिंग शुरू होने पर, ईवीएस ने हर इमेज फ़्रेम के लिए एक बफ़र आईडी दिया. यह आईडी, मेमोरी में मौजूद एक ही हार्डवेयर बफ़र पते से जुड़ा था.Camera2 पर, सेशन शुरू होने पर
AImageReader
याImageReader
के लिए, ज़्यादा से ज़्यादा इमेज की संख्याAImageReader_new
याImageReader.newInstance
के साथ सेट की जाती है. सेशन शुरू होने के बाद, इसे डाइनैमिक तरीके से नहीं बदला जा सकता. हर फ़्रेम के लिए बफ़र आईडी पाने के लिए, क्लाइंट एक ऐसा मैप बनाए रख सकते हैं जोImage
ऑब्जेक्ट से मिले हार्डवेयर बफ़र के पते को यूनीक आइडेंटिफ़ायर से जोड़ता है.
स्ट्रीमिंग को रोकना और फिर से शुरू करना
ईवीएस में
pauseVideoStream
औरresumeVideoStream
का इस्तेमाल किया गया.Camera2 के लिए, कोई भी सीधे तौर पर काम करने वाला विकल्प उपलब्ध नहीं है. इसके बजाय, इनके लिए:
- रोकें,
stopRepeating
का इस्तेमाल करें - फिर से शुरू करने के लिए,
setSingleRepeatingRequest
का इस्तेमाल करें
- रोकें,
कैमरे के पैरामीटर
ईवीएस, कैमरा कैप्चर करने के अनुरोध के पैरामीटर को बदलने के लिए
setIntParameter
जैसे तरीकों का इस्तेमाल करता है.Camera2 पर, पैरामीटर में बदलाव करने के लिए,
CaptureRequest
बिल्डर के लिए set एपीआई को कॉल करें. इसके बाद, इसे सबमिट करें.
कोड के इन सैंपल पर ध्यान दें:
Java
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);
लॉजिकल कैमरे
ईवीएस: लॉजिकल कैमरों, जैसे कि सराउंड व्यू के लिए, ईवीएस मैनेजर ने सभी संबंधित फ़िज़िकल कैमरे खोले, वीडियो स्ट्रीम शुरू कीं, और इमेज का एक साथ दिखने वाला व्यू उपलब्ध कराया.
Camera2: जब Camera2 के साथ मिलती-जुलती सुविधा की ज़रूरत हो, तो ऐप्लिकेशन को लॉजिकल कैमरों को मैनेज करना होगा. इसके लिए, आपको ये काम करने होंगे:
- लॉजिकल कैमरे से जुड़े फ़िज़िकल सब-कैमरों की पहचान करें.
- हर ज़रूरी फ़िज़िकल कैमरा खोलें.
- हर कैमरे पर स्ट्रीम शुरू करें.
- अगर ज़रूरी हो, तो फ़्रेम सिंक करें. आम तौर पर, हार्डवेयर-लेवल पर सिंक करने के लिए, इसे एचएएल पर मैनेज किया जाता है.
हम मौजूदा EVS क्लाइंट को एक कंपैटिबिलिटी लाइब्रेरी (शिम लेयर) उपलब्ध कराएंगे, ताकि वे आसानी से ट्रांज़िशन कर सकें. इसका मकसद, कोड में कम से कम बदलाव करके Camera2 API को सपोर्ट करना है.
अनुमतियां
ईवीएस
ऐक्सेस सिर्फ़ खास यूनीक आइडेंटिफ़ायर (यूआईडी) के लिए उपलब्ध है. उदाहरण के लिए,
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
: इससे ओईएम को, सुरक्षा के लिहाज़ से ज़रूरी कुछ ऐप्लिकेशन को, उपयोगकर्ता के कंट्रोल वाले कैमरा प्राइवसी टॉगल से छूट देने की अनुमति मिलती है.
सुरक्षा के लिए ज़रूरी कैमरा ऐप्लिकेशन को, Google की पहले से मौजूद उन नीतियों का पालन करना होगा जो ड्राइविंग के लिए डिज़ाइन किया गया ऐप्लिकेशन में दी गई हैं.
प्राइमरी और सेकंडरी क्लाइंट
कैमरे का ऐक्सेस शेयर करने के लिए:
ईवीएस ने मुख्य क्लाइंट को मैनेज करने के लिए,
setPrimaryClient
औरforcePrimaryClient
जैसे एपीआई उपलब्ध कराए थे. मुख्य क्लाइंट के पास पैरामीटर में बदलाव करने का अधिकार था.कैमरा शेयर किए गए मोड में खोलने पर, Camera2 (Android 16 और इसके बाद के वर्शन) में, कैमरा ऐक्सेस करने वाले क्लाइंट की प्राथमिकता के आधार पर प्राइमरी क्लाइंट तय होता है. सबसे ज़्यादा प्राथमिकता वाला क्लाइंट (आम तौर पर, फ़ोरग्राउंड ऐप्लिकेशन), कैप्चर करने के अनुरोध के पैरामीटर में बदलाव कर सकता है. प्राइमरी स्टेटस को लागू करने के लिए, किसी भी डायरेक्ट एपीआई का इस्तेमाल नहीं किया जाता. फ़्रेमवर्क, प्राइमरी स्टेटस को मैनेज करता है.
सिस्टम कैमरे
अगर आपको किसी कैमरा डिवाइस को सिस्टम या 1P ऐप्लिकेशन सिर्फ़ ऐक्सेस करने की अनुमति देनी है, तो उस डिवाइस के लिए Camera HAL में ANDROID_REQUEST_AVAILABLE_CAPABILITIES_SYSTEM_CAMERA
क्षमता का एलान करें. क्लाइंट के पास इस कैमरा डिवाइस से कनेक्ट करने के लिए, android.permission.CAMERA
के साथ-साथ android.permission.SYSTEM_CAMERA
भी होना चाहिए.
CarEVSManager और CarEVSService
एपीआई ऐक्सेस करने के लिए, Java ऐप्लिकेशन को CarEVSManager
के बजाय स्टैंडर्ड android.hardware.camera2.CameraManager
का इस्तेमाल करना चाहिए.
रियर व्यू कैमरे के लिए, CarEVSService
में मौजूद लॉजिक को OEM के मालिकाना हक वाले ऐप्लिकेशन में माइग्रेट करना ज़रूरी है. यह लॉजिक, GEAR_SELECTION
VHAL प्रॉपर्टी को मॉनिटर करता है और गतिविधि लॉन्च करता है. इस ऐप्लिकेशन में ये सुविधाएं होनी चाहिए:
- यह
GEAR_SELECTION
वीएचएएल प्रॉपर्टी की निगरानी करता है. - यह रिवर्स गियर चालू होने पर, पीछे के कैमरे का व्यू दिखाने वाली सुविधा को लॉन्च करता है.
- कैमरा फ़ीड दिखाने के लिए, Camera2 API का इस्तेमाल करता है.
रियर व्यू कैमरे को लगातार और बिना किसी रुकावट के दिखाने के लिए, खास तौर पर उपयोगकर्ता के ट्रांज़िशन के दौरान या जब अन्य ऐप्लिकेशन, झलक को धुंधला कर सकते हैं, तो हम Camera2 के साथ रियर व्यू कैमरे की सुविधा लागू करते समय इन दिशा-निर्देशों का पालन करने का सुझाव देते हैं:
रियर व्यू कैमरे को सिस्टम कैमरा के तौर पर मार्क करें.
कैमरे को ऐक्सेस करने वाली सेवा या ऐप्लिकेशन को
User 0
CAMERA_HEADLESS_SYSTEM_USER
अनुमति का इस्तेमाल करके चलाएं.ऐप्लिकेशन को कैमरा ऐक्सेस करने की अनुमति वाली सूची में जोड़ें.
डिसप्ले रेंडरिंग
ईवीएस डिसप्ले और वाहन के डिसप्ले की सेवा.
ये अब काम नहीं करते हैं.
Camera2
Surface, android.hardware.display.DisplayManager
, और android.view.Display
के साथ Android के स्टैंडर्ड रेंडरिंग तरीकों का इस्तेमाल करें.
ऐसे मामलों में जहां कैमरे का डिसप्ले जल्दी चाहिए होता है वहां Camera2 ImageReader, हार्डवेयर बफ़र का सीधा ऐक्सेस दे सकता है. इससे, रेंडरिंग के लिए इसे DRM पर आधारित मौजूदा डिसप्ले के साथ इंटिग्रेट किया जा सकता है.
कैमरे का यह शुरुआती ऐक्सेस, सिर्फ़ उन खास क्लाइंट को दिया जाता है जिनके पास AID_AUTOMOTIVE_EVS_UID
है. साथ ही, यह सिर्फ़ उन सिस्टम कैमरों के लिए उपलब्ध है जो किसी वाहन के बाहरी हिस्से पर लगे होते हैं.
एम्युलेटर एचएएल (ईवीएस मॉक एचएएल)
हम EVS Mock 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
cameraserver
को Emulated Camera HAL सेवा के साथ इंटरैक्ट करने की अनुमति देने के लिए, सुरक्षा को बेहतर बनाने वाली Linux (SELinux) की सही नीतियां भी ज़रूरी हैं.
V4L2 यूवीसी कैमरा एचएएल
हम EVS V4L2 HAL को बंद करने वाले हैं. यूएसबी कैमरों (यूवीसी) के लिए, Camera2 के एक्सटर्नल कैमरे की सुविधा का इस्तेमाल करें. ज़्यादा जानने के लिए, बाहरी यूएसबी कैमरे देखें.
कैमरे का ऐक्सेस
ईवीएस कैमरे का ऐक्सेस, सिर्फ़ उन खास क्लाइंट के पास था जिनके पास AID_AUTOMOTIVE_EVS
यूआईडी था. Android बूट प्रोसेस पूरी होने से पहले कैमरे का ऐक्सेस पाने के लिए, यह ज़रूरी है कि यूआईडी AID_AUTOMOTIVE_EVS
रहे. हालांकि, कैमरे का ऐक्सेस सिर्फ़ उन सिस्टम कैमरों को मिलता है जो वाहन के बाहर लगे होते हैं.
अल्ट्रासोनिक एपीआई
हम EVS Ultrasonics API को बंद करने वाले हैं. इसके बजाय, Android 15 में अल्ट्रासोनिक सेंसर का पता लगाने के लिए, 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>}
सेंसर से मापी गई दूरी और दूरी में हुई गड़बड़ी, मिलीमीटर में. अगर सिर्फ़ एक रेंज काम करती है, तो यह पता लगाई गई रेंज में कम से कम दूरी होती है. |