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ể tải bản sao của Giấy phép tại

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

Trừ phi được yêu cầu bởi luật hiện hành 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 được phân phối trên CƠ SỞ "NGUYÊN GỐC", MÀ KHÔNG CÓ BẢO ĐẢM HOẶC ĐIỀU KIỆN DƯỚI BẤT KỲ HÌNH THỨC NÀO, dù được diễn đạt rõ ràng hay ngụ ý. Hãy xem Giấy phép để biết các quyền và giới hạn áp dụng cho ngôn ngữ cụ thể theo Giấy phép. -->

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

Với khả năng hỗ trợ webcam, các 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 chụp ảnh. Tính năng này không thay thế các 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 việc truyền phát tốc độ cao và độ phân giải cao, thực tế tăng cường (AR) và điều khiển thủ công ISP/cảm biến/ống kính.

Quá trình HAL camera USB là một phần của nhà cung cấp camera bên ngoài, lắng nghe khả năng sử dụng thiết bị USB và liệt kê các thiết bị camera bên ngoài cho phù hợp. Quá trình này có các quyền và chính sách SE tương tự như quá trình HAL 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 các thiết bị USB yêu cầu các quyền truy cập camera tương tự để truy cập vào các thiết bị UVC như với bất kỳ ứng dụng camera 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 chiếu nhà cung cấp camera bên ngoài tại ExternalCameraProvider. Cách triển khai thiết bị và phiên camera bên ngoài được đưa vào ExternalCameraDeviceExternalCameraDeviceSession. Bắt đầu từ cấp độ API 28, API ứng dụng Java bao gồm cấp EXTERNAL phần cứng.

Triển khai

Cách 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ợ kernel 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 kernel tương ứng.

+CONFIG_USB_VIDEO_CLASS=y
+CONFIG_MEDIA_USB_SUPPORT=y

Để bật nhà cung cấp camera 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 camera bên ngoài và phần phụ thuộc của nhà cung cấp camera bên ngoài), hãy hoàn tất 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 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 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 lựa chọn tuỳ chỉnh chung hoặc các phương pháp tối ưu hoá dành riêng cho thiết bị.

Các lựa chọn 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:

  • 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ố lượng bộ đệm đang hoạt động (đánh đổi giữa độ 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 mình.

Các phương pháp tối ưu hoá 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 phương pháp tối ưu hoá dành riêng cho thiết bị.

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

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

Định dạng đầu ra HAL

Các cách 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 khác trong cách triển khai tuỳ chỉnh

Xác nhận kết quả

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