Bir cihazı web kamerası olarak kullanma

Android 14-QPR1 veya sonraki sürümleri çalıştıran cihazlar için Android, cihazı USB web kamerası olarak kullanın. Bu özelliği destekleyen Android cihazlarda reklam yayınlanır UVC cihazı olarak da kullanılabilir; bu da farklı özelliklere sahip çok çeşitli USB ana makinelerine olanak tanır işletim sistemlerinde (örneğin, Linux, macOS, Windows ve ChromeOS) kamera olarak kullanabilirsiniz. DeviceAsWebcam hizmeti , cihazı web kamerası olarak kullanmak için bu özelliği destekler.

DeviceAsWeb kamerası hizmeti

AOSP'deki DeviceAsWebcam hizmeti bir önizleme etkinliği içerir (DeviceAsWebcamPreview.java) içerir. Önizleme etkinliği kullanıcının aşağıdakileri yapmasına olanak tanır:

  • Yayından önce web kamerası feed'inin ana makinede nasıl görüneceğini önizleyin başlar.

  • 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.
    • Odaklanmak veya odağı kaldırmak için önizlemenin belirli bir bölgesine dokunma olduğunu görebilirsiniz.

Önizleme etkinliği, Android'deki genel erişilebilirlik özellikleriyle çalışır. TalkBack, Anahtar Erişimi ve Sesli Erişim.

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

Şekil 1. Ana makineye akışla aktarılan web kamerası özet akışı ile feed'i seçin.

Mimari

Bir cihazın web kamerası olarak kullanılmasını destekleyecek mimari Şekil 2. Aşağıda DeviceAsWebcam öğesinin etkileşim akışı açıklanmaktadır hizmet:

  1. Kullanıcı, Ayarlar uygulamasında USB web kamerası seçeneğini belirler.
  2. Ayarlar uygulaması,system_server FUNCTION_UVC adlı UsbManager sınıfının seçildiğini bildiriyor.
  3. Sistem sunucusu şunları yapar:
    1. UVC aygıt işlevini bir setUsbFunctions HAL arayüzü çağrısı.
    2. UVC aygıt sürücüsünü ConfigF'ler.
  4. Aygıt HAL'sinden çağrı aldıktan sonra, system_server, DeviceAsWebcam hizmeti tarafından alınacak çerçeveye yayınlamanız gerekir.
  5. USB aygıt sürücüsü, yapılandırma alındığında web kamerası akışını başlatır ana makineden V4L2 düğümlerine /dev/video* konumundaki komutlar.

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 widget'ını etkinleştirir. sürücüsünü varsayılan olarak güncelleyin (ayrıntıları AOSP yamasında bulabilirsiniz).

Gadget HAL'de UVC desteği

UVC işlevi, Android 14 sürümünden itibaren GadgetFunction.aidl HAL arayüzü. Gadget HAL için UVC gibi diğer ConfigFS işlevleriyle aynı şekilde ConfigFS'e eklenir ve MTP veya ADB olarak kullanma.

Aygıt HAL'sini uygulamak için UVC işlevini ConfigFS'dir. Aşağıda, bir Gadget HAL uygulamasının örnek snippet'i gösterilmektedir destekleyici UVC işlevini destekler:

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'sinin reklam yaptığından emin olun doğru VID/PID kombinasyonlarını belirleme.

Tüm UVC mantığı, tedarikçi firmanın init'inde veya DeviceAsWebcam içinde yer alır. işlevini kullanın, UVC işlevini ConfigFS, Aygıt HAL'de gereklidir.

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 hangi biçimlerin, boyutların ve kare hızlarının tarafından desteklendiğinden, UVC yapılandırmaları içeren ConfigFS'i ayarlayın. Örneğin, Daha fazla bilgi için ConfigFS UVC'sinde yukarı akış Linux dokümanlarını inceleyin araç ABI'sı hakkında daha fazla bilgi edinin.

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 aygıt sürücüsünü 30 fps. Bu özellikler, sorgu işlemi gerçekleştirdiğinde USB ana makinesine iletilir desteklenen çözünürlükleri ve kare hızlarını

Aşağıda, web kamerası yapılandırmaları seçmek için genel yönergeler verilmiştir reklam:

  • 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 boyutunun olması gerektiği anlamına gelir; 60 fps'de maksimum 1 MB boyutunda.
    • Sıkıştırılmamış akışlar (YUYV): 30 fps'de, desteklenen maksimum kare boyut 720p'dir çünkü YUYV piksel başına 2 bayttır.
    • Sıkıştırılmış MJPEG akışları: 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ılıyor. Çünkü kullanıcı şunu kullanarak kamera kimlikleri arasında geçiş yapabilir: önizleme kullanıcı arayüzü. MJPEG akışları için satıcıların 480p (640 x 480), 720p (1280 x 820) ve 1080p (1920 x 1080) çerçeve boyutları ana makine uygulamaları tarafından yaygın olarak kullanılan boyutlara ilişkin bir örnektir.
  • Birincil ön ve arka kamera cihazları, şuna uyan tüm kare hızlarını desteklemelidir: reklamı yapılan üründür. Satıcıların 30 fps'yi desteklemesini önemle tavsiye ederiz.

Web kamerası akış yapılandırmaları (ConfigFS) ekleme örneği için bkz. AOSP örnek yaması.

Derlemede web kamerasını etkinleştir

DeviceAsWebcam hizmetini etkinleştirmek için ro.usb.uvc.enabled ayarını yapmanız gerekir sistem özelliğini device.mk dosyasında true olarak ayarlayın.

# Enable UVC support
PRODUCT_VENDOR_PROPERTIES += \
    ro.usb.uvc.enabled=true

Bu sistem özelliği etkinleştirildiğinde Web kamerası seçeneği Ayarlar uygulamasına (Şekil 3'te gösterildiği gibi) gidin. Seçenek seçildiğinde, Android cihaz, barındıran cihaza bir USB web kamerası olarak görünür.

Şekil 3. Ayarlar uygulamasındaki USB tercihleri.

Ayrıca, bunu kullanarak cihazı ADB üzerinden USB web kamerası işlevine ayarlayabilirsiniz komut:

adb shell svc usb setFunctions uvc

Güç ve ısı ile ilgili endişeleri değerlendirin

Web kamerası işlemleri, bir cihazın kamerasının birden fazla kişi için açık olabileceği anlamına gelir saatlere ihtiyaç duyuyoruz. Bu yüzden, elektriğin tamamen tüketim ve ısısı belirli sınırların altında kalır. İlgili içeriği oluşturmak için kullanılan aşağıda güç tüketimini sınırın altında tutmak için önerilen çözümler yer almaktadır:

  • Kamera donanım soyutlama katmanından daha iyi güç performansı almak için DeviceAsWebcam hizmetinde STREAM_USE_CASE_VIDEO_CALL.
  • STREAM_USE_CASE_VIDEO_CALL etkinken bile güçle ilgili bir sorun söz konusuysa DeviceAsWebcam hizmeti, gücü daha da azaltma seçeneği sunar tüketim elde etti. Tekliflerinizi otomatikleştirmek ve optimize etmek için çalışma zamanı kaynak yer paylaşımları (RRO'lar) pek de iyi olmadığını unutmayın. Fiziksel yayınlar, video kalitesini önemli ölçüde düşürerek kafa karıştırıcı bir kullanıcı deneyimi olduğundan bu çözümü yalnızca son çare olarak kullanın. Optimize ediliyor Güç kaynağı için tercih edilen çözüm STREAM_USE_CASE_VIDEO_CALL emin olun. DeviceAsWebcam tarafından desteklenen DGR'ler hakkında daha fazla bilgi hizmeti için readme.md dosyasına bakın.

    Aşağıda, fiziksel kamera kimliği 3'ü kullanmak üzere ayarlanan bir RRO örneği verilmiştir yerine mantıksal kamera kimliği 0 olması gerekir. AOSP'deki bir örnek için bkz. DeviceAsWebcamRaven.

    // For logical camera id 0 - use physical camera id 3
    {"0": {"3" : "UW"}}
    

Doğrulama

DeviceAsWebcam hizmetini cihazınızda nasıl uygulayacağınızı test etmek için aşağıdaki testler:

  • CTS doğrulayıcı testi web kamerası: Biçimlerin, boyutların ve cihazın kare hızlarını desteklemesi.
  • Manuel testler: Web kamerası özelliğinin çeşitli ana makine uygulamalarıyla çalışıp çalışmadığını test etme çeşitli ana makine işletim sistemlerinde çalışır.

Bilinen sorunlar

DeviceAsWebcam hizmetiyle ilgili bilinen sorunlar aşağıda belirtilmiştir: