Apache License, वर्शन 2.0 ("लाइसेंस") के तहत लाइसेंस दिया गया है; इस फ़ाइल का इस्तेमाल, लाइसेंस से जुड़े दस्तावेज़ों में बताए गए नियमों के अलावा किसी और तरीके से नहीं किया जा सकता. लाइसेंस की कॉपी यहां से पाई जा सकती है
http://www.apache.org/licenses/LICENSE-2.0
लागू होने वाले कानून के तहत ज़रूरी होने या लिखित रूप में सहमति दिए जाने के अलावा, लाइसेंस के तहत डिस्ट्रिब्यूट किया गया सॉफ़्टवेयर "जैसा है वैसा" के आधार पर डिस्ट्रिब्यूट किया जाता है. इसमें किसी भी तरह की वारंटी या शर्तें शामिल नहीं होती हैं. लाइसेंस के तहत दी गई अनुमतियों और पाबंदियों की जानकारी पाने के लिए, लाइसेंस देखें. -->
Android प्लैटफ़ॉर्म पर, प्लग-एंड-प्ले यूएसबी कैमरों (यानी कि वेबकैम) का इस्तेमाल किया जा सकता है. इसके लिए, स्टैंडर्ड Android Camera2 API और कैमरा HAL इंटरफ़ेस का इस्तेमाल किया जाता है. वेबकैम आम तौर पर यूएसबी वीडियो क्लास (यूवीसी) ड्राइवर के साथ काम करते हैं. Linux पर, यूवीसी कैमरों को कंट्रोल करने के लिए स्टैंडर्ड Video4Linux (V4L) ड्राइवर का इस्तेमाल किया जाता है.
वेबकैम की सुविधा के साथ, डिवाइसों का इस्तेमाल वीडियो चैट और फ़ोटो कियॉस्क जैसे कामों के लिए किया जा सकता है. यह सुविधा, Android फ़ोन में मौजूद सामान्य इंटरनल कैमरा HAL की जगह नहीं लेती है. साथ ही, इसे परफ़ॉर्मेंस पर असर डालने वाले मुश्किल कामों के लिए डिज़ाइन नहीं किया गया है. जैसे, ज़्यादा रिज़ॉल्यूशन और तेज़ स्पीड वाली स्ट्रीमिंग, एआर, और आईएसडी/सेंसर/लेंस को मैन्युअल तरीके से कंट्रोल करना.
यूएसबी कैमरा एचएएल प्रोसेस, बाहरी कैमरा उपलब्ध कराने वाली कंपनी का हिस्सा है. यह यूएसबी डिवाइस की उपलब्धता के बारे में सुनता है और उसके हिसाब से बाहरी कैमरा डिवाइसों की गिनती करता है. इस प्रोसेस के पास, कैमरे के HAL की प्रोसेस की तरह ही अनुमतियां और SE नीति होती है. तीसरे पक्ष के वेबकैम ऐप्लिकेशन, यूएसबी डिवाइसों से सीधे तौर पर कम्यूनिकेट करते हैं. इसलिए, यूवीसी डिवाइसों को ऐक्सेस करने के लिए, उन्हें कैमरे की वही अनुमतियां चाहिए जो किसी सामान्य कैमरा ऐप्लिकेशन को चाहिए होती हैं.
उदाहरण और सोर्स
यूएसबी कैमरे लागू करने के तरीके के बारे में ज़्यादा जानने के लिए, बाहरी कैमरे की सुविधा देने वाली कंपनी के रेफ़रंस के तौर पर लागू किए गए ExternalCameraProvider
पर जाएं.
बाहरी कैमरे वाले डिवाइस और सेशन के लागू होने की जानकारी, ExternalCameraDevice
और ExternalCameraDeviceSession
में शामिल की जाती है.
एपीआई लेवल 28 से, Java क्लाइंट एपीआई में EXTERNAL
हार्डवेयर लेवल शामिल है.
लागू करना
लागू करने के लिए, android.hardware.usb.host
सिस्टम की सुविधा काम करनी चाहिए.
यूवीसी डिवाइसों के लिए, कर्नल सपोर्ट भी चालू होना चाहिए. इसे चालू करने के लिए, आपको संबंधित कर्नल defconfig
फ़ाइलों में यह कोड जोड़ना होगा.
+CONFIG_USB_VIDEO_CLASS=y
+CONFIG_MEDIA_USB_SUPPORT=y
डिवाइस के बिल्ड में बाहरी कैमरा उपलब्ध कराने वाली सुविधा चालू करने के लिए, यह तरीका अपनाएं. इससे ज़रूरी SELinux अनुमतियां, बाहरी कैमरे का कॉन्फ़िगरेशन, और बाहरी कैमरा उपलब्ध कराने वाली सुविधा की निर्भरता जुड़ जाती है:
बाहरी कैमरे की कॉन्फ़िगरेशन फ़ाइल और बाहरी कैमरे की लाइब्रेरी को
device.mk
में जोड़ें.+PRODUCT_PACKAGES += android.hardware.camera.provider-V1-external-service +PRODUCT_COPY_FILES += \ +device/manufacturerX/productY/external_camera_config.xml:$(TARGET_COPY_OUT_VENDOR)/etc/external_camera_config.xml
डिवाइस के Treble HAL मेनिफ़ेस्ट में, बाहरी कैमरा सेवा देने वाली कंपनी का नाम जोड़ें.
<hal format="aidl"> <name>android.hardware.camera.provider</name> <version>1</version> <interface> <name>ICameraProvider</name> <instance>internal/0</instance> + <instance>external/0</instance> </interface> </hal>
(ज़रूरी नहीं) अगर डिवाइस Treble passthrough मोड में चलता है, तो
sepolicy
को अपडेट करें, ताकिcameraserver
यूवीसी कैमरे को ऐक्सेस कर सके.+# for external camera +allow cameraserver device:dir r_dir_perms; +allow cameraserver video_device:dir r_dir_perms; +allow cameraserver video_device:chr_file rw_file_perms;
यहां external_camera_config.xml
का एक उदाहरण दिया गया है. इसमें कॉपीराइट की लाइनों को शामिल नहीं किया गया है.
<ExternalCamera> <Provider> <ignore> <!-- Internal video devices to be ignored by external camera HAL --> <id>0</id> <!-- No leading/trailing spaces --> <id>1</id> </ignore> </Provider> <!-- See ExternalCameraUtils.cpp for default values of Device configurations below --> <Device> <!-- Max JPEG buffer size in bytes--> <MaxJpegBufferSize bytes="3145728"/> <!-- 3MB (~= 1080p YUV420) --> <!-- Size of v4l2 buffer queue when streaming >= 30fps --> <!-- Larger value: more request can be cached pipeline (less janky) --> <!-- Smaller value: use less memory --> <NumVideoBuffers count="4"/> <!-- Size of v4l2 buffer queue when streaming < 30fps --> <NumStillBuffers count="2"/> <!-- List of maximum fps for various output sizes --> <!-- Any image size smaller than the size listed in Limit row will report fps (as minimum frame duration) up to the fpsBound value. --> <FpsList> <!-- width/height must be increasing, fpsBound must be decreasing--> <Limit width="640" height="480" fpsBound="30.0"/> <Limit width="1280" height="720" fpsBound="15.0"/> <Limit width="1920" height="1080" fpsBound="10.0"/> <!-- image size larger than the last entry will not be supported--> </FpsList> </Device> </ExternalCamera>
पसंद के मुताबिक बनाएं
Android कैमरे को बेहतर बनाने के लिए, सामान्य तौर पर उपलब्ध बदलाव करने के विकल्पों का इस्तेमाल किया जा सकता है. इसके अलावा, डिवाइस के हिसाब से ऑप्टिमाइज़ेशन भी किया जा सकता है.
सामान्य कस्टमाइज़ेशन
external_camera_config.xml
फ़ाइल में बदलाव करके, बाहरी कैमरा सेवा देने वाली कंपनी को अपनी पसंद के मुताबिक बनाया जा सकता है. खास तौर पर, क्लाइंट इन पैरामीटर को अपनी पसंद के मुताबिक बना सकते हैं:
- घर के अंदर लगे कैमरों के वीडियो नोड को छोड़कर
- इमेज का इस्तेमाल करने के लिए, साइज़ और फ़्रेम रेट की ऊपरी सीमा
- फ़्लाइट के दौरान बफ़र की संख्या (जंक बनाम मेमोरी ट्रेडऑफ़)
इन पैरामीटर के अलावा, अपने पैरामीटर जोड़े जा सकते हैं या अपने कॉन्फ़िगरेशन बनाए जा सकते हैं.
डिवाइस के हिसाब से ऑप्टिमाइज़ेशन
डिवाइस के हिसाब से ऑप्टिमाइज़ेशन जोड़कर भी परफ़ॉर्मेंस को बेहतर बनाया जा सकता है.
बफ़र कॉपी/स्केलिंग और JPEG डिकोड/एन्कोड
सामान्य तौर पर लागू करने के लिए, सीपीयू (libyuv/libjpeg) का इस्तेमाल किया जाता है. हालांकि, इसे डिवाइस के हिसाब से ऑप्टिमाइज़ किए गए फ़ंक्शन से बदला जा सकता है.
एचएएल आउटपुट फ़ॉर्मैट
सामान्य तौर पर लागू होने वाले फ़ंक्शन, यहां दिए गए आउटपुट फ़ॉर्मैट का इस्तेमाल करते हैं:
YUV_420_888
वीडियोIMPLEMENTATION_DEFINED
बफ़र करने के लिए- अन्य सभी
IMPLEMENTATION_DEFINED
बफ़र के लिएYUV12
परफ़ॉर्मेंस को बेहतर बनाने के लिए, आउटपुट फ़ॉर्मैट को डिवाइस के हिसाब से बेहतर फ़ॉर्मैट से बदला जा सकता है. अपनी पसंद के मुताबिक लागू करने के लिए, अन्य फ़ॉर्मैट भी इस्तेमाल किए जा सकते हैं
Validation
बाहरी कैमरे की सुविधा देने वाले डिवाइसों को कैमरे के लिए सीटीएस पास करना होगा. टेस्ट रन के दौरान, बाहरी यूएसबी वेबकैम को डिवाइस से प्लग इन करके रखना होगा. ऐसा न करने पर, कुछ टेस्ट केस पूरे नहीं हो पाएंगे.