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

Nền tảng Android hỗ trợ việc sử dụng camera USB cắm và chạy (tức là webcam) sử dụng chuẩn API Android Camera2 và camera HAL . Webcam thường hỗ trợ Lớp video qua USB (UVC) trình điều khiển và trên Linux, đây là tiêu chuẩn Video4Linux (V4L) trình điều khiển được dùng để điều khiển camera UVC.

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

Quy trình HAL (Lớp trừu tượng phần cứng) cho máy ảnh USB là một phần của nhà cung cấp máy ảnh bên ngoài theo dõi tình trạng sẵn có của thiết bị USB và liệt kê các thiết bị máy ảnh bên ngoài cho phù hợp. Quy trình này có các quyền và chính sách SE tương tự như quy trình HAL (Lớp trừu tượng phần cứng) cho máy ảnh tích hợp. Các ứng dụng webcam của bên thứ ba có khả năng giao tiếp trực tiếp bằng các thiết bị USB yêu cầu quyền truy cập máy ảnh tương tự để truy cập UVC trên các thiết bị như mọi ứng dụng máy ảnh thông thường.

Ví dụ và nguồn

Để biết thêm thông tin về cách triển khai máy ảnh USB, hãy xem máy ảnh bên ngoài triển khai tham chiếu nhà cung cấp tại ExternalCameraProvider. Các phương pháp triển khai phiên và thiết bị máy ảnh bên ngoài được bao gồm trong ExternalCameraDeviceExternalCameraDeviceSession. Kể từ API cấp 28, API ứng dụng Java bao gồm EXTERNAL phần cứng.

Triển khai

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

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

+CONFIG_USB_VIDEO_CLASS=y
+CONFIG_MEDIA_USB_SUPPORT=y

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

  • Thêm tệp cấu hình máy ảnh bên ngoài và thư viện máy ảnh 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 máy ảnh bên ngoài vào tệp kê khai HAL Treble 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>
    
  • (Không bắt buộc) 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;
    

Dưới đâ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>

Tuỳ chỉnh

Bạn có thể cải thiện camera Android thông qua các tuỳ chọn tuỳ chỉnh chung hoặc tối ưu hoá theo thiết bị cụ thể.

Tuỳ chỉnh chung

Bạn có thể tuỳ chỉnh nhà cung cấp máy ảnh 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ể tuỳ chỉnh các thông số sau:

  • Loại trừ 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ố vùng đệm trong quá trình bay (hiện tượng giật so với đánh đổi bộ nhớ)

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

Tối ưu hoá theo 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 biện pháp tối ưu hoá dành riêng cho thiết bị.

Sao chép/chia tỷ lệ vùng đệm và giải mã/mã hoá JPEG

Các phương pháp triển khai chung sử dụng CPU (libyuv/libjpeg) nhưng bạn có thể thay thế bằng CPU tối ưu hoá theo thiết bị cụ thể.

Định dạng đầu ra HAL

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

  • YUV_420_888 cho vùng đệm IMPLEMENTATION_DEFINED video
  • YUV12 cho tất cả các vùng đệm IMPLEMENTATION_DEFINED khác

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

Xác nhận kết quả

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