Android 14-QPR1 या इसके बाद के वर्शन वाले डिवाइसों के लिए, Android पर डिवाइस को यूएसबी वेबकैम के तौर पर इस्तेमाल करने की सुविधा उपलब्ध है. इस सुविधा के साथ काम करने वाले Android डिवाइसों को, यूवीसी डिवाइस के तौर पर दिखाया जाता है. इसकी मदद से, अलग-अलग ऑपरेटिंग सिस्टम (उदाहरण के लिए, Linux, macOS, Windows, और ChromeOS) वाले कई तरह के यूएसबी होस्ट, डिवाइस के कैमरे को वेबकैम के तौर पर इस्तेमाल कर सकते हैं. DeviceAsWebcam
सेवा, डिवाइस को वेबकैम के तौर पर इस्तेमाल करने के लिए, इस सुविधा के साथ काम करती है.
DeviceAsWebcam सेवा
AOSP में DeviceAsWebcam
सेवा में झलक वाली गतिविधि (DeviceAsWebcamPreview.java
) शामिल होती है. इसकी मदद से, उपयोगकर्ता सीन को फ़्रेम कर सकते हैं. झलक गतिविधि से उपयोगकर्ता ये काम कर सकते हैं:
स्ट्रीमिंग शुरू होने से पहले, देखें कि वेबकैम फ़ीड, होस्ट मशीन पर कैसा दिखेगा.
होस्ट को भेजे गए वेबकैम फ़ीड को इन तरीकों से पसंद के मुताबिक बनाएं:
- स्ट्रीम करने के लिए, सामने या पीछे वाला कैमरा चुनना.
- स्लाइडर या बटन का इस्तेमाल करके, ज़ूम लेवल चुनना.
- किसी हिस्से पर फ़ोकस करने या फ़ोकस हटाने के लिए, झलक में उस हिस्से पर टैप करना.
झलक देखने की सुविधा, Android पर सुलभता से जुड़ी सामान्य सुविधाओं के साथ काम करती है. जैसे, TalkBack, Switch Access, और बोलकर फ़ोन इस्तेमाल करने की सुविधा.
पहली इमेज. वेबकैम फ़ीड को होस्ट को स्ट्रीम किया जा रहा है. फ़ीड को कंट्रोल करने के लिए, झलक का इस्तेमाल किया जा रहा है.
भवन निर्माण
डिवाइस को वेबकैम के तौर पर इस्तेमाल करने का तरीका दूसरी इमेज में दिखाया गया है. यहां Android फ़्रेमवर्क के बाकी हिस्सों के साथ, DeviceAsWebcam
सेवा के इंटरैक्शन फ़्लो के बारे में बताया गया है:
- उपयोगकर्ता, Settings ऐप्लिकेशन में यूएसबी वेबकैम का विकल्प चुनता है.
- सेटिंग ऐप्लिकेशन,
UsbManager
क्लास के ज़रिएsystem_server
को एक बाइंडर कॉल भेजता है. इससेFUNCTION_UVC
को चुने जाने की जानकारी मिलती है. - सिस्टम सर्वर ये काम करता है:
setUsbFunctions
HAL इंटरफ़ेस कॉल के ज़रिए, यूएसबी गैजेट HAL को UVC गैजेट फ़ंक्शन को वापस पाने के लिए सूचना देता है.- यूएसबी गैजेट एचएएल को बताता है कि वह ConfigFs का इस्तेमाल करके, यूवीसी गैजेट ड्राइवर को कॉन्फ़िगर करे.
- गैजेट HAL से कॉलबैक मिलने के बाद,
system_server
फ़्रेमवर्क पर एक ब्रॉडकास्ट भेजता है, ताकिDeviceAsWebcam
सेवा उसे पिक अप कर सके. - यूएसबी गैजेट ड्राइवर,
/dev/video*
पर V4L2 नोड के ज़रिए होस्ट से कॉन्फ़िगरेशन कमांड मिलने पर, वेबकैम स्ट्रीम शुरू करता है.
दूसरी इमेज. DeviceAsWebcam आर्किटेक्चर.
लागू करना
इस सेक्शन में बताया गया है कि Android डिवाइस को वेबकैम के तौर पर कैसे इस्तेमाल किया जा सकता है.
कर्नेल से जुड़ी सहायता
Android 14 या उसके बाद वाले वर्शन के लिए, जेनरिक कर्नेल इमेज (जीकेआई) यूवीसी गैजेट ड्राइवर को डिफ़ॉल्ट रूप से चालू करता है. एओएसपी पैच में जानकारी देखें.
Gadget HAL में यूवीसी की सुविधा
Android 14 से, UVC फ़ंक्शन को GadgetFunction.aidl
एचएएल इंटरफ़ेस में शामिल किया गया है. Gadget HAL के लिए, UVC डिवाइस को ConfigFS में उसी तरह से माउंट किया जाता है जिस तरह ConfigFS के अन्य फ़ंक्शन, जैसे कि MTP या ADB को माउंट किया जाता है.
Gadget HAL लागू करने के लिए, UVC फ़ंक्शन को ConfigFS पर माउंट करने के लिए बदलाव करें. यहां UVC फ़ंक्शन के साथ काम करने वाले Gadget 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
...
}
...
}
जब डिवाइस वेबकैम के तौर पर काम कर रहा हो, तो पक्का करें कि यूएसबी गैजेट एचएएल, सही VID/PID कॉम्बिनेशन का विज्ञापन कर रहा हो.
सभी यूवीसी लॉजिक, वेंडर इनिट या DeviceAsWebcam
सेवा में होते हैं. इसलिए, गैजेट एचएएल में यूवीसी फ़ंक्शन को ConfigFS से लिंक करने के अलावा, किसी भी यूवीसी खास लॉजिक की ज़रूरत नहीं होती.
लागू करने के बारे में ज़्यादा जानकारी के लिए, AOSP में दिया गया यह सैंपल कोड देखें:
UVC कॉन्फ़िगरेशन के साथ ConfigFS सेट अप करना
यूवीसी गैजेट ड्राइवर को यह बताने के लिए कि Android वेबकैम की मदद से कौनसे फ़ॉर्मैट, साइज़, और फ़्रेम रेट काम करते हैं, यूवीसी कॉन्फ़िगरेशन के साथ ConfigFS सेट करें. ज़्यादा जानकारी के लिए, ConfigFS यूवीसी गैजेट एबीआई पर अपस्ट्रीम Linux दस्तावेज़ देखें.
यहां दिए गए उदाहरण में बताया गया है कि वेंडर init, यूवीसी गैजेट ड्राइवर को कैसे सेट अप कर सकता है (एओएसपी में कोड स्निपेट):
# 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
# ...
यह स्निपेट, UVC गैजेट ड्राइवर को सेट अप करता है, ताकि 30 fps पर 1080p MJPEG स्ट्रीम का विज्ञापन दिखाया जा सके. जब यूएसबी होस्ट, इस्तेमाल किए जा सकने वाले रिज़ॉल्यूशन और फ़्रेम रेट के बारे में क्वेरी करता है, तब इन क्षमताओं की जानकारी, यूएसबी होस्ट को दी जाती है.
वेबकैम के विज्ञापन में दिखाए गए कॉन्फ़िगरेशन चुनने के लिए, यहां सामान्य दिशा-निर्देश दिए गए हैं:
DeviceAsWebcam
सेवा के साथ काम करने वाले दो स्ट्रीम फ़ॉर्मैट हैं, MJPEG और अनकंप्रेस की गई YUYV.- USB 2.0 की मदद से, 480 एमबीपीएस (60 एमबीपीएस) की रफ़्तार से डेटा ट्रांसफ़र किया जा सकता है. इसका मतलब है कि 30 एफ़पीएस पर, हर फ़्रेम का साइज़ ज़्यादा से ज़्यादा 2 एमबी होना चाहिए. साथ ही, 60 एफ़पीएस पर, हर फ़्रेम का साइज़ ज़्यादा से ज़्यादा 1 एमबी होना चाहिए.
- बिना कंप्रेस की गई स्ट्रीम (YUYV): 30 एफ़पीएस पर, ज़्यादा से ज़्यादा 720 पिक्सल का फ़्रेम साइज़ इस्तेमाल किया जा सकता है, क्योंकि YUYV में हर पिक्सल के लिए दो बाइट होते हैं.
- कंप्रेस की गई 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
इस सिस्टम प्रॉपर्टी के चालू होने पर, वेबकैम विकल्प, सेटिंग ऐप्लिकेशन में यूएसबी सेटिंग में दिखता है. यह विकल्प, तीसरे चित्र में दिखाया गया है. यह विकल्प चुनने पर, Android डिवाइस, होस्ट डिवाइस के लिए यूएसबी वेबकैम के तौर पर दिखता है.
तीसरी इमेज. सेटिंग ऐप्लिकेशन में यूएसबी की सेटिंग.
इस कमांड का इस्तेमाल करके, ADB की मदद से डिवाइस को यूएसबी वेबकैम फ़ंक्शन पर भी सेट किया जा सकता है:
adb shell svc usb setFunctions uvc
पावर और थर्मल से जुड़ी समस्याओं पर विचार करना
वेबकैम के इस्तेमाल का मतलब है कि डिवाइस का कैमरा दिन में कई घंटे चालू रह सकता है. इसलिए, हमारा सुझाव है कि आप यह पक्का करें कि डिवाइस की बिजली की खपत और तापमान तय सीमा के अंदर रहे. बिजली की खपत को सीमित रखने के लिए, यहां दिए गए सुझाव अपनाएं:
- कैमरा एचएएल से बेहतर परफ़ॉर्मेंस पाने के लिए,
DeviceAsWebcam
सेवा मेंSTREAM_USE_CASE_VIDEO_CALL
को चालू करें. अगर
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
सेवा के लागू होने की जांच करने के लिए, इन जांचों का इस्तेमाल करें:
- सीटीएस की पुष्टि करने वाले टूल से वेबकैम की जांच करना: जांचें कि डिवाइस पर फ़ॉर्मैट, साइज़, और फ़्रेम रेट काम करते हैं या नहीं.
- मैन्युअल टेस्ट: जांचें कि वेबकैम की सुविधा, अलग-अलग होस्ट ऑपरेटिंग सिस्टम पर, अलग-अलग होस्ट ऐप्लिकेशन के साथ काम करती है या नहीं.
पहले से मालूम समस्याएं
DeviceAsWebcam
सेवा से जुड़ी ये समस्याएं आम तौर पर होती हैं:
यूवीसी गैजेट ड्राइवर की स्ट्रीम कभी-कभी झिलमिलाती है और दिखाती है कि गड़बड़ी वाले फ़्रेम कैसा दिखता है. इस समस्या को ठीक कर दिया गया है और अपस्ट्रीम और GKI में मर्ज कर दिया गया है.
अपस्ट्रीम से जुड़ी गड़बड़ियां ठीक की गईं:
वेबकैम मोड में काम करने वाले Android डिवाइस, macOS होस्ट पर यूएसबी 3.0 और उसके बाद के वर्शन वाली केबल के साथ काम नहीं करते. इसकी वजह, Apple के यूवीसी ड्राइवर में मौजूद गड़बड़ी है.