Android 14-QPR1 veya sonraki sürümlerin yüklü olduğu cihazlarda Android, 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 makineler, cihazın kamerasını web kamerası olarak kullanabilir. DeviceAsWebcam
hizmeti, cihazı web kamerası olarak kullanmak için bu özelliği destekler.
DeviceAsWebcam hizmeti
AOSP'deki DeviceAsWebcam
hizmeti, kullanıcıların sahneyi çerçevelemesine olanak tanıyan bir önizleme etkinliği (DeviceAsWebcamPreview.java
) içerir. Önizleme etkinliği, kullanıcının aşağıdakileri yapmasına olanak tanır:
Canlı yayın başlamadan önce web kamerası feed'inin ana makinede nasıl görüneceğini önizleyin.
Web kamerası feed'ini aşağıdaki şekillerde özelleştirebilirsiniz:
- Yayınlanacak kamerayı (ön veya arka) seçme
- Kaydırma çubuğu veya düğmelerle yakınlaştırma düzeyini seçme
- Odaklanmak veya odağı kaldırmak için önizlemenin belirli bir bölgesine dokunma.
Önizleme etkinliği, Android'deki TalkBack, Anahtar Erişimi ve Sesli Erişim gibi genel erişilebilirlik özellikleriyle çalışır.
1. şekil. Web kamerası feed'i, feed'i kontrol eden önizleme ile bir toplantı sahibine aktarılıyor.
Mimari
Bir cihazı web kamerası olarak kullanmayı destekleyen mimari, Şekil 2'de gösterilmektedir. Aşağıda, DeviceAsWebcam
hizmetinin Android çerçevesinin geri kalanıyla olan etkileşim akışı açıklanmaktadır:
- Kullanıcı, Ayarlar uygulamasında USB web kamerası seçeneğini belirler.
- Ayarlar uygulaması,
system_server
sınıfı üzerindenUsbManager
sınıfınaFUNCTION_UVC
seçildiğini bildiren bir bağlayıcı çağrısı gönderir. - Sistem sunucusu şunları yapar:
- USB gadget HAL'ını,
setUsbFunctions
HAL arayüzü çağrısı aracılığıyla UVC gadget işlevini almaya yönlendirir. - USB gadget HAL'ını, UVC gadget sürücüsünü ConfigFs kullanarak yapılandırması için bilgilendirir.
- USB gadget HAL'ını,
- Gadget HAL'den geri arama alındığında
system_server
,DeviceAsWebcam
hizmeti tarafından alınmak üzere çerçeveye bir yayın gönderir. - USB gadget sürücüsü,
/dev/video*
konumundaki V4L2 düğümleri aracılığıyla ana makineden yapılandırma komutları aldığında web kamerası akışını başlatır.
Şekil 2. DeviceAsWebcam mimarisi.
Uygulama
Bu bölümde, Android cihazların web kamerası olarak kullanılmasını nasıl destekleyeceğiniz açıklanmaktadır.
Çekirdek desteği
Android 14 veya sonraki sürümlerde, Genel Çekirdek Görüntüsü (GKI) varsayılan olarak UVC gadget sürücüsünü etkinleştirir (ayrıntıları AOSP yamasında bulabilirsiniz).
Gadget HAL'de UVC'yi destekleme
Android 14'ten itibaren UVC işlevi, GadgetFunction.aidl
HAL arayüzüne dahil edilmiştir. Gadget HAL için UVC gadget'ı, MTP veya ADB gibi diğer ConfigFS işlevleriyle aynı şekilde ConfigFS'ye monte edilir.
Gadget HAL'ı uygulamak için UVC işlevini ConfigFS'ye bağlayacak şekilde 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 web kamerası olarak kullanılırken USB gadget HAL'ın doğru VID/PID kombinasyonlarını yayınladığından emin olun.
Tüm UVC mantığı, sağlayıcı başlatma veya DeviceAsWebcam
hizmetinde olduğundan, UVC işlevini ConfigFS'ye sembolik olarak bağlama dışında, Gadget HAL'de UVC'ye özgü bir mantık gerekmez.
Uygulama hakkında daha fazla bilgi için AOSP'deki aşağıdaki örnek koda bakın:
UVC yapılandırmalarıyla ConfigFS'yi ayarlama
Android web kamerasının hangi biçimleri, boyutları ve kare hızlarını desteklediğini UVC gadget sürücüsüne bildirmek için ConfigFS'yi UVC yapılandırmalarıyla ayarlayın. Daha fazla bilgi için ConfigFS UVC gadget ABI ile ilgili yukarı akış Linux belgelerine bakın.
Aşağıda, tedarikçi başlatma işleminin UVC gadget sürücüsünü nasıl ayarlayabileceğine dair bir örnek verilmiştir (AOSP'deki 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, 1080p MJPEG akışını 30 fps'de yayınlamak için UVC gadget sürücüsünü ayarlar. Bu özellikler, desteklenen çözünürlükleri ve kare hızlarını sorguladığında USB ana bilgisayarına bildirilir.
Web kamerasının duyurduğu yapılandırmaları seçmeyle ilgili genel yönergeler aşağıda 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, 60 fps'de ise maksimum 1 MB olması gerektiği anlamına gelir.
- Sıkıştırılmamış akışlar (YUYV): YUYV, piksel başına 2 bayt olduğundan 30 fps'de desteklenen maksimum kare boyutu 720p'dir.
- Sıkıştırılmış MJPEG akışları: YUV'dan 1:10 sıkıştırma oranı 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 çerçeve boyutlarını desteklemelidir. Bunun nedeni, kullanıcının önizleme kullanıcı arayüzünü kullanarak kamera kimlikleri arasında geçiş yapabilmesidir. 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ı reklamını yapmasını öneririz. Bunun nedeni, bu boyutların genellikle ana makine uygulamaları tarafından kullanılan boyutlar olmasıdır.
- Birincil ön ve arka kamera cihazları, reklamı yapılan tüm kare hızlarını desteklemelidir. Tedarikçilerin 30 FPS'yi desteklemesini önemle tavsiye ederiz.
Web kamerası akışı yapılandırmaları (ConfigFS) ekleme örneği için AOSP örnek yaması başlıklı makaleyi inceleyin.
Derlemede web kamerasını etkinleştirme
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 tercihlerinde Web kamerası seçeneği görünür. Bu seçenek belirlendiğinde Android cihaz, ana makine cihazında USB web kamerası olarak görünür.
3.Şekil Ayarlar uygulamasındaki USB tercihleri
Ayrıca, bu komutu kullanarak ADB üzerinden cihazı USB web kamerası işlevine ayarlayabilirsiniz:
adb shell svc usb setFunctions uvc
Güç ve termal sorunları göz önünde bulundurma
Web kamerası işlemleri, bir cihazın kamerasının günde birkaç saat açık kalabileceği anlamına gelir. Bu nedenle, cihazın güç tüketiminin ve ısısının belirli sınırlar içinde kalmasını sağlamak için önlemler almanızı öneririz. Güç tüketimini sınırlar içinde tutmak için aşağıdaki çözümler önerilir:
- Kamera donanım soyutlama katmanının daha iyi güç performansı için
DeviceAsWebcam
hizmetindeSTREAM_USE_CASE_VIDEO_CALL
seçeneğini etkinleştirin. STREAM_USE_CASE_VIDEO_CALL
etkinleştirilmiş olsa bile güç tüketimiyle ilgili endişeleriniz varsaDeviceAsWebcam
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 katmanlarını (RRO'lar) kullanabilirsiniz. Fiziksel yayınlar video kalitesini önemli ölçüde düşürür ve kafa karıştırıcı bir kullanıcı deneyimine yol açar. Bu nedenle, bu çözümü yalnızca son çare olarak kullanın. Güçle ilgili sorunları gidermek içinSTREAM_USE_CASE_VIDEO_CALL
optimizasyonu tercih edilen çözümdür.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'ü kullanmak için ayarlanmış bir RRO örneği verilmiştir. AOSP'deki bir örnek için DeviceAsWebcamRaven'a bakın.
// For logical camera id 0 - use physical camera id 3 {"0": {&qu
ot;3" : "UW"}}
Doğrulama
Cihazınızda DeviceAsWebcam
hizmetinin uygulamasını 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 uygulamalarıyla ve ana makine işletim sistemleriyle çalıştığını test edin.
Bilinen sorunlar
DeviceAsWebcam
hizmetiyle ilgili bilinen sorunlar şunlardır:
UVC gadget sürücüsünün akışı bazen titriyor ve bozuk kareler gibi görünen görüntüler gösteriyor. Bu sorun düzeltilmiş ve yukarı akışta ve GKI'da birleştirilmiştir.
Web kamerası modundaki Android cihazlar, Apple'ın UVC sürücüsündeki bir hata nedeniyle macOS ana makinelerinde USB 3.0+ kablolarla çalışmaz.