Bir cihazı web kamerası olarak kullanma

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.

ana makineye web kamerası feed'i yayınlandı

Ş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:

  1. Kullanıcı, Ayarlar uygulamasında USB web kamerası seçeneğini belirler.
  2. Ayarlar uygulaması, UsbManager sınıfı üzerinden system_server cihazına bir bağlayıcı çağrısı göndererek FUNCTION_UVC öğesinin seçildiğini bildirir.
  3. Sistem sunucusu şunları yapar:
    1. Bir setUsbFunctions HAL arayüz çağrısı aracılığıyla UVC aygıtı işlevini alması için USB cihazı HAL'sini bilgilendirir.
    2. ConfigF'leri kullanarak UVC aygıt sürücüsünü yapılandırması için USB cihaz HAL'sini bilgilendirir.
  4. Aygıt HAL'sinden geri arama aldıktan sonra system_server, DeviceAsWebcam hizmeti tarafından alınacak çerçeveye bir yayın gönderir.
  5. 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.

web kamerası olarak cihazın mimarisi

Ş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 hizmetinde STREAM_USE_CASE_VIDEO_CALL özelliğini etkinleştirin.
  • STREAM_USE_CASE_VIDEO_CALL etkinken bile güçle ilgili bir sorun söz konusuysa 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ı 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üm STREAM_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: