Bir cihazı web kamerası olarak kullanma

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.

Web kamerası feed'i, düzenleyiciye aktarılı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:

  1. Kullanıcı, Ayarlar uygulamasında USB web kamerası seçeneğini belirler.
  2. Ayarlar uygulaması, system_server sınıfı üzerinden UsbManager sınıfına FUNCTION_UVC seçildiğini bildiren bir bağlayıcı çağrısı gönderir.
  3. Sistem sunucusu şunları yapar:
    1. USB gadget HAL'ını, setUsbFunctions HAL arayüzü çağrısı aracılığıyla UVC gadget işlevini almaya yönlendirir.
    2. USB gadget HAL'ını, UVC gadget sürücüsünü ConfigFs kullanarak yapılandırması için bilgilendirir.
  4. Gadget HAL'den geri arama alındığında system_server, DeviceAsWebcam hizmeti tarafından alınmak üzere çerçeveye bir yayın gönderir.
  5. 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.

Web kamerası olarak cihaz mimarisi

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

Ayarlar uygulamasındaki USB tercihleri

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 hizmetinde STREAM_USE_CASE_VIDEO_CALL seçeneğini etkinleştirin.
  • STREAM_USE_CASE_VIDEO_CALL etkinleştirilmiş olsa bile güç tüketimiyle ilgili endişeleriniz 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ı 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çin STREAM_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": {"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: