Что объединяет удаленного сотрудника, на долю которого выпало много видеозвонков, зарождающуюся звезду YouTube и начинающего стримера? Все они, рано или поздно, осознают неотъемлемую важность повышения качества изображения, которое предоставляется их зрителям. А еще у них наверняка есть какой-нибудь Xiaomi Nano Porridge 10 Pro с довольно неплохой матрицей. И я не исключение, бросив вызов этой проблеме по-программистски и постаравшись обойтись без больших финансовых затрат, решением которой и хочу поделиться с вами. Добро пожаловать под кат!
Дано
Рабочая машина на Linux
Телефон с камерой
USB кабель
TL;DR
Идея проста, мы собираемся пробросить поток с камеры телефона на нашу рабочую лошадку и привязать его к виртуальному девайсу, который мы потом сможем выбирать как камеру в приложениях. Для подключения к телефону я буду использовать adb, для получения потока видео scrcpy, для создания виртуальной камеры в системе v4l2loopback
Установка
ADB
Ubuntu/Debian
sudo apt update
sudo apt -y install android-tools-adb
Arch
pacman -S android-udev
Scrcpy
Ubuntu/Debian
sudo apt install ffmpeg libsdl2-2.0-0 adb wget \\
gcc git pkg-config meson ninja-build libsdl2-dev \\
libavcodec-dev libavdevice-dev libavformat-dev libavutil-dev \\
libswresample-dev libusb-1.0-0 libusb-1.0-0-dev
sudo apt install scrcpy
Arch
pacman -S scrcpy
Возможно, вам понадобится установить/обновить какие-то зависимости. Полную инструкцию можно найти здесь
Установка из репозитория
В том случае, если вы хотите последнюю версию или собранный бинарник оказался с проблемой, которую решили в одном из новых релизов
git clone <https://github.com/Genymobile/scrcpy>
cd scrcpy
./install_release.sh
Сборка вручную
v4l2loopback-utils
Ubuntu/Debian
sudo apt install v4l2loopback-dkms
sudo apt install v4l2loopback-utils
Arch
pacman -S v4l2loopback-dkms
pacman -S v4l2loopback-utils
Подключаем устройство
Включаем на телефоне USB debugging
Подключаем телефон к компьютеру по USB и вводим следующую команду и убеждаемся, что он в нашем поле зрения
adb devices
Если вывод из консоли содержит no permissions
adb devices
List of devices attached
4df15d6e02a55f15 device
???????????? no permissions
То идем сюда
Wifi
Подключаем телефон к той же сети, в которой находится компьютер
Подключаем телефон к компьютеру по USB и вводим
adb tcpip 5555
Отключаем телефон от USB
Узнаем IP адрес нашего телефона. Например, так Settings > About tablet (or About phone) > Status > IP address
Подключаемся к телефону по его IP адресу
adb connect device_ip_address:5555
Убеждаемся, что телефон подключен
adb devices
List of devices attached
device_ip_address:5555 device
Для большей информации можно сюда
Создаем виртуальный девайс
sudo modprobe v4l2loopback devices=1 video_nr=22 exclusive_caps=1 card_label="Virtual Webcam"
Это создаст новый видео девайс /dev/video22
. Вы можете определить номер девайса на ваше усмотрение и вкус.
Смотрим, что наш девайс создался:
v4l2-ctl --list-devices
Магия!
Стартуем scrcpy
. Он подключается к единственному подключенному устройству по умолчанию:
scrcpy -m1920 --v4l2-sink=/dev/video22 --video-source=camera --no-audio
Заходим в любое приложение, позволяющее протестировать камеру, и сидим довольные!
Если выдается следующая ошибка:
[server] ERROR: Encoding error: android.media.MediaCodec$CodecException: start failed
WARN: Device disconnected
[server] ERROR: Exception on thread Thread[video,5,main]
Это значит, что вам надо поставить меньшее разрешение. Сделать это можно напрямую через параметр --camera-size=1920x1080
или используя -m
/--max-size
, например -m1920
, -m1080
Дополнительные настройки
Подключиться к телефону по его серийному номеру
--serial=device_serial
Убрать открывающееся окно с видео
--no-video-playback
Посмотреть доступные камеры:
scrcpy --list-cameras
scrcpy --list-camera-sizes
Указать, с какой камеры будет браться поток:
--camera-id=0
Указать размер выходного потока:
--camera-size=1840x444
-m1920
-m1920
-m1080
Повернуть камеру на определенный угол:
--orientation=90
FPS
--camera-fps=60