Android 14-QPR1 veya sonraki sürümleri çalıştıran 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 makineleri 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 kadraja almasına 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.
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 bir bölgedeki odağı kaldırmak için önizlemenin belirli bir bölgesine dokunun.
Önizleme etkinliği, Android'deki TalkBack, Anahtar Erişimi ve Sesli Erişim gibi genel erişilebilirlik özellikleriyle çalışır.
Şekil 1. Web kamerası feed'i, feed'i önizlemenin kontrol ettiği bir toplantı sahibine aktarılıyor.
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 olan etkileşim akışı açıklanmaktadır:
- Kullanıcı, Ayarlar uygulamasında USB web kamerası seçeneğini belirler.
- Ayarlar uygulaması,
UsbManager
sınıfı aracılığıylasystem_server
'e bir bağlayıcı çağrı göndererekFUNCTION_UVC
'nin seçildiğini bildirir. - Sistem sunucusu şunları yapar:
- Bir
setUsbFunctions
HAL arayüz çağrısı aracılığıyla UVC cihazı işlevini alması için USB cihaz HAL'sini bilgilendirir. - USB gadget HAL'ini, ConfigFs'yi kullanarak UVC gadget sürücüsünü yapılandırması için bilgilendirir.
- Bir
- Gadget HAL'den geri arama aldıktan sonra
system_server
,DeviceAsWebcam
hizmeti tarafından alınması için ç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. DeviceAsWebcam mimarisi.
Uygulama
Bu bölümde, Android cihazların web kamerası olarak kullanılmasının nasıl destekleneceği açıklanmaktadır.
Çekirdek desteği
Android 14 veya sonraki sürümlerde Genel Çekirdek Görüntüsü (GKI), UVC gadget sürücüsünü varsayılan olarak etkinleştirir (AOSP yamasında ayrıntılara bakın).
Gadget HAL'de UVC desteği
Android 14'ten itibaren UVC işlevi GadgetFunction.aidl
HAL arayüzüne dahil edilmiştir. Gadget HAL için UVC widget'ı ConfigFS'e MTP veya ADB gibi diğer ConfigFS işlevleriyle aynı şekilde eklenir.
Gadget HAL'i uygulamak için UVC işlevini ConfigFS'ye monte etmek ü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 web kamerası olarak çalışırken USB gadget HAL'ın doğru VID/PID kombinasyonlarını reklam ettiğinden 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.
Uygulamayla ilgili daha fazla bilgi için AOSP'deki aşağıdaki örnek koda bakın:
ConfigFS'yi UVC yapılandırmalarıyla 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 ilk başlatılmasının 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, UVC gadget sürücüsünü 30 fps'de 1080p MJPEG akışının reklamını yapacak şekilde ayarlar. Bu özellikler, desteklenen çözünürlükleri ve kare hızlarını sorguladığında USB ana makinesine iletilir.
Web kamerasının reklamını yaptığı yapılandırmaları seçmeye yönelik 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'dur.- USB 2.0, 480 Mb/sn (60 MB/sn) veri aktarımını destekler. Bu, 30 fps'de her karenin maksimum boyutunun 2 MB, 60 fps'de ise 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 akışları: YUV'den 1:10 sıkıştırma oranı varsayarsak 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 tedarikçi firmaların, barındıran uygulamalar tarafından yaygın olarak kullanılan 480p (640 x 480), 720p (1280 x 820) ve 1080p (1920 x 1080) kare boyutlarını kullanmasını öneririz.
- Birincil ön ve arka kamera cihazları, reklamı yapılan tüm kare hızlarını desteklemelidir. Tedarikçi firmaların 30 fps'yi desteklemesini önemle tavsiye ederiz.
Web kamerası yayını 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 mülkünü 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ında USB tercihleri altında bir Web kamerası seçeneği görünür. Bu seçenek seçildiğinde Android cihaz, ana cihaza USB web kamerası olarak görünür.
Şekil 3. Ayarlar uygulamasındaki USB tercihleri.
Cihazı USB web kamerası işlevine ayarlamak için ADB üzerinden şu komutu da kullanabilirsiniz:
adb shell svc usb setFunctions uvc
Güç ve termal endişeleri göz önünde bulundurun
Web kamerası işlemleri, cihazın kamerasının günde birkaç saat açık olabileceği anlamına gelir. Bu nedenle, cihazın güç tüketiminin ve termal durumunun belirli sınırlar içinde kalması için önlemler almanızı öneririz. Aşağıda, güç tüketimini sınırlar 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üç tüketimi endişeniz 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ında kaynak yer paylaşımları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 endişeleri gidermek içinSTREAM_USE_CASE_VIDEO_CALL
'ü optimize etmek tercih edilen çözümdür.DeviceAsWebcam
hizmeti tarafından desteklenen RRO'lar hakkında daha fazla bilgi için readme.md dosyasını inceleyin.Aşağıda, mantıksal kamera kimliği 0 yerine fiziksel kamera kimliği 3'ün kullanılacağı şekilde ayarlanmış bir RRO örneği verilmiştir. AOSP'deki bir örnek için DeviceAsWebcamRaven'e 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ı: Cihazın biçimleri, boyutları ve kare hızlarını destekleyip desteklemediğini test edin.
- Manuel testler: Web kamerası özelliğinin çeşitli ana makine işletim sistemlerinde çeşitli ana makine uygulamalarıyla çalıştığı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üzeltilmiş ve yayın öncesi ve GKI'de birleştirilmiştir.
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.