Máy ảnh USB bên ngoài

Nền tảng Android hỗ trợ sử dụng máy ảnh USB plug-and-play (nghĩa là webcam) bằng API Android Camera2 tiêu chuẩn và giao diện HAL của máy ảnh. Các webcam thường hỗ trợ trình điều khiển lớp video USB (UVC) và trên Linux, trình điều khiển Video4Linux (V4L) tiêu chuẩn được sử dụng để điều khiển camera UVC.

Với sự hỗ trợ cho webcam, các thiết bị có thể được sử dụng trong các trường hợp sử dụng đơn giản như trò chuyện video và ki-ốt chụp ảnh. Tính năng này không thay thế HAL camera nội bộ thông thường trên điện thoại Android và không được thiết kế để hỗ trợ các tác vụ phức tạp, đòi hỏi nhiều hiệu suất liên quan đến truyền phát độ phân giải cao và tốc độ cao, AR và điều khiển ISP/cảm biến/ống kính thủ công.

Quy trình HAL của camera USB là một phần của nhà cung cấp camera bên ngoài, có nhiệm vụ lắng nghe tình trạng sẵn có của thiết bị USB và liệt kê các thiết bị camera bên ngoài tương ứng. Quy trình này có các quyền và chính sách SE tương tự như quy trình HAL của camera tích hợp. Các ứng dụng webcam của bên thứ ba giao tiếp trực tiếp với thiết bị USB yêu cầu quyền truy cập máy ảnh giống nhau để truy cập các thiết bị UVC như với bất kỳ ứng dụng máy ảnh thông thường nào.

Ví dụ và nguồn

Để biết thêm thông tin về cách triển khai camera USB, hãy xem cách triển khai tham khảo của nhà cung cấp camera bên ngoài tại ExternalCameraProvider . Việc triển khai phiên và thiết bị camera bên ngoài được bao gồm trong ExternalCameraDeviceExternalCameraDeviceSession . Bắt đầu từ cấp độ API 28, API máy khách Java bao gồm cấp độ phần cứng EXTERNAL .

Thực hiện

Việc triển khai phải hỗ trợ tính năng hệ thống android.hardware.usb.host .

Hỗ trợ hạt nhân cho các thiết bị UVC cũng phải được bật. Bạn có thể kích hoạt tính năng này bằng cách thêm phần sau vào tệp defconfig kernel tương ứng.

+CONFIG_USB_VIDEO_CLASS=y
+CONFIG_MEDIA_USB_SUPPORT=y

Để kích hoạt nhà cung cấp camera bên ngoài trong bản dựng thiết bị tương ứng, bổ sung các quyền SELinux cần thiết, cấu hình camera bên ngoài và sự phụ thuộc của nhà cung cấp camera bên ngoài, hãy hoàn thành các bước sau:

  • Thêm tệp cấu hình camera bên ngoài và thư viện camera bên ngoài vào 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
    
  • Thêm tên nhà cung cấp camera bên ngoài vào bảng kê khai Treble HAL của thiết bị.

    <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>
    
  • (Tùy chọn) Nếu thiết bị chạy ở chế độ truyền qua Treble, hãy cập nhật sepolicy để cameraserver có thể truy cập vào camera UVC.

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

Đây là ví dụ về external_camera_config.xml (đã bỏ qua dòng bản quyền).

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

Tùy chỉnh

Bạn có thể nâng cao camera Android thông qua các tùy chọn tùy chỉnh chung hoặc tối ưu hóa dành riêng cho thiết bị.

Tùy chỉnh chung

Bạn có thể tùy chỉnh nhà cung cấp camera bên ngoài bằng cách sửa đổi tệp external_camera_config.xml . Cụ thể khách hàng có thể tùy chỉnh các thông số sau:

  • Không bao gồm các nút video của camera nội bộ
  • Giới hạn trên của kích thước hình ảnh và tốc độ khung hình được hỗ trợ
  • Số lượng bộ đệm trong chuyến bay (giật và cân bằng bộ nhớ)

Ngoài các tham số này, bạn có thể thêm các tham số của riêng mình hoặc phát triển cấu hình của riêng mình.

Tối ưu hóa dành riêng cho thiết bị

Bạn cũng có thể cải thiện hiệu suất bằng cách thêm các tối ưu hóa dành riêng cho thiết bị.

Sao chép/chia tỷ lệ bộ đệm và giải mã/mã hóa JPEG

Việc triển khai chung sử dụng CPU (libyuv/libjpeg) nhưng bạn có thể thay thế điều này bằng các tối ưu hóa dành riêng cho thiết bị.

Định dạng đầu ra HAL

Việc triển khai chung sử dụng các định dạng đầu ra sau:

  • YUV_420_888 cho bộ đệm IMPLEMENTATION_DEFINED video
  • YUV12 cho tất cả các bộ đệm IMPLEMENTATION_DEFINED khác

Để cải thiện hiệu suất, bạn có thể thay thế các định dạng đầu ra bằng các định dạng hiệu quả dành riêng cho thiết bị. Bạn cũng có thể hỗ trợ các định dạng bổ sung trong quá trình triển khai tùy chỉnh

Thẩm định

Các thiết bị có hỗ trợ camera ngoài phải vượt qua CTS camera . Webcam USB bên ngoài phải luôn được cắm vào thiết bị cụ thể trong toàn bộ quá trình chạy thử, nếu không một số trường hợp thử nghiệm sẽ không thành công.