Android 14 QPR1 या इसके बाद के वर्शन पर काम करने वाले डिवाइसों के लिए, Android में डिवाइस को यूएसबी वेबकैम के तौर पर इस्तेमाल करने की सुविधा उपलब्ध है. इस सुविधा के साथ काम करने वाले Android डिवाइसों को यूवीसी डिवाइस के तौर पर दिखाया जाता है. इससे अलग-अलग ऑपरेटिंग सिस्टम (जैसे, Linux, macOS, Windows, और ChromeOS) वाले यूएसबी होस्ट, डिवाइस के कैमरे को वेबकैम के तौर पर इस्तेमाल कर सकते हैं. DeviceAsWebcam सेवा
, डिवाइस को वेबकैम के तौर पर इस्तेमाल करने की इस सुविधा के साथ काम करती है.
DeviceAsWebcam सेवा
AOSP में मौजूद DeviceAsWebcam सेवा में, झलक दिखाने वाली गतिविधि
(DeviceAsWebcamPreview.java) शामिल होती है. इससे उपयोगकर्ता सीन को फ़्रेम कर सकते हैं. झलक दिखाने वाली गतिविधि की मदद से, उपयोगकर्ता ये काम कर सकते हैं:
स्ट्रीमिंग शुरू होने से पहले, देखें कि होस्ट मशीन पर वेबकैम फ़ीड कैसी दिखेगी.
होस्ट को भेजी जाने वाली वेबकैम फ़ीड को इन तरीकों से पसंद के मुताबिक बनाएं:
- स्ट्रीम करने के लिए, सामने या पीछे का कैमरा चुनना.
- स्लाइडर या बटन का इस्तेमाल करके, ज़ूम लेवल चुनना.
- फ़ोकस करने या किसी क्षेत्र पर से फ़ोकस हटाने के लिए, झलक के किसी खास क्षेत्र पर टैप करना.
झलक दिखाने वाली गतिविधि, Android पर सुलभता की सामान्य सुविधाओं के साथ काम करती है. जैसे, TalkBack, Switch Access, और Voice Access.
पहली इमेज. वेबकैम फ़ीड को किसी होस्ट पर स्ट्रीम किया जा रहा है. इसमें झलक दिखाने वाली सुविधा, फ़ीड को कंट्रोल कर रही है.
वास्तुकला
डिवाइस को वेबकैम के तौर पर इस्तेमाल करने की सुविधा के आर्किटेक्चर को दूसरी इमेज में दिखाया गया है. यहां Android फ़्रेमवर्क के बाकी हिस्सों के साथ, DeviceAsWebcam सेवा के इंटरैक्शन फ़्लो के बारे में बताया गया है:
- उपयोगकर्ता, सेटिंग ऐप्लिकेशन में जाकर, यूएसबी वेबकैम का विकल्प चुनता है.
- सेटिंग ऐप्लिकेशन,
UsbManagerक्लास के ज़रिएsystem_serverको बाइंडर कॉल भेजता है. इसमें बताया जाता है किFUNCTION_UVCको चुना गया है. - सिस्टम सर्वर ये काम करता है:
setUsbFunctionsHAL इंटरफ़ेस कॉल के ज़रिए, यूवीसी गैजेट फ़ंक्शन को वापस पाने के लिए, यूएसबी गैजेट HAL को सूचना देता है.- ConfigFs का इस्तेमाल करके, यूवीसी गैजेट ड्राइवर को कॉन्फ़िगर करने के लिए, यूएसबी गैजेट HAL को सूचना देता है.
- गैजेट HAL से कॉलबैक मिलने पर,
system_server, फ़्रेमवर्क को ब्रॉडकास्ट भेजता है. इसेDeviceAsWebcamसेवा से पिक किया जाता है. - होस्ट से
/dev/video*पर V4L2 नोड के ज़रिए कॉन्फ़िगरेशन कमांड मिलने पर, यूएसबी गैजेट ड्राइवर, वेबकैम स्ट्रीम शुरू करता है.
दूसरी इमेज. DeviceAsWebcam का आर्किटेक्चर.
लागू करना
इस सेक्शन में, Android डिवाइस को वेबकैम के तौर पर इस्तेमाल करने की सुविधा को लागू करने का तरीका बताया गया है.
कर्नेल की सहायता
Android 14 या इसके बाद के वर्शन के लिए, जेनेरिक कर्नेल इमेज (जीकेआई), यूवीसी गैजेट ड्राइवर को डिफ़ॉल्ट रूप से चालू करती है. ज़्यादा जानकारी के लिए, AOSP पैच देखें.
गैजेट HAL में यूवीसी की सुविधा लागू करना
Android 14 से, यूवीसी फ़ंक्शन को
GadgetFunction.aidl HAL इंटरफ़ेस में शामिल किया गया है. गैजेट HAL के लिए, यूवीसी गैजेट को ConfigFS में उसी तरह माउंट किया जाता है जिस तरह MTP या ADB जैसे अन्य ConfigFS फ़ंक्शन को माउंट किया जाता है.
गैजेट HAL को लागू करने के लिए, यूवीसी फ़ंक्शन को ConfigFS में माउंट करने के लिए बदलाव करें. यहां गैजेट HAL को लागू करने का एक स्निपेट दिया गया है. इसमें यूवीसी फ़ंक्शन की सुविधा शामिल है:
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, वीआईडी/पीआईडी के सही कॉम्बिनेशन दिखा रहा हो.
यूवीसी से जुड़ी सभी लॉजिक, वेंडर init या DeviceAsWebcam सेवा में होती है. इसलिए, गैजेट HAL में यूवीसी से जुड़ी किसी लॉजिक की ज़रूरत नहीं होती. हालांकि, यूवीसी फ़ंक्शन को ConfigFS से सिमलिंग करने की ज़रूरत होती है.
लागू करने के बारे में ज़्यादा जानने के लिए, AOSP में दिया गया सैंपल कोड देखें:
यूवीसी कॉन्फ़िगरेशन के साथ 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 एफ़पीएस पर 1080 पिक्सेल MJPEG स्ट्रीम दिखाने के लिए सेट अप किया गया है. जब यूएसबी होस्ट, काम करने वाले रिज़ॉल्यूशन और फ़्रेम रेट के बारे में क्वेरी करता है, तो उसे ये सुविधाएं बताई जाती हैं.
वेबकैम के कॉन्फ़िगरेशन चुनने के लिए, सामान्य दिशा-निर्देश यहां दिए गए हैं:
DeviceAsWebcamसेवा, MJPEG और अनकंप्रेस्ड YUYV, इन दो स्ट्रीम फ़ॉर्मैट के साथ काम करती है.- यूएसबी 2.0, 480 एमबीपीएस (60 एमबीपीएस) की रफ़्तार से डेटा ट्रांसफ़र करने की सुविधा देता है. इसका मतलब है कि 30 एफ़पीएस पर, हर फ़्रेम का साइज़ ज़्यादा से ज़्यादा 2 एमबी होना चाहिए. वहीं, 60 एफ़पीएस पर, हर फ़्रेम का साइज़ ज़्यादा से ज़्यादा 1 एमबी होना चाहिए.
- अनकंप्रेस्ड स्ट्रीम (YUYV): 30 एफ़पीएस पर, ज़्यादा से ज़्यादा 720 पिक्सेल का फ़्रेम साइज़ इस्तेमाल किया जा सकता है, क्योंकि YUYV, हर पिक्सेल के लिए दो बाइट का इस्तेमाल करता है.
- कंप्रेस्ड MJPEG स्ट्रीम: YUV से 1:10 के कंप्रेशन रेशियो के हिसाब से, यूएसबी 2.0, 4K (हर फ़्रेम के लिए 1.18 एमबी) के साथ काम कर सकता है.
- सामने और पीछे के प्राइमरी कैमरा डिवाइसों में, दिखाए जाने वाले सभी फ़्रेम साइज़ के साथ काम करने की सुविधा होनी चाहिए. ऐसा इसलिए, क्योंकि उपयोगकर्ता, झलक दिखाने वाले यूज़र इंटरफ़ेस (यूआई) का इस्तेमाल करके, कैमरा आईडी के बीच स्विच कर सकता है. हमारा सुझाव है कि वेंडर, MJPEG स्ट्रीम के लिए 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
इस सिस्टम प्रॉपर्टी को चालू करने पर, सेटिंग ऐप्लिकेशन में, यूएसबी की सेटिंग में वेबकैम का विकल्प दिखता है. जैसा कि तीसरी इमेज में दिखाया गया है. यह विकल्प चुनने पर, Android डिवाइस, होस्ट डिवाइस के लिए यूएसबी वेबकैम के तौर पर दिखता है.
तीसरी इमेज. सेटिंग ऐप्लिकेशन में, यूएसबी की सेटिंग.
इस कमांड का इस्तेमाल करके, डिवाइस को ADB के ज़रिए यूएसबी वेबकैम फ़ंक्शन पर भी सेट किया जा सकता है:
adb shell svc usb setFunctions uvcपावर और थर्मल से जुड़ी समस्याओं पर ध्यान देना
वेबकैम के तौर पर इस्तेमाल करने का मतलब है कि डिवाइस का कैमरा, एक दिन में कई घंटों तक चालू रह सकता है. इसलिए, हमारा सुझाव है कि आप ऐसे तरीके अपनाएं जिनसे डिवाइस की पावर खपत और थर्मल, तय सीमा के अंदर रहे. पावर खपत को तय सीमा के अंदर रखने के लिए, ये समाधान अपनाएं:
DeviceAsWebcamसेवा में,STREAM_USE_CASE_VIDEO_CALLको चालू करें. इससे कैमरा HAL की पावर परफ़ॉर्मेंस बेहतर होगी.अगर
STREAM_USE_CASE_VIDEO_CALLको चालू करने के बाद भी पावर से जुड़ी समस्या बनी रहती है, तोDeviceAsWebcamसेवा, फ़िज़िकल स्ट्रीम का इस्तेमाल करके, पावर खपत को और कम करने का विकल्प देती है. यह बताने के लिए कि किस फ़िज़िकल कैमरे का इस्तेमाल करना है, रनटाइम रिसॉर्स ओवरले (आरआरओ) का इस्तेमाल किया जा सकता है. फ़िज़िकल स्ट्रीम की वजह से, वीडियो की क्वालिटी काफ़ी कम हो जाती है और यूएक्स में गड़बड़ी हो सकती है. इसलिए, इस समाधान का इस्तेमाल सिर्फ़ तब करें, जब कोई और विकल्प न हो. पावर से जुड़ी समस्याओं के लिए,STREAM_USE_CASE_VIDEO_CALLको ऑप्टिमाइज़ करना सबसे अच्छा समाधान है.DeviceAsWebcamसेवा के साथ काम करने वाले आरआरओ के बारे में ज़्यादा जानने के लिए, readme.md देखें.यहां आरआरओ को सेट अप करने का एक उदाहरण दिया गया है. इसमें लॉजिकल कैमरा आईडी 0 के बजाय, फ़िज़िकल कैमरा आईडी 3 का इस्तेमाल किया गया है. AOSP में उदाहरण के लिए, DeviceAsWebcamRaven देखें.
// For logical camera id 0 - use physical camera id 3 {"0": {"3" : "UW"}}
पुष्टि
अपने डिवाइस पर DeviceAsWebcam सेवा को लागू करने की जांच करने के लिए, ये टेस्ट करें:
- CTS verifier test webcam: यह जांच करें कि डिवाइस, फ़ॉर्मैट, साइज़, और फ़्रेम रेट के साथ काम करता है या नहीं.
- मैन्युअल टेस्ट: यह जांच करें कि वेबकैम की सुविधा, अलग-अलग होस्ट ऑपरेटिंग सिस्टम पर, अलग-अलग होस्ट ऐप्लिकेशन के साथ काम करती है या नहीं.
पहले से मालूम समस्याएं
DeviceAsWebcam सेवा से जुड़ी पहले से मालूम समस्याएं यहां दी गई हैं:
कभी-कभी, यूवीसी गैजेट ड्राइवर की स्ट्रीम फ़्लिकर करती है और ऐसा दिखता है कि फ़्रेम खराब हो गए हैं. इस समस्या को ठीक कर दिया गया है. साथ ही, इसे अपस्ट्रीम और जीकेआई में मर्ज कर दिया गया है.
वेबकैम मोड में मौजूद Android डिवाइस, macOS होस्ट पर यूएसबी 3.0 या इसके बाद के वर्शन वाले केबल के साथ काम नहीं करते. ऐसा Apple के यूवीसी ड्राइवर में मौजूद गड़बड़ी की वजह से होता है.