Máy ảnh USB gắn ngoài

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

Với khả năng hỗ trợ webcam, thiết bị có thể được sử dụng trong các trường hợp sử dụng nhẹ như trò chuyện video và ki-ốt ảnh. Tính năng này không thay thế các HAL máy ảnh 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 hiệu suất cao liên quan đến việc truyền trực tuyến độ phân giải cao và tốc độ cao, AR cũng như kiểm soát ISP/cảm biến/ống kính theo cách thủ công.

Quy trình HAL máy ảnh USB là một phần của trình cung cấp máy ảnh bên ngoài, giúp 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 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 tích hợp sẵn của máy ảnh. 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 cần có các quyền máy ảnh giống như mọi ứng dụng máy ảnh thông thường để truy cập vào thiết bị UVC.

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 cách triển khai tham chiếu trình cung cấp máy ảnh bên ngoài tại ExternalCameraProvider. Các hoạt động triển khai phiên và thiết bị máy ảnh bên ngoài được đưa vào ExternalCameraDeviceExternalCameraDeviceSession. Kể từ API cấp 28, API ứng dụng Java bao gồm cấp độ phần cứng EXTERNAL.

Triển khai

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

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

+CONFIG_USB_VIDEO_CLASS=y
+CONFIG_MEDIA_USB_SUPPORT=y

Để bật trình cung cấp máy ảnh bên ngoài trong bản dựng thiết bị tương ứng, hãy 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 trình cung cấp máy ảnh bên ngoài, hãy hoàn tất 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 tải Treble, hãy cập nhật sepolicy để cameraserver có thể truy cập vào máy ảnh 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 các 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ể nâng cao máy ảnh Android thông qua các tuỳ chọn tuỳ chỉnh chung hoặc các tuỳ chọn tối ưu hoá dành riêng cho thiết bị.

Tuỳ chỉnh chung

Bạn có thể tuỳ chỉnh trì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ể, ứng dụng có thể tuỳ chỉnh các tham số sau:

  • Loại trừ các nút video của camera trong
  • Giới hạn trên về tốc độ khung hình và kích thước hình ảnh được hỗ trợ
  • Số lượng vùng đệm trong chuyến bay (tình trạng giật so với đánh đổi bộ nhớ)

Ngoài các tham số này, bạn có thể thêm 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 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 tính năng tối ưu hoá dành riêng cho thiết bị.

Sao chép/điều chỉnh theo tỷ lệ vùng đệm và giải mã/mã hoá JPEG

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

Định dạng đầu ra HAL

Các phương thức triển khai chung sử dụng các định dạng đầu ra sau:

  • YUV_420_888 cho vùng đệm IMPLEMENTATION_DEFINED của 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 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 tuỳ chỉnh

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 máy ảnh. Bạn phải cắm webcam USB bên ngoài vào thiết bị cụ thể trong toàn bộ quá trình chạy kiểm thử, nếu không một số trường hợp kiểm thử sẽ không thành công.