기기를 웹캠으로 사용

Android 14-QPR1 이상을 실행하는 기기의 경우 Android는 USB 웹캠으로 연결할 수 있습니다. 이 기능을 지원하는 Android 기기는 UVC 기기로 사용할 수 있으며, 이 기기는 다양한 USB 포트와 연결된 운영체제 (예: Linux, macOS, Windows, ChromeOS)는 기기의 카메라를 웹캠으로 사용하는 것입니다. DeviceAsWebcam 서비스 기기를 웹캠으로 사용하기 위해 이 기능을 지원합니다.

DeviceAsWebcam 서비스

AOSP의 DeviceAsWebcam 서비스에는 미리보기 활동이 포함되어 있습니다. (DeviceAsWebcamPreview.java) - 사용자가 장면을 프레임할 수 있습니다. 미리보기 활동을 통해 사용자는 다음 작업을 할 수 있습니다.

  • 스트리밍하기 전에 호스트 시스템에서 웹캠 피드가 어떻게 표시되는지 미리보기 시작됩니다

  • 다음 방법으로 호스트에 전송되는 웹캠 피드를 맞춤설정합니다.

    • 스트리밍할 카메라 선택, 전면 또는 후면
    • 슬라이더 또는 버튼을 사용하여 확대/축소 수준 선택
    • 미리보기의 특정 영역을 탭하여 초점 또는 초점 삭제 단일 리전의

미리보기 활동은 Android의 일반적인 접근성 기능(예: TalkBack, 스위치 제어, 음성 액세스.

호스트로 스트리밍되는 웹캠 피드

그림 1. 호스트로 스트리밍되는 웹캠 피드와 함께 미리보기를 제어하는 있습니다.

아키텍처

기기를 웹캠으로 사용하는 것을 지원하는 아키텍처는 그림 2. 다음은 DeviceAsWebcam의 상호작용 흐름을 설명합니다. 서비스를 확장할 수 있습니다.

  1. 사용자가 설정 앱에서 USB 웹캠 옵션을 선택합니다.
  2. 설정 앱은 다음을 통해 system_server에 바인더 호출을 전송합니다. UsbManager 클래스로 FUNCTION_UVC가 선택되었음을 알립니다.
  3. 시스템 서버는 다음 작업을 실행합니다. <ph type="x-smartling-placeholder">
      </ph>
    1. USB 가젯 HAL에 setUsbFunctions HAL 인터페이스 호출
    2. 다음을 사용하여 UVC 가젯 드라이버를 구성하도록 USB 가젯 HAL에 알립니다. ConfigF
  4. 가젯 HAL에서 콜백을 수신하면 system_serverDeviceAsWebcam 서비스에서 선택할 수 있도록 프레임워크에 브로드캐스트합니다.
  5. USB 가젯 드라이버는 구성을 수신하자마자 웹캠 스트림을 시작합니다. /dev/video*의 V4L2 노드를 통해 호스트의 명령어를 실행합니다.

장치를 웹캠 아키텍처로

그림 2. DeviceAsWebcam 아키텍처

구현

이 섹션에서는 Android 기기를 웹캠으로 사용하도록 지원하는 방법을 설명합니다.

커널 지원

Android 14 이상에서는 GKI (일반 커널 이미지)를 통해 UVC 가젯이 사용 설정됩니다. 드라이버를 기본으로 제공합니다 (AOSP 패치의 세부정보 참고).

가젯 HAL에서 UVC 지원

Android 14부터 UVC 기능이 GadgetFunction.aidl HAL 인터페이스. 가젯 HAL의 경우 UVC는 기타 ConfigFS 함수와 같은 방식으로 ConfigFS에 마운트됩니다. ADB 또는 MTP와 같은 방식으로 작동합니다

가젯 HAL을 구현하려면 다음 위치에 UVC 함수를 마운트하도록 수정합니다. ConfigFS에 추가되었습니다. 다음은 가젯 HAL 구현의 스니펫 예시입니다. UVC 함수:

UsbGadget::setCurrentUsbFunctions(long functions) {
   ...
   // Existing functions
   if ((functions & GadgetFunction::MTP) != 0) {
       ...
       linkFunction("ffs.mtp"); // Mount to ConfigFS
       ...
   }
   ...
   // UVC function follows the same pattern!
   if ((functions & GadgetFunction::UVC) != 0) {
       ...
       linkFunction("uvc.0"); // Mount to ConfigFS
       ...
   }
   ...
}

기기가 웹캠으로 작동하는 경우 USB 가젯 HAL이 광고 중인지 확인 적절한 VID/PID 조합을 사용해야 합니다.

모든 UVC 로직이 공급업체 초기화 또는 DeviceAsWebcam에 있기 때문입니다. 서비스에 심볼릭 링크로 연결하는 것 외에 UVC 관련 로직이 없음 ConfigFS는 가젯 HAL에 필요합니다.

구현에 관한 추가 안내는 AOSP의 다음 샘플 코드를 참고하세요.

UVC 구성으로 ConfigFS 설정

UVC 가젯 드라이버에 형식, 크기 및 프레임 속도가 지원하는 경우 UVC 구성으로 ConfigFS를 설정합니다. 대상 자세한 내용은 ConfigFS UVC의 업스트림 Linux 문서를 참조하세요. 가젯 ABI

다음은 공급업체 초기화가 UVC 가젯 드라이버를 설정하는 방법의 예입니다. (AOSP의 코드 스니펫):

# uvc function
   mkdir /configfs_path/functions/uvc.0
   write /configfs_path/functions/uvc.0/function_name "Android Webcam"
   write /configfs_path/functions/uvc.0/streaming_maxpacket 3072
   # setup control params
   mkdir /configfs_path/functions/uvc.0/control/header/h
   symlink /configfs_path/functions/uvc.0/control/header/h \
                /configfs_path/functions/uvc.0/control/class/fs/h
   symlink /configfs_path/functions/uvc.0/control/header/h \
                /configfs_path/functions/uvc.0/control/class/ss/h
   # advertise 1080p resolution for webcam encoded as mjpeg
   mkdir /configfs_path/functions/uvc.0/streaming/mjpeg/m/1080p
   write /configfs_path/functions/uvc.0/streaming/mjpeg/m/1080p/wHeight 1080
   write /configfs_path/functions/uvc.0/streaming/mjpeg/m/1080p/wWidth 1920
   write /configfs_path/functions/uvc.0/streaming/mjpeg/m/1080p/dwMaxVideoFrameBufferSize 4147200
   # advertise 30 fps support for 1080p.
   write /configfs_path/functions/uvc.0/streaming/mjpeg/m/1080p/dwDefaultFrameInterval 333333
   write /configfs_path/functions/uvc.0/streaming/mjpeg/m/1080p/dwFrameInterval "333333"
   # setup streaming params
   mkdir /configfs_path/functions/uvc.0/streaming/header/h
   symlink /configfs_path/functions/uvc.0/streaming/mjpeg/m \
                /configfs_path/functions/uvc.0/streaming/header/h/m
   symlink /configfs_path/functions/uvc.0/streaming/header/h \
                /configfs_path/functions/uvc.0/streaming/class/fs/h
   symlink /configfs_path/functions/uvc.0/streaming/header/h \
                /configfs_path/functions/uvc.0/streaming/class/hs/h
   symlink /configfs_path/functions/uvc.0/streaming/header/h \
                /config/usb_gadget/g1/functions/uvc.0/streaming/class/ss/h
   # ...

이 스니펫은 UVC 가젯 드라이버를 설정하여 30fps 이러한 기능은 다음을 쿼리할 때 USB 호스트에 전달됩니다. 몇 가지 옵션이 있습니다.

다음은 웹캠 구성 선택에 대한 일반적인 가이드라인입니다. 광고:

  • DeviceAsWebcam 서비스에서 지원하는 두 가지 스트림 형식은 MJPEG 및 압축되지 않은 YUYV입니다.
  • USB 2.0은 데이터 전송 480Mbps (60MBps)를 지원합니다. 이 즉, 30fps에서 각 프레임의 최대 크기가 2MB여야 합니다. 60fps에서는 최대 크기가 1MB입니다.
    • 비압축 스트림 (YUYV): 30fps에서 지원되는 최대 프레임 YUYV는 픽셀당 2바이트이므로 크기는 720p입니다.
    • 압축된 MJPEG 스트림: YUV의 압축 비율이 1:10이라고 가정할 때 USB 2.0은 4K (프레임당 1.18MB)를 지원합니다.
  • 기본 전면 및 후면 카메라 기기는 있습니다. 이는 사용자가 미리 볼 수 있습니다. MJPEG 스트림의 경우 공급업체는 480p (640x280) 및 480), 720p (1280 x 820) 및 1080p (1920 x 1080) 프레임 크기가 지원되므로 크기가 매우 큽니다.
  • 기본 전면 및 후면 카메라 기기는 있습니다. 공급업체에서는 30fps를 지원하는 것이 좋습니다.

웹캠 스트림 구성 (ConfigFS)을 추가하는 예는 다음을 참조하세요. AOSP 샘플 패치

빌드에서 웹캠 사용 설정

DeviceAsWebcam 서비스를 사용 설정하려면 ro.usb.uvc.enabled를 설정해야 합니다. 시스템 속성을 device.mk 파일의 true로 설정합니다.

# Enable UVC support
PRODUCT_VENDOR_PROPERTIES += \
    ro.usb.uvc.enabled=true

이 시스템 속성을 사용하도록 설정하면 웹캠 옵션이 설정 앱을 엽니다. 옵션이 선택하면 Android 기기가 호스트 기기의 USB 웹캠으로 표시됩니다.

그림 3. 설정 앱의 USB 환경설정

다음을 사용하여 ADB를 통해 기기를 USB 웹캠 기능으로 설정할 수도 있습니다. 명령어:

adb shell svc usb setFunctions uvc

전력 및 열 관련 우려사항 고려

웹캠 작동은 기기의 카메라가 여러 기기에서 켜져 있을 수 있음을 의미합니다. 전원 공급 장치가 제대로 작동하지 않도록 기기의 온도가 특정 한도를 넘지 않아야 합니다. 이 다음은 전력 소비를 한도 아래로 유지하기 위한 권장 솔루션입니다.

  • 카메라 HAL의 전력 성능을 개선하려면 DeviceAsWebcam 서비스의 STREAM_USE_CASE_VIDEO_CALL
  • STREAM_USE_CASE_VIDEO_CALL를 사용 설정해도 전력이 우려된다면 DeviceAsWebcam 서비스는 전력을 더 줄이는 옵션을 제공합니다. 물리적 스트림을 통해 소비하는 방식, 이때 런타임 리소스 오버레이 (RRO)를 사용하여 사용합니다 물리적 스트림은 동영상 품질을 크게 떨어뜨리고 혼동을 줄 수 있으므로 이 솔루션은 최후의 수단으로만 사용하세요. 최적화 중 STREAM_USE_CASE_VIDEO_CALL는 전력 공급에 선호되는 솔루션입니다. 있습니다 DeviceAsWebcam에서 지원하는 RRO에 관한 자세한 내용 서비스에 대한 자세한 내용은 readme.md를 참조하세요.

    다음은 물리적 카메라 ID 3을 사용하기 위한 RRO 설정의 예입니다. 0으로 설정합니다. AOSP의 예는 다음을 참고하세요. DeviceAsWebcamRaven

    // For logical camera id 0 - use physical camera id 3
    {"0": {"3" : "UW"}}
    

인증

기기에서 DeviceAsWebcam 서비스 구현을 테스트하려면 다음을 사용합니다. 다음 테스트를 실행합니다.

  • CTS 인증기 테스트 웹캠: 테스트의 형식, 크기 및 기기에서 지원하는 프레임 속도입니다.
  • 수동 테스트: 웹캠 기능이 다양한 호스트 앱에서 작동하는지 테스트합니다. 다양한 호스트 운영 체제에서 실행될 수 있습니다.

알려진 문제

다음은 DeviceAsWebcam 서비스의 알려진 문제입니다.