Используйте устройство в качестве веб-камеры

Для устройств под управлением Android 14-QPR1 или более поздней версии Android поддерживает использование устройства в качестве веб-камеры USB. Устройства Android, поддерживающие эту функцию, рекламируются как устройства UVC , что позволяет широкому кругу USB-хостов с различными операционными системами (например, Linux, macOS, Windows и ChromeOS) использовать камеру устройства в качестве веб-камеры. Служба DeviceAsWebcam поддерживает эту функцию, позволяющую использовать устройство в качестве веб-камеры.

Сервис DeviceAsWebcam

Служба DeviceAsWebcam в AOSP включает действие предварительного просмотра ( DeviceAsWebcamPreview.java ), которое позволяет пользователям кадрировать сцену. Действие предварительного просмотра позволяет пользователю делать следующее:

  • Прежде чем начать потоковую передачу, просмотрите, как будет выглядеть изображение с веб-камеры на хост-компьютере.

  • Настройте изображение с веб-камеры, отправляемое хосту, следующими способами:

    • Выбор камеры для потоковой передачи: передней или задней.
    • Выбор уровня масштабирования с помощью ползунка или кнопок.
    • Коснитесь определенной области предварительного просмотра, чтобы сфокусироваться или снять фокус с этой области.

Действие предварительного просмотра работает с общими функциями специальных возможностей Android, такими как TalkBack , Switch Access и голосовой доступ .

трансляция с веб-камеры передается на хост

Рис. 1. Трансляция с веб-камеры передается на хост с предварительным просмотром, управляющим трансляцией.

Архитектура

Архитектура поддержки использования устройства в качестве веб-камеры показана на рис. 2. Ниже описан поток взаимодействия службы DeviceAsWebcam с остальной частью платформы Android:

  1. Пользователь выбирает опцию веб-камеры USB в приложении «Настройки».
  2. Приложение «Настройки» отправляет вызов связывания на system_server через класс UsbManager сообщая ему, что выбран FUNCTION_UVC .
  3. Системный сервер выполняет следующие действия:
    1. Сообщает HAL USB-гаджета о необходимости получить функцию гаджета UVC через вызов интерфейса HAL setUsbFunctions .
    2. Сообщает HAL USB-гаджета о необходимости настройки драйвера UVC-гаджета с помощью ConfigFs.
  4. Получив обратный вызов от HAL гаджета, system_server отправляет широковещательную рассылку в платформу, которая будет принята службой DeviceAsWebcam .
  5. Драйвер USB-гаджета запускает поток веб-камеры после получения команд конфигурации от хоста через узлы V4L2 в /dev/video* .

устройство в виде архитектуры веб-камеры

Рисунок 2. Архитектура DeviceAsWebcam.

Выполнение

В этом разделе описывается поддержка использования устройства Android в качестве веб-камеры.

Поддержка ядра

Для Android 14 или более поздней версии Generic Kernel Image (GKI) по умолчанию включает драйвер гаджета UVC (подробности см. в патче AOSP ).

Поддержка UVC в гаджете HAL

Начиная с Android 14, функция UVC включена в HAL-интерфейс GadgetFunction.aidl . Для гаджета HAL гаджет UVC монтируется в ConfigFS так же, как и другие функции ConfigFS, такие как MTP или ADB.

Чтобы реализовать гаджет 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
       ...
   }
   ...
}

Когда устройство действует как веб-камера, убедитесь, что HAL USB-устройства объявляет правильные комбинации VID/PID.

Поскольку вся логика UVC находится либо в init поставщика, либо в службе DeviceAsWebcam , в HAL гаджета не требуется никакой конкретной логики UVC, кроме символической связи функции UVC с ConfigFS.

Дополнительные рекомендации по реализации см. в следующем примере кода в AOSP:

Настройте ConfigFS с конфигурациями UVC.

Чтобы сообщить драйверу гаджета UVC, какие форматы, размеры и частота кадров поддерживаются веб-камерой Android, настройте ConfigFS с конфигурациями UVC. Дополнительные сведения см. в исходной документации Linux по гаджету ConfigFS UVC ABI .

Ниже приведен пример того, как поставщик init может настроить драйвер гаджета 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 для рекламы потока MJPEG 1080p со скоростью 30 кадров в секунду. Эти возможности передаются USB-хосту, когда он запрашивает поддерживаемые разрешения и частоту кадров.

Ниже приведены общие рекомендации по выбору конфигураций, рекламируемых веб-камерой:

  • Служба DeviceAsWebcam поддерживает два формата потока: MJPEG и несжатый YUYV.
  • USB 2.0 поддерживает передачу данных со скоростью 480 Мбит/с (60 Мбит/с). Это означает, что при 30 кадрах в секунду максимальный размер каждого кадра должен составлять 2 МБ; и при 60 кадрах в секунду максимальный размер 1 МБ.
    • Несжатые потоки (YUYV): при 30 кадрах в секунду максимальный поддерживаемый размер кадра составляет 720p, поскольку YUYV составляет 2 байта на пиксель.
    • Сжатые потоки MJPEG: при коэффициенте сжатия 1:10 от YUV USB 2.0 может поддерживать 4K (1,18 МБ на кадр).
  • Основные устройства передней и задней камеры должны поддерживать все рекламируемые размеры кадров. Это связано с тем, что пользователь может переключаться между идентификаторами камер с помощью пользовательского интерфейса предварительного просмотра. Для потоков MJPEG мы рекомендуем поставщикам рекламировать размеры кадров 480p (640 x 480), 720p (1280 x 820) и 1080p (1920 x 1080), поскольку именно эти размеры обычно используются хост-приложениями.
  • Основные устройства передней и задней камеры должны поддерживать все заявленные частоты кадров. Мы настоятельно рекомендуем поставщикам поддерживать частоту 30 кадров в секунду.

Пример добавления конфигураций потока веб-камеры (ConfigFS) см. в разделе «Образец исправления AOSP» .

Включить веб-камеру в сборке

Чтобы включить службу DeviceAsWebcam , необходимо установить для системного свойства ro.usb.uvc.enabled значение true в файле device.mk .

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

Когда это системное свойство включено, параметр «Веб-камера» появляется в приложении «Настройки» в разделе «Настройки USB», как показано на рисунке 3. Когда этот параметр выбран, устройство Android отображается на хост-устройстве как веб-камера USB.

Рисунок 3. Настройки USB в приложении «Настройки».

Вы также можете настроить устройство на функцию веб-камеры USB через ADB с помощью этой команды:

adb shell svc usb setFunctions uvc

Учитывайте проблемы с питанием и температурой

Работа веб-камеры означает, что камера устройства может быть включена несколько часов в день, поэтому мы рекомендуем принять меры, чтобы энергопотребление и температура устройства оставались в определенных пределах. Ниже приведены рекомендуемые решения для ограничения энергопотребления:

  • Для повышения производительности HAL камеры включите STREAM_USE_CASE_VIDEO_CALL в службе DeviceAsWebcam .
  • Если питание вызывает беспокойство даже при включенном STREAM_USE_CASE_VIDEO_CALL , служба DeviceAsWebcam предоставляет возможность дополнительно снизить энергопотребление за счет использования физических потоков. Вы можете использовать наложения ресурсов времени выполнения (RRO), чтобы указать, какую физическую камеру использовать. Физические потоки значительно снижают качество видео и приводят к запутанному пользовательскому интерфейсу, поэтому используйте это решение только в крайнем случае. Оптимизация STREAM_USE_CASE_VIDEO_CALL является предпочтительным решением проблем с питанием. Дополнительную информацию о RRO, поддерживаемых сервисом DeviceAsWebcam , см. в readme.md .

    Ниже приведен пример настройки RRO для использования идентификатора физической камеры 3 вместо идентификатора логической камеры 0. Пример в AOSP см. в разделе DeviceAsWebcamRaven .

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

Проверка

Чтобы протестировать реализацию службы DeviceAsWebcam на вашем устройстве, используйте следующие тесты:

  • Веб-камера для проверки CTS: проверьте, поддерживаются ли устройством форматы, размеры и частота кадров.
  • Ручные тесты: проверьте, что функция веб-камеры работает с различными хост-приложениями в различных хост-операционных системах.

Известные проблемы

Ниже приведены известные проблемы службы DeviceAsWebcam :