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

<!-- Copyright 2018 The Android Open Source Project

Được cấp phép theo Giấy phép Apache, Phiên bản 2.0 ("Giấy phép"); bạn không được sử dụng tệp này trừ phi tuân thủ Giấy phép. Bạn có thể lấy bản sao của Giấy phép tại

  http://www.apache.org/licenses/LICENSE-2.0

Trừ phi luật hiện hành yêu cầu hoặc có thoả thuận bằng văn bản, phần mềm được phân phối theo Giấy phép này sẽ được phân phối "THEO NGUYÊN TRẠNG", KHÔNG CÓ BẤT KỲ SỰ ĐẢM BẢO HOẶC ĐIỀU KIỆN NÀO, dù là rõ ràng hay ngụ ý. Hãy xem Giấy phép để biết nội dung cụ thể quy định các quyền và giới hạn theo Giấy phép. -->

Nền tảng Android hỗ trợ việc sử dụng camera USB cắm và chạy (tức là webcam) bằng cách sử dụng Android Camera2 API tiêu chuẩn và giao diện HAL của camera. 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.

Nhờ hỗ trợ webcam, thiết bị có thể được dùng trong các trường hợp sử dụng đơn giản như trò chuyện video và ki-ốt ảnh. Tính năng này không thay thế 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 tốc độ cao và độ phân giải cao, AR cũng như điều khiển ISP/cảm biến/ống kính theo cách 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ó chức năng theo dõi tình trạng sẵn sàng 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 bên thứ ba giao tiếp trực tiếp với thiết bị USB cần có quyền truy cập camera để truy cập vào thiết bị UVC, giống như mọi ứng dụng camera thông thường.

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 chiếu của nhà cung cấp camera ngoài tại ExternalCameraProvider. Các phương thức triển khai phiên và thiết bị camera bên ngoài được đưa vào ExternalCameraDevice và ExternalCameraDeviceSession. Kể từ cấp độ API 28, API ứng dụng Java sẽ 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 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 nhân tương ứng.

+CONFIG_USB_VIDEO_CLASS=y
+CONFIG_MEDIA_USB_SUPPORT=y

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

  • Thêm tệp cấu hình camera ngoài và thư viện camera 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 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>
    
  • Liên kết thực thể trình cung cấp camera AIDL external/0 với hal_camera_service trong tệp sepolicy/service_contexts của thiết bị. Để biết thêm thông tin, hãy xem bài viết SEPolicy cho AIDL HAL.

    android.hardware.camera.provider.ICameraProvider/external/0 u:object_r:hal_camera_service:s0
    
  • (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 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ể 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 camera 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:

  • Không bao gồm các nút video của camera nội bộ
  • Kích thước hình ảnh và giới hạn trên của tốc độ khung hình được hỗ trợ
  • Số lượng vùng đệm đang hoạt động (đánh đổi giữa hiện tượng giật và 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 bạn.

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 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ế 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 bộ đệm video IMPLEMENTATION_DEFINED
  • 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 hiệu quả dành riêng cho thiết bị. Bạn cũng có thể hỗ trợ các định dạng khác trong một phương thức triển khai tuỳ chỉnh

Xác nhận kết quả

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 kiểm thử, nếu không, một số trường hợp kiểm thử sẽ không thành công.