Android, Android 14-QPR1 veya sonraki sürümleri çalıştıran cihazlarda cihazın USB web kamerası olarak kullanılmasını destekler. Bu özelliği destekleyen Android cihazlar, UVC cihazı olarak tanıtılır. Bu sayede, farklı işletim sistemlerine (ör. Linux, macOS, Windows ve ChromeOS) sahip çok çeşitli USB ana makinelerinin, cihazın kamerasını web kamerası olarak kullanmasına olanak tanır. DeviceAsWebcam
hizmeti, cihazı web kamerası olarak kullanmak için bu özelliği destekler.
DeviceAsWeb kamerası hizmeti
AOSP'deki DeviceAsWebcam
hizmeti, kullanıcıların sahneyi çerçevelemesini sağlayan bir önizleme etkinliği (DeviceAsWebcamPreview.java
) içerir. Önizleme etkinliği, kullanıcının aşağıdakileri yapmasına olanak tanır:
Akış başlamadan önce web kamerası feed'inin ana makinede nasıl görüneceğini önizleyin.
Ana makineye gönderilen web kamerası feed'ini aşağıdaki şekillerde özelleştirebilirsiniz:
- Önde veya arkada olacak şekilde yayın yapmak için kamerayı seçme
- Kaydırma çubuğu veya düğmeler kullanarak yakınlaştırma düzeyini seçin.
- Bir bölgeye odaklanmak veya odağı kaldırmak için önizlemenin belirli bir bölgesine dokunma.
Önizleme etkinliği, Android'de TalkBack, Anahtar Erişimi ve Sesli Erişim gibi genel erişilebilirlik özellikleriyle çalışır.
Şekil 1. Web kamerası özet akışının, özet akışını kontrol eden önizlemeyle bir ana makineye aktarılması.
Mimari
Bir cihazın web kamerası olarak kullanılmasını destekleyen mimari Şekil 2'de gösterilmektedir. Aşağıda, DeviceAsWebcam
hizmetinin Android çerçevesinin geri kalanıyla etkileşim akışı açıklanmaktadır:
- Kullanıcı, Ayarlar uygulamasında USB web kamerası seçeneğini belirler.
- Ayarlar uygulaması,
UsbManager
sınıfı üzerindensystem_server
cihazına bir bağlayıcı çağrısı göndererekFUNCTION_UVC
öğesinin seçildiğini bildirir. - Sistem sunucusu şunları yapar:
- Bir
setUsbFunctions
HAL arayüz çağrısı aracılığıyla UVC aygıtı işlevini alması için USB cihazı HAL'sini bilgilendirir. - ConfigF'leri kullanarak UVC aygıt sürücüsünü yapılandırması için USB cihaz HAL'sini bilgilendirir.
- Bir
- Aygıt HAL'sinden geri arama aldıktan sonra
system_server
,DeviceAsWebcam
hizmeti tarafından alınacak çerçeveye bir yayın gönderir. - USB cihaz sürücüsü, ana makineden
/dev/video*
konumunda V4L2 düğümleri aracılığıyla yapılandırma komutlarını aldıktan sonra web kamerası akışını başlatır.
Şekil 2. DeviceAsWeb kamerası mimarisi.
Uygulama
Bu bölümde, Android cihazları web kamerası olarak kullanma konusunda destek açıklanmaktadır.
Kernel desteği
Android 14 veya sonraki sürümlerde Genel Kernel Görüntüsü (GKI), UVC araç sürücüsünü varsayılan olarak etkinleştirir (ayrıntıları AOSP yamasında bulabilirsiniz).
Gadget HAL'de UVC desteği
UVC işlevi, Android 14'ten itibaren GadgetFunction.aidl
HAL arayüzünde yer almaktadır. Gadget HAL için UVC widget'ı ConfigFS'e MTP veya ADB gibi diğer ConfigFS işlevleriyle aynı şekilde eklenir.
Gadget HAL'yi uygulamak için UVC işlevini ConfigFS'e eklemek üzere değişiklikler yapın. Aşağıda, UVC işlevini destekleyen bir Gadget HAL uygulamasının örnek snippet'i verilmiştir:
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
...
}
...
}
Cihaz bir web kamerası gibi çalışırken, USB cihazı HAL'nin uygun VID/PID kombinasyonlarını tanıttığından emin olun.
Tüm UVC mantığı tedarikçinin ilk onayında veya DeviceAsWebcam
hizmetinde bulunduğundan, Gadget HAL'de UVC işlevini ConfigFS'e sembolize etmek dışında UVC'ye özgü bir mantık gerekmez.
Uygulama hakkında daha fazla yardım için AOSP'de aşağıdaki örnek koda bakın:
UVC yapılandırmalarıyla ConfigFS'i ayarlama
UVC aygıt sürücüsüne Android web kamerası tarafından desteklenen biçimlerin, boyutların ve kare hızlarının hangileri olduğunu bildirmek için UVC yapılandırmaları içeren ConfigFS'i ayarlayın. Daha fazla bilgi için ConfigFS UVC widget'ı ABI'sindeki yukarı akış Linux dokümanlarına bakın.
Aşağıda, tedarikçi firmanın başlangıç noktasının UVC araç sürücüsünü nasıl ayarlayabileceğine dair bir örnek verilmiştir (AOSP'de kod snippet'i):
# 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
# ...
Bu snippet, UVC araç sürücüsünü 30 fps'de 1080p MJPEG akışı tanıtacak şekilde ayarlar. Bu özellikler, desteklenen çözünürlükleri ve kare hızlarını sorguladığında USB ana makinesine iletilir.
Aşağıda, web kamerasının reklamı yapacağı yapılandırmaları seçmek için genel yönergeler verilmiştir:
DeviceAsWebcam
hizmeti tarafından desteklenen iki akış biçimi, MJPEG ve sıkıştırılmamış YUYV'dir.- USB 2.0, 480 Mb/sn (60 MB/sn) veri aktarımını destekler. Bu, 30 fps'de her karenin maksimum 2 MB ve 60 fps'de maksimum 1 MB olması gerektiği anlamına gelir.
- Sıkıştırılmamış akışlar (YUYV): 30 fps'de YUYV piksel başına 2 bayt olduğundan desteklenen maksimum kare boyutu 720p'dir.
- Sıkıştırılmış MJPEG yayınları: YUV'den 1:10 sıkıştırma oranı olduğu varsayıldığında USB 2.0, 4K'yı (kare başına 1,18 MB) destekleyebilir.
- Birincil ön ve arka kamera cihazları, reklamı yapılan tüm kare boyutlarını desteklemelidir. Bunun nedeni, kullanıcının önizleme kullanıcı arayüzünü kullanarak kamera kimlikleri arasında geçiş yapabilmesidir. Ana makine uygulamaları tarafından yaygın olarak kullanılan boyutlar olan MJPEG akışları için satıcıların 480p (640 x 480), 720p (1280 x 820) ve 1080p (1920 x 1080) kare boyutlarını tanıtmasını öneririz.
- Birincil ön ve arka kamera cihazları, reklamı yapılan tüm kare hızlarını desteklemelidir. Satıcıların 30 fps'yi desteklemesini önemle tavsiye ederiz.
Web kamerası akış yapılandırmaları (ConfigFS) ekleme örneği için AOSP örnek yamasına bakın.
Derlemede web kamerasını etkinleştir
DeviceAsWebcam
hizmetini etkinleştirmek için device.mk
dosyasında ro.usb.uvc.enabled
sistem özelliğini true
olarak ayarlamanız gerekir.
# Enable UVC support
PRODUCT_VENDOR_PROPERTIES += \
ro.usb.uvc.enabled=true
Bu sistem özelliği etkinleştirildiğinde, Şekil 3'te gösterildiği gibi, Ayarlar uygulamasındaki USB tercihleri altında bir Web kamerası seçeneği görünür. Seçenek belirlendiğinde Android cihaz, ana cihaza bir USB web kamerası olarak gösterilir.
Şekil 3. Ayarlar uygulamasındaki USB tercihleri.
Şu komutu kullanarak cihazı ADB üzerinden USB web kamerası işlevine de ayarlayabilirsiniz:
adb shell svc usb setFunctions uvc
Güç ve ısı ile ilgili endişeleri değerlendirin
Web kamerası işlemleri, bir cihaz kamerasının günde birkaç saat boyunca açık olabileceği anlamına gelir. Bu nedenle, cihazın güç tüketiminin ve termalinin belirli sınırların altında kalmasını sağlamak için önlemler almanızı öneririz. Aşağıda, güç tüketimini sınırın altında tutmak için önerilen çözümler verilmiştir:
- Kamera HAL'sinden daha iyi güç performansı almak için
DeviceAsWebcam
hizmetindeSTREAM_USE_CASE_VIDEO_CALL
özelliğini etkinleştirin. STREAM_USE_CASE_VIDEO_CALL
etkinken bile güçle ilgili bir sorun söz konusuysaDeviceAsWebcam
hizmeti, fiziksel akışları kullanarak güç tüketimini daha da azaltma seçeneği sunar. Hangi fiziksel kameranın kullanılacağını belirtmek için çalışma zamanı kaynak yer paylaşımları (RRO) kullanılabilir. Fiziksel akışlar, video kalitesini önemli ölçüde düşürür ve karmaşık bir kullanıcı deneyimine yol açar. Bu nedenle, bu çözümü yalnızca son çare olarak kullanın. Endişeleri gidermek için tercih edilen çözümSTREAM_USE_CASE_VIDEO_CALL
optimizasyonudur.DeviceAsWebcam
hizmeti tarafından desteklenen RRO'lar hakkında daha fazla bilgi için readme.md dosyasına bakın.Aşağıda, mantıksal kamera kimliği 0 yerine fiziksel kamera kimliği 3'ü kullanacak şekilde ayarlanan bir RRO örneği gösterilmektedir. AOSP'deki bir örnek için DeviceAsWebcamRaven konusuna bakın.
// For logical camera id 0 - use physical camera id 3 {"0": {"3" : "UW"}}
Doğrulama
Cihazınızda DeviceAsWebcam
hizmetini uygulamanızı test etmek için aşağıdaki testleri kullanın:
- CTS doğrulayıcı testi web kamerası: Biçimlerin, boyutların ve kare hızlarının cihaz tarafından desteklendiğini test edin.
- Manuel testler: Web kamerası özelliğinin çeşitli ana makine işletim sistemlerinde çeşitli ana makine uygulamalarıyla çalışıp çalışmadığını test edin.
Bilinen sorunlar
DeviceAsWebcam
hizmetiyle ilgili bilinen sorunlar aşağıda belirtilmiştir:
UVC aygıtı sürücüsünün akışı bazen titrer ve bozuk kareler gösterir. Bu sorun düzeltildi ve yukarı akış ile GKI'da birleştirildi.
Apple'ın UVC sürücüsüyle ilgili bir hata nedeniyle web kamerası modundaki Android cihazlar macOS ana makinelerinde USB 3.0+ kablolarla çalışmaz.