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.
Sunucuya gönderilen web kamerası feed'ini aşağıdaki yöntemlerle özelleştirebilirsiniz:
- Canlı yayında kullanılacak kamerayı (ön veya arka) seçin.
- Kaydırma çubuğu veya düğmeler kullanarak yakınlaştırma düzeyini seçme.
- 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 aşağıdakileri yapar:
- USB gadget HAL'ini, UVC gadget işlevini
setUsbFunctions
HAL arayüzü çağrısı aracılığıyla almasını bildirir. - USB gadget HAL'ini, ConfigFs'yi kullanarak UVC gadget sürücüsünü yapılandırması için bilgilendirir.
- USB gadget HAL'ini, UVC gadget işlevini
- 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ü,
/dev/video*
adresindeki V4L2 düğümleri aracılığıyla ana makineden yapılandırma komutları aldıktan sonra web kamerası yayını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 gadget'ı, MTP veya ADB gibi diğer ConfigFS işlevleriyle aynı şekilde ConfigFS'ye monte edilir.
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ına ait örnek bir snippet 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ı reklamlaştırdığından emin olun.
Tüm UVC mantığı, sağlayıcı init'inde veya DeviceAsWebcam
hizmetinde olduğundan Gadget HAL'de UVC işlevini ConfigFS ile sembolik olarak bağlama 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 gadget sürücüsünü Android web kamerası tarafından desteklenen biçimler, boyutlar ve kare hızları hakkında bilgilendirmek için ConfigFS'yi UVC yapılandırmalarıyla ayarlayın. Daha fazla bilgi için ConfigFS UVC gadget ABI ile ilgili yayın öncesi Linux belgelerine 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): 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'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'den daha iyi güç performansı elde etmek için
DeviceAsWebcam
hizmetindeSTREAM_USE_CASE_VIDEO_CALL
'ü 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 verilmiştir:
UVC gadget sürücüsünün aktarımı bazen titreşir ve bozuk kareler gibi görünen kareler gösterir. Bu sorun düzeltilmiş ve yayın öncesi ve GKI'de 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 ve sonraki sürüm kablolarıyla çalışmaz.