Harici USB Kameralar

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

Web kamerası desteği sayesinde cihazlar, görüntülü sohbet ve fotoğraf kioskları gibi hafif kullanım durumlarında kullanılabilir. Bu özellik, Android telefonlardaki tipik dahili kamera HAL'lerinin yerini almaz ve yüksek çözünürlüklü ve yüksek hızlı akış, AR ve manuel ISP/sensör/lens kontrolünü içeren performans yoğun, karmaşık görevleri desteklemek üzere tasarlanmamıştır.

USB kamera HAL işlemi, USB cihazının kullanılabilirliğini dinleyen ve harici kamera cihazlarını buna göre numaralandıran harici kamera sağlayıcısının bir parçasıdır. İşlemin izinleri ve yerleşik kamera HAL işlemine benzer bir SE politikası vardır. Doğrudan USB aygıtlarıyla iletişim kuran üçüncü taraf web kamerası uygulamaları, UVC aygıtlarına erişmek için herhangi bir normal kamera uygulamasında olduğu gibi aynı kamera izinlerine ihtiyaç duyar.

Örnekler ve kaynaklar

USB kameraların nasıl uygulanacağı hakkında daha fazla bilgi için, ExternalCameraProvider adresindeki harici kamera sağlayıcısı referans uygulamasına bakın. Harici kamera cihazı ve oturum uygulamaları, ExternalCameraDevice ve ExternalCameraDeviceSession dahildir. API düzeyi 28'den başlayarak, Java istemci API'si EXTERNAL donanım düzeyini içerir.

Uygulama

Uygulamanın android.hardware.usb.host sistem özelliğini desteklemesi gerekir.

UVC cihazları için çekirdek desteği de etkinleştirilmelidir. İlgili çekirdek defconfig dosyalarına aşağıdakileri ekleyerek bunu etkinleştirebilirsiniz.

+CONFIG_USB_VIDEO_CLASS=y
+CONFIG_MEDIA_USB_SUPPORT=y

Gerekli SELinux izinlerini, harici kamera yapılandırmasını ve harici kamera sağlayıcı bağımlılığını ekleyen ilgili cihaz yapısında harici kamera sağlayıcısını etkinleştirmek için aşağıdaki adımları tamamlayın:

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

    +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 Tiz HAL bildirimine 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, cameraserver UVC kameraya erişebilmesi için sepolicy güncelleyin.

    +# 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;
    

Burada bir external_camera_config.xml örneği verilmiştir (telif hakkı satırları çıkarılmış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 kamerayı genel özelleştirme seçenekleriyle veya cihaza özel optimizasyonlarla geliştirebilirsiniz.

Genel özelleştirmeler

external_camera_config.xml dosyasını değiştirerek harici kamera sağlayıcısını özelleştirebilirsiniz. Özellikle, istemciler aşağıdaki parametreleri özelleştirebilir:

  • Dahili kameraların video düğümleri hariç
  • Desteklenen görüntü boyutu ve kare hızı üst sınırı
  • Uçuş içi arabellek sayısı (jank ve bellek değişimi)

Bu parametrelere ek olarak kendi parametrelerinizi ekleyebilir veya kendi konfigürasyonlarınızı geliştirebilirsiniz.

Cihaza özel optimizasyonlar

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

Arabellek kopyalama/ölçekleme ve JPEG kod çözme/kodlama

Genel uygulamalar CPU (libyuv/libjpeg) kullanır ancak bunu cihaza özel optimizasyonlarla değiştirebilirsiniz.

HAL çıkış formatı

Genel uygulamalar aşağıdaki çıktı formatlarını kullanır:

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

Performansı artırmak için çıktı formatlarını cihaza özel verimli formatlarla değiştirebilirsiniz. Özelleştirilmiş bir uygulamada ek formatları da destekleyebilirsiniz.

Doğrulama

Harici kamera desteğine sahip cihazların kamera CTS'sini geçmesi gerekir. Test çalıştırmasının tamamı boyunca harici USB web kamerasının belirli bir cihaza takılı kalması gerekir, aksi takdirde bazı test durumları başarısız olur.