Android 14-QPR1 या इसके बाद के वर्शन पर काम करने वाले डिवाइसों के लिए, Android में डिवाइस को यूएसबी वेबकैम के तौर पर इस्तेमाल करने की सुविधा उपलब्ध है. इस सुविधा के साथ काम करने वाले Android डिवाइसों को यूवीसी डिवाइस के तौर पर दिखाया जाता है. इससे अलग-अलग ऑपरेटिंग सिस्टम (जैसे, Linux, macOS, Windows, और ChromeOS) वाले कई यूएसबी होस्ट, डिवाइस के कैमरे को वेबकैम के तौर पर इस्तेमाल कर सकते हैं. DeviceAsWebcam
सेवा, डिवाइस को वेबकैम के तौर पर इस्तेमाल करने की सुविधा देती है.
DeviceAsWebcam सेवा
AOSP में मौजूद DeviceAsWebcam
सेवा में, झलक दिखाने वाली गतिविधि (DeviceAsWebcamPreview.java
) शामिल होती है. इसकी मदद से, उपयोगकर्ता सीन को फ़्रेम कर सकते हैं. झलक देखने की सुविधा से, उपयोगकर्ता ये काम कर सकता है:
स्ट्रीमिंग शुरू होने से पहले, होस्ट मशीन पर वेबकैम फ़ीड की झलक देखें.
होस्ट को भेजे जाने वाले वेबकैम फ़ीड को इन तरीकों से पसंद के मुताबिक बनाएं:
- स्ट्रीम करने के लिए, फ़्रंट या बैक कैमरा चुनना.
- स्लाइडर या बटन का इस्तेमाल करके, ज़ूम लेवल चुनना.
- किसी क्षेत्र पर फ़ोकस करने या फ़ोकस हटाने के लिए, झलक के किसी हिस्से पर टैप करना.
प्रीव्यू की सुविधा, Android पर उपलब्ध सामान्य ऐक्सेसिबिलिटी सुविधाओं के साथ काम करती है. जैसे, TalkBack, ऐक्सेस करने का तरीका बदलें, और बोलकर फ़ोन इस्तेमाल करने की सुविधा.
पहली इमेज. वेबकैम फ़ीड को किसी होस्ट को स्ट्रीम किया जा रहा है. होस्ट के पास फ़ीड को कंट्रोल करने के लिए झलक देखने की सुविधा है.
भवन निर्माण
किसी डिवाइस को वेबकैम के तौर पर इस्तेमाल करने के लिए, आर्किटेक्चर को इमेज 2 में दिखाया गया है. यहां बताया गया है कि DeviceAsWebcam
सेवा, Android फ़्रेमवर्क के बाकी हिस्सों के साथ कैसे इंटरैक्ट करती है:
- इस इमेज में दिखाया गया है कि उपयोगकर्ता, सेटिंग ऐप्लिकेशन में यूएसबी वेबकैम का विकल्प चुनता है.
- सेटिंग ऐप्लिकेशन,
system_server
कोUsbManager
क्लास के ज़रिए बाइंडर कॉल भेजता है. इससेsystem_server
को यह सूचना मिलती है किFUNCTION_UVC
को चुना गया है. - सिस्टम सर्वर ये काम करता है:
- यह
setUsbFunctions
एचएएल इंटरफ़ेस कॉल के ज़रिए, USB गैजेट एचएएल को UVC गैजेट फ़ंक्शन को वापस पाने के लिए सूचना देता है. - यह यूएसबी गैजेट एचएएल को, ConfigFs का इस्तेमाल करके UVC गैजेट ड्राइवर को कॉन्फ़िगर करने के बारे में सूचना देता है.
- यह
- गैजेट HAL से कॉलबैक मिलने पर,
system_server
फ़्रेमवर्क को एक ब्रॉडकास्ट भेजता है, ताकिDeviceAsWebcam
सेवा उसे पिक अप कर सके. - यूएसबी गैजेट ड्राइवर,
/dev/video*
पर V4L2 नोड के ज़रिए होस्ट से कॉन्फ़िगरेशन कमांड मिलने पर, वेबकैम स्ट्रीम शुरू करता है.
दूसरी इमेज. DeviceAsWebcam का आर्किटेक्चर.
लागू करना
इस सेक्शन में, Android डिवाइस को वेबकैम के तौर पर इस्तेमाल करने की सुविधा के बारे में बताया गया है.
कर्नेल सपोर्ट
Android 14 या इसके बाद के वर्शन के लिए, जेनरिक कर्नेल इमेज (जीकेआई), यूवीसी गैजेट ड्राइवर को डिफ़ॉल्ट रूप से चालू करती है. ज़्यादा जानकारी के लिए, AOSP पैच देखें.
गैजेट एचएएल में यूवीसी की सुविधा काम करती है
Android 14 से, यूवीसी फ़ंक्शन को GadgetFunction.aidl
एचएएल इंटरफ़ेस में शामिल किया गया है. गैजेट एचएएल के लिए, यूवीसी गैजेट को ConfigFS में उसी तरह से माउंट किया जाता है जिस तरह से MTP या ADB जैसे अन्य ConfigFS फ़ंक्शन को माउंट किया जाता है.
गैजेट एचएएल को लागू करने के लिए, UVC फ़ंक्शन को ConfigFS में माउंट करने के लिए बदलाव करें. यहां गैजेट एचएएल को लागू करने का एक उदाहरण दिया गया है. यह यूवीसी फ़ंक्शन के साथ काम करता है:
UsbGadget::setCurrentUsbFunctions(long functions) {
...
// Existing functions
if ((functions & GadgetFunction::MTP) != 0) {
...
linkFunction("ffs.mtp"); // Mount to ConfigFS
...
}
...
// UVC function follows the same pattern!
if ((functions & GadgetFunction::UVC) != 0) {
...
linkFunction("uvc.0"); // Mount to ConfigFS
...
}
...
}
जब डिवाइस को वेबकैम के तौर पर इस्तेमाल किया जा रहा हो, तब पक्का करें कि यूएसबी गैजेट HAL, सही VID/PID कॉम्बिनेशन का विज्ञापन दिखा रहा हो.
यूवीसी से जुड़ा पूरा लॉजिक, वेंडर के init या DeviceAsWebcam
service में होता है. इसलिए, गैजेट एचएएल में यूवीसी से जुड़ा कोई लॉजिक ज़रूरी नहीं होता. हालांकि, UVC फ़ंक्शन को ConfigFS से सिंबल लिंक करने के लिए, गैजेट एचएएल में लॉजिक की ज़रूरत होती है.
इसे लागू करने के बारे में ज़्यादा जानने के लिए, AOSP में मौजूद इस सैंपल कोड को देखें:
UVC कॉन्फ़िगरेशन के साथ ConfigFS सेट अप करना
यूवीसी गैजेट ड्राइवर को यह बताने के लिए कि Android वेबकैम किन फ़ॉर्मैट, साइज़, और फ़्रेम रेट के साथ काम करता है, यूवीसी कॉन्फ़िगरेशन के साथ ConfigFS सेट अप करें. ज़्यादा जानकारी के लिए, ConfigFS UVC गैजेट ABI के बारे में Linux का अपस्ट्रीम दस्तावेज़ देखें.
यहां एक उदाहरण दिया गया है, जिसमें बताया गया है कि वेंडर init, यूवीसी गैजेट ड्राइवर को कैसे सेट अप कर सकता है (AOSP में कोड स्निपेट):
# uvc function
mkdir /configfs_path/functions/uvc.0
write /configfs_path/functions/uvc.0/function_name "Android Webcam"
write /configfs_path/functions/uvc.0/streaming_maxpacket 3072
# setup control params
mkdir /configfs_path/functions/uvc.0/control/header/h
symlink /configfs_path/functions/uvc.0/control/header/h \
/configfs_path/functions/uvc.0/control/class/fs/h
symlink /configfs_path/functions/uvc.0/control/header/h \
/configfs_path/functions/uvc.0/control/class/ss/h
# advertise 1080p resolution for webcam encoded as mjpeg
mkdir /configfs_path/functions/uvc.0/streaming/mjpeg/m/1080p
write /configfs_path/functions/uvc.0/streaming/mjpeg/m/1080p/wHeight 1080
write /configfs_path/functions/uvc.0/streaming/mjpeg/m/1080p/wWidth 1920
write /configfs_path/functions/uvc.0/streaming/mjpeg/m/1080p/dwMaxVideoFrameBufferSize 4147200
# advertise 30 fps support for 1080p.
write /configfs_path/functions/uvc.0/streaming/mjpeg/m/1080p/dwDefaultFrameInterval 333333
write /configfs_path/functions/uvc.0/streaming/mjpeg/m/1080p/dwFrameInterval "333333"
# setup streaming params
mkdir /configfs_path/functions/uvc.0/streaming/header/h
symlink /configfs_path/functions/uvc.0/streaming/mjpeg/m \
/configfs_path/functions/uvc.0/streaming/header/h/m
symlink /configfs_path/functions/uvc.0/streaming/header/h \
/configfs_path/functions/uvc.0/streaming/class/fs/h
symlink /configfs_path/functions/uvc.0/streaming/header/h \
/configfs_path/functions/uvc.0/streaming/class/hs/h
symlink /configfs_path/functions/uvc.0/streaming/header/h \
/config/usb_gadget/g1/functions/uvc.0/streaming/class/ss/h
# ...
यह स्निपेट, 30 फ़्रेम प्रति सेकंड (एफ़पीएस) पर 1080p MJPEG स्ट्रीम का विज्ञापन दिखाने के लिए, यूवीसी गैजेट ड्राइवर सेट अप करता है. जब यूएसबी होस्ट, काम करने वाले रिज़ॉल्यूशन और फ़्रेम रेट के बारे में क्वेरी करता है, तब इन सुविधाओं के बारे में उसे बताया जाता है.
वेबकैम के विज्ञापन दिखाने के लिए कॉन्फ़िगरेशन चुनने से जुड़े सामान्य दिशा-निर्देश यहां दिए गए हैं:
DeviceAsWebcam
सेवा के साथ काम करने वाले दो स्ट्रीम फ़ॉर्मैट, MJPEG और अनकंप्रेस किया गया YUYV हैं.- यूएसबी 2.0, 480 एमबीपीएस (60 एमबीपीएस) की रफ़्तार से डेटा ट्रांसफ़र करने की सुविधा देता है. इसका मतलब है कि 30 एफ़पीएस पर, हर फ़्रेम का साइज़ ज़्यादा से ज़्यादा 2 एमबी होना चाहिए. वहीं, 60 एफ़पीएस पर, हर फ़्रेम का साइज़ ज़्यादा से ज़्यादा 1 एमबी होना चाहिए.
- बिना कंप्रेस की गई स्ट्रीम (YUYV): 30 फ़्रेम प्रति सेकंड पर, ज़्यादा से ज़्यादा 720 पिक्सल के फ़्रेम साइज़ का इस्तेमाल किया जा सकता है. ऐसा इसलिए, क्योंकि YUYV में हर पिक्सल के लिए 2 बाइट होते हैं.
- कंप्रेस की गई MJPEG स्ट्रीम: मान लें कि YUV से कंप्रेस करने का अनुपात 1:10 है. ऐसे में, USB 2.0, 4K (हर फ़्रेम के लिए 1.18 एमबी) को सपोर्ट कर सकता है.
- प्राइमरी फ्रंट और बैक कैमरे वाले डिवाइसों में, विज्ञापन में बताए गए सभी फ़्रेम साइज़ काम करने चाहिए. ऐसा इसलिए होता है, क्योंकि उपयोगकर्ता, झलक दिखाने वाले यूज़र इंटरफ़ेस (यूआई) का इस्तेमाल करके, कैमरा आईडी के बीच स्विच कर सकता है. एमजेपीईजी स्ट्रीम के लिए, हमारा सुझाव है कि वेंडर 480 पिक्सल (640 x 480), 720 पिक्सल (1280 x 820), और 1080 पिक्सल (1920 x 1080) फ़्रेम साइज़ के विज्ञापन दिखाएं. ऐसा इसलिए, क्योंकि होस्ट ऐप्लिकेशन आम तौर पर इन साइज़ का इस्तेमाल करते हैं.
- सामने और पीछे के मुख्य कैमरे वाले डिवाइसों में, विज्ञापन में बताए गए सभी फ़्रेम रेट काम करने चाहिए. हमारा सुझाव है कि वेंडर, 30 फ़्रेम प्रति सेकंड (एफ़पीएस) की सुविधा दें.
वेबकैम स्ट्रीम कॉन्फ़िगरेशन (ConfigFS) जोड़ने के उदाहरण के लिए, AOSP का सैंपल पैच देखें.
बिल्ड में वेबकैम चालू करना
DeviceAsWebcam
सेवा चालू करने के लिए, आपको device.mk
फ़ाइल में ro.usb.uvc.enabled
सिस्टम प्रॉपर्टी को true
पर सेट करना होगा.
# Enable UVC support
PRODUCT_VENDOR_PROPERTIES += \
ro.usb.uvc.enabled=true
इस सिस्टम प्रॉपर्टी के चालू होने पर, वेबकैम का विकल्प, USB की सेटिंग में जाकर सेटिंग ऐप्लिकेशन में दिखता है. इसे तीसरे फ़िगर में दिखाया गया है. इस विकल्प को चुनने पर, Android डिवाइस, होस्ट डिवाइस को यूएसबी वेबकैम के तौर पर दिखता है.
तीसरी इमेज. सेटिंग ऐप्लिकेशन में यूएसबी प्राथमिकताएं.
इस कमांड का इस्तेमाल करके, डिवाइस को यूएसबी वेबकैम फ़ंक्शन पर भी सेट किया जा सकता है:
adb shell svc usb setFunctions uvc
पावर और तापमान से जुड़ी समस्याओं को ध्यान में रखना
वेबकैम का इस्तेमाल करने का मतलब है कि डिवाइस का कैमरा एक दिन में कई घंटों तक चालू रह सकता है. इसलिए, हमारा सुझाव है कि आप ऐसे तरीके अपनाएं जिनसे यह पक्का किया जा सके कि डिवाइस की बैटरी की खपत और तापमान, तय सीमा के अंदर रहे. बिजली की खपत को तय सीमा में रखने के लिए, यहां दिए गए सुझावों का पालन करें:
- कैमरा एचएएल की बेहतर पावर परफ़ॉर्मेंस के लिए,
STREAM_USE_CASE_VIDEO_CALL
सेवा मेंSTREAM_USE_CASE_VIDEO_CALL
चालू करें.DeviceAsWebcam
अगर
STREAM_USE_CASE_VIDEO_CALL
की सुविधा चालू होने के बाद भी, बिजली की खपत कम नहीं हो रही है, तोDeviceAsWebcam
सेवा में फ़िज़िकल स्ट्रीम का इस्तेमाल करके, बिजली की खपत को और कम करने का विकल्प मिलता है. कौनसा फ़िज़िकल कैमरा इस्तेमाल करना है, यह तय करने के लिए रनटाइम रिसॉर्स ओवरले (आरआरओ) का इस्तेमाल किया जा सकता है. फ़िज़िकल स्ट्रीम से वीडियो की क्वालिटी काफ़ी कम हो जाती है और इससे यूज़र एक्सपीरियंस (यूएक्स) खराब होता है. इसलिए, इस समाधान का इस्तेमाल सिर्फ़ आखिरी विकल्प के तौर पर करें.STREAM_USE_CASE_VIDEO_CALL
को ऑप्टिमाइज़ करना, बैटरी से जुड़ी समस्याओं का सबसे अच्छा समाधान है.DeviceAsWebcam
सेवा के साथ काम करने वाले RRO के बारे में ज़्यादा जानने के लिए, readme.md देखें.यहां एक ऐसे RRO का उदाहरण दिया गया है जिसे लॉजिकल कैमरा आईडी 0 के बजाय फ़िज़िकल कैमरा आईडी 3 का इस्तेमाल करने के लिए सेट अप किया गया है. AOSP में उदाहरण के लिए, DeviceAsWebcamRaven देखें.
// For logical camera id 0 - use physical camera id 3 {"0": {&qu
ot;3" : "UW"}}
पुष्टि
अपने डिवाइस पर DeviceAsWebcam
सेवा को लागू करने की जांच करने के लिए, यहां दिए गए टेस्ट का इस्तेमाल करें:
- CTS verifier test वेबकैम: यह टेस्ट करता है कि डिवाइस पर फ़ॉर्मैट, साइज़, और फ़्रेम रेट काम करते हैं या नहीं.
- मैन्युअल टेस्ट: यह टेस्ट करें कि वेबकैम की सुविधा, अलग-अलग होस्ट ऐप्लिकेशन के साथ काम करती है या नहीं. साथ ही, यह भी देखें कि यह सुविधा अलग-अलग होस्ट ऑपरेटिंग सिस्टम पर काम करती है या नहीं.
पहले से मालूम समस्याएं
DeviceAsWebcam
सेवा से जुड़ी ये समस्याएं आम तौर पर होती हैं:
कभी-कभी यूवीसी गैजेट ड्राइवर की स्ट्रीम फ़्लिकर करती है और ऐसे फ़्रेम दिखाती है जो खराब दिखते हैं. इस समस्या को ठीक कर दिया गया है. साथ ही, इसे अपस्ट्रीम और GKI में मर्ज कर दिया गया है.
वेबकैम मोड में मौजूद Android डिवाइस, macOS होस्ट पर USB 3.0+ केबल के साथ काम नहीं करते हैं. इसकी वजह, Apple के यूवीसी ड्राइवर में मौजूद एक बग है.