Bir cihazı web kamerası olarak kullanma

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.

Web kamerası feed'i ana makineye aktarılı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:

  1. Kullanıcı, Ayarlar uygulamasında USB web kamerası seçeneğini belirler.
  2. Ayarlar uygulaması, UsbManager sınıfı aracılığıyla system_server'e bir bağlayıcı çağrı göndererek FUNCTION_UVC'nin seçildiğini bildirir.
  3. Sistem sunucusu aşağıdakileri yapar:
    1. USB gadget HAL'ini, UVC gadget işlevini setUsbFunctions HAL arayüzü çağrısı aracılığıyla almasını bildirir.
    2. USB gadget HAL'ini, ConfigFs'yi kullanarak UVC gadget sürücüsünü yapılandırması için bilgilendirir.
  4. 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.
  5. 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.

web kamerası olarak cihaz mimarisi

Ş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 DeviceAsWebcamhizmetinde 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 hizmetinde STREAM_USE_CASE_VIDEO_CALL'ü etkinleştirin.
  • STREAM_USE_CASE_VIDEO_CALL etkinken bile güç tüketimi endişeniz varsa DeviceAsWebcam 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çin STREAM_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: