Harici USB kameralar

Android platformu, tak-çalıştır USB kameraların (yani web kameraları) kullanan, standart Android Camera2 API'si ve kamera HAL kullanır. Web kameraları genellikle USB video sınıfı (UVC) ve Linux'ta ise standart Video4Linux (V4L) sürücüsü, UVC kameraları kontrol etmek için kullanılır.

Web kamerası desteğiyle cihazlar, aşağıdaki gibi hafif kullanım alanlarında kullanılabilir: görüntülü sohbet ve fotoğraf kioskları. Bu özellik, standart dahili reklam sistemlerinin yerine kamera HAL'leri içerir ve yüksek çözünürlüklü ve karmaşık çözümler içeren karmaşık görevleri Yüksek hızlı akış, AR ve manuel İSS/sensör/lens kontrolü.

USB kamera HAL işlemi, USB cihaz kullanılabilirliğini dinler ve harici kamera cihazlarını numaralandırır buna göre hazırlar. Bu işlem aşağıdakine benzer izinlere ve bir SE politikasına sahiptir: yerleşik kamera HAL işlemidir. İletişim kuran üçüncü taraf web kamerası uygulamaları UVC'ye erişmek için aynı kamera izinlerini gerektirir. kamera uygulamalarında olduğu gibi.

Örnekler ve kaynaklar

USB kameraların nasıl uygulanacağı hakkında daha fazla bilgi için bkz. harici kamera sağlayıcı referans uygulaması ExternalCameraProvider. Harici kamera cihazı ve oturum uygulamaları ExternalCameraDevice ve ExternalCameraDeviceSession. API düzeyi 28'den itibaren Java istemci API'si EXTERNAL kullanabilirsiniz.

Uygulama

Uygulama, android.hardware.usb.host yeni bir sistem işlevinden bahsedeceğiz.

UVC cihazları için çekirdek desteği de etkinleştirilmelidir. Bu özelliği şu şekilde etkinleştirebilirsiniz: ilgili çekirdek defconfig dosyalarına aşağıdakini ekleyerek.

+CONFIG_USB_VIDEO_CLASS=y
+CONFIG_MEDIA_USB_SUPPORT=y

İlgili cihaz derlemesinde harici kamera sağlayıcısını etkinleştirmek için gerekli SELinux izinlerini, harici kamera yapılandırmasını ve harici kamera sağlayıcısına bağlıysanız aşağıdaki adımları tamamlayın:

  • Harici kamera yapılandırma dosyasını ve harici kamera kitaplığını şuraya ekleyin: device.mk

    +PRODUCT_PACKAGES += android.hardware.camera.provider-V1-external-service
    
    +PRODUCT_COPY_FILES += \
    +device/manufacturerX/productY/external_camera_config.xml:$(TARGET_COPY_OUT_VENDOR)/etc/external_camera_config.xml
    
  • Harici kamera sağlayıcısının adını, cihazın Treble HAL manifestine ekleyin.

    <hal format="aidl">
        <name>android.hardware.camera.provider</name>
        <version>1</version>
        <interface>
            <name>ICameraProvider</name>
            <instance>internal/0</instance>
    +       <instance>external/0</instance>
        </interface>
    </hal>
    
  • (İsteğe bağlı) Cihaz Tiz geçiş modunda çalışıyorsa sepolicy uygulamasını güncelleyin Böylece cameraserver, UVC kamerasına erişebilir.

    +# for external camera
    +allow cameraserver device:dir r_dir_perms;
    +allow cameraserver video_device:dir r_dir_perms;
    +allow cameraserver video_device:chr_file rw_file_perms;
    

external_camera_config.xml örneğini burada bulabilirsiniz (telif hakkı satırları atlanmıştır).

<ExternalCamera>
    <Provider>
        <ignore> <!-- Internal video devices to be ignored by external camera HAL -->
            <id>0</id> <!-- No leading/trailing spaces -->
            <id>1</id>
        </ignore>
    </Provider>
    <!-- See ExternalCameraUtils.cpp for default values of Device configurations below -->
    <Device>
        <!-- Max JPEG buffer size in bytes-->
        <MaxJpegBufferSize bytes="3145728"/> <!-- 3MB (~= 1080p YUV420) -->
        <!-- Size of v4l2 buffer queue when streaming >= 30fps -->
        <!-- Larger value: more request can be cached pipeline (less janky)  -->
        <!-- Smaller value: use less memory -->
        <NumVideoBuffers count="4"/>
        <!-- Size of v4l2 buffer queue when streaming < 30fps -->
        <NumStillBuffers count="2"/>

        <!-- List of maximum fps for various output sizes -->
        <!-- Any image size smaller than the size listed in Limit row will report
            fps (as minimum frame duration) up to the fpsBound value. -->
        <FpsList>
            <!-- width/height must be increasing, fpsBound must be decreasing-->
            <Limit width="640" height="480" fpsBound="30.0"/>
            <Limit width="1280" height="720" fpsBound="15.0"/>
            <Limit width="1920" height="1080" fpsBound="10.0"/>
            <!-- image size larger than the last entry will not be supported-->
        </FpsList>
    </Device>
</ExternalCamera>

Özelleştirme

Android kamerasını genel özelleştirme seçenekleriyle geliştirebilirsiniz optimizasyon yapabilirsiniz.

Genel özelleştirmeler

Şu değişiklikleri yaparak harici kamera sağlayıcısını özelleştirebilirsiniz: external_camera_config.xml dosyası yükleyin. Özellikle, müşteriler şu parametrelere sahiptir:

  • Dahili kameraların video düğümleri hariç
  • Desteklenen resim boyutu ve kare hızı üst sınırı
  • Yayın sırasındaki arabellek sayısı (takıntı - bellek dengesi)

Bu parametrelere ek olarak kendi parametrelerinizi ekleyebilir veya izin verir.

Cihaza özel optimizasyonlar

Ayrıca, cihaza özel optimizasyonlar ekleyerek performansı artırabilirsiniz.

Arabellek kopyalama/ölçeklendirme ve JPEG kodu çözme/kodlama

Genel uygulamalar CPU (libyuv/libjpeg) kullanır, ancak bunu optimize edebilirsiniz.

HAL çıkış biçimi

Genel uygulamalar aşağıdaki çıkış biçimlerini kullanır:

  • Video IMPLEMENTATION_DEFINED arabellekleri için YUV_420_888
  • Diğer tüm IMPLEMENTATION_DEFINED arabellekleri için YUV12

Performansı artırmak için çıkış biçimlerini cihaza özel çıkış biçimleriyle değiştirebilirsiniz. etkili biçimlerdir. Ayrıca, özelleştirilmiş bir biçimde ek biçimleri de destekleyebilirsiniz uygulama

Doğrulama

Harici kamera desteği olan cihazlar kamera CTS'si kullanır. Harici USB Web kamerası test çalıştırması boyunca belirli bir cihaza bağlı kalmalıdır. Aksi takdirde bazı test durumları başarısız olur.