Đượ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 các quyền và giới hạn cụ thể được quy định trong Giấy phép. -->
Nền tảng Android hỗ trợ việc sử dụng camera USB cắm là chạy (tức là webcam) bằng Android Camera2 API tiêu chuẩn và giao diện HAL 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.
Với khả năng hỗ trợ webcam, bạn có thể dùng thiết bị 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 hiệu suất cao liên quan đến độ phân giải cao và truyền phát trực tiếp tốc độ cao, thực tế tăng cường và chế độ đ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 trình cung cấp camera bên ngoài, lắng nghe trạng thái sẵn có của thiết bị USB và liệt kê các thiết bị camera 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 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 cần có cùng quyền truy cập vào máy ảnh để truy cập vào các thiết bị UVC như với 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 camera USB, hãy xem cách triển khai tham chiếu trình cung cấp camera bên ngoài tại ExternalCameraProvider
.
Các chế độ triển khai phiên và thiết bị camera bên ngoài có trong ExternalCameraDevice
và ExternalCameraDeviceSession
.
Kể từ API cấp 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 chế độ 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
tương ứng của nhân.
+CONFIG_USB_VIDEO_CLASS=y
+CONFIG_MEDIA_USB_SUPPORT=y
Để bật trình cung cấp camera 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 camera bên ngoài và phần phụ thuộc trì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;
Sau đây là một ví dụ về external_camera_config.xml
(không 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 chế độ 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 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ể tuỳ chỉnh các tham số sau:
- Loại trừ các nút video của camera trong nhà
- Giới hạn trên về kích thước hình ảnh và tốc độ khung hình được hỗ trợ
- Số lượng vùng đệm trong chuyến bay (đánh đổi giữa độ giật và bộ nhớ)
Ngoài các thông số này, bạn có thể thêm thông 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ị cụ thể
Bạn cũng có thể cải thiện hiệu suất bằng cách thêm các chế độ 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 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 hoạt động 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 các vùng đệmIMPLEMENTATION_DEFINED
của videoYUV12
cho tất cả các vùng đệmIMPLEMENTATION_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 một chế độ triển khai tuỳ chỉnh
Xác nhận kết quả
Các thiết bị có hỗ trợ camera bên ngoài phải vượt qua CTS camera. 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.