Android 플랫폼은 표준 Android Camera2 API 및 카메라 HAL 인터페이스를 사용하여 플러그 앤 플레이 USB 카메라(웹캠)의 사용을 지원합니다. 일반적으로 웹캠은 USB 비디오 클래스(UVC) 드라이버를 지원하고, Linux에서는 표준 Video4Linux(V4L) 드라이버를 사용하여 UVC 카메라를 제어합니다.
웹캠이 지원되므로 영상 채팅, 사진 키오스크 등의 단순한 사용 사례에 기기를 사용할 수 있습니다. 이 기능은 Android 휴대전화의 일반적인 내장 카메라 HAL을 대체하지 않으며 고해상도 및 고속 스트리밍, AR, 수동 ISP/센서/렌즈 제어를 수반하는 성능 집약적인 복잡한 작업을 지원하도록 설계되지 않았습니다.
USB 카메라 HAL 프로세스는 USB 기기의 사용 가능 여부를 확인하고 그에 따라 외장 카메라 기기를 나열하는 외장 카메라 제공업체의 일부입니다. 프로세스에는 내장 카메라 HAL 프로세스와 유사한 권한과 SE 정책이 있습니다. USB 기기와 직접 통신하는 제3자 웹캠 앱은 UVC 기기에 액세스할 때 일반 카메라 앱을 사용하는 경우와 동일한 카메라 권한이 필요합니다.
예시 및 소스
USB 카메라 구현 방법에 관한 자세한 내용은 ExternalCameraProvider
에서 외장 카메라 제공업체 참조 구현을 참고하세요.
외장 카메라 기기 및 세션 구현은 ExternalCameraDevice
및 ExternalCameraDeviceSession
에 포함되어 있습니다.
API 수준 28부터 자바 클라이언트 API에는 EXTERNAL
하드웨어 수준이 포함되어 있습니다.
구현
구현은 android.hardware.usb.host
시스템 기능을 지원해야 합니다.
UVC 기기에 관한 커널 지원도 사용 설정해야 합니다. 각 커널 defconfig
파일에 다음을 추가하여 이를 사용 설정할 수 있습니다.
+CONFIG_USB_VIDEO_CLASS=y
+CONFIG_MEDIA_USB_SUPPORT=y
각 기기 빌드에서 외장 카메라 제공업체를 사용 설정하여 필요한 SELinux 권한, 외장 카메라 구성 및 외장 카메라 제공업체 종속 항목을 추가하려면 다음 단계를 완료하세요.
외장 카메라 구성 파일과 외장 카메라 라이브러리를
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
외장 카메라 제공업체 이름을 기기 Treble HAL 매니페스트에 추가합니다.
<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>
(선택사항) 기기가 Treble 패스스루 모드로 실행되는 경우
sepolicy
를 업데이트하여cameraserver
가 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;
다음은 external_camera_config.xml
의 예입니다(저작권 행 생략).
<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>
맞춤설정
일반 맞춤설정 옵션 또는 기기별 최적화를 통해 Android 카메라를 개선할 수 있습니다.
일반 맞춤설정
external_camera_config.xml
파일을 수정하여 외장 카메라 제공업체를 맞춤설정할 수 있습니다. 특히 클라이언트는 다음 매개변수를 맞춤설정할 수 있습니다.
- 내장 카메라의 동영상 노드 제외
- 지원되는 이미지 크기 및 프레임 속도 상한
- 전송 중인 버퍼 수(버벅거림과 메모리의 상충 관계)
이러한 매개변수 외에 자체 매개변수를 직접 추가하거나 자체 구성을 개발할 수 있습니다.
기기별 최적화
기기별 최적화를 추가하여 성능을 개선할 수도 있습니다.
버퍼 복사/크기 조절 및 JPEG 디코딩/인코딩
일반 구현은 CPU를 사용하지만(libyuv/libjpeg), 이를 기기별 최적화로 대체할 수 있습니다.
HAL 출력 형식
일반적인 구현은 다음과 같은 출력 형식을 사용합니다.
- 동영상
IMPLEMENTATION_DEFINED
버퍼용YUV_420_888
- 기타 모든
IMPLEMENTATION_DEFINED
버퍼용YUV12
성능을 개선하기 위해 출력 형식을 기기별로 효율적인 형식으로 대체할 수 있습니다. 맞춤 구현을 통해 추가 형식을 지원할 수도 있습니다.
유효성 검사
외장 카메라 지원 기기는 카메라 CTS를 전달해야 합니다. 외장 USB 웹캠은 전체 테스트 실행 기간 동안 특정 기기에 연결되어 있어야 하며, 그렇지 않으면 일부 테스트 사례가 실패합니다.