#linux #android-emulator #android-camera #v4l2loopback #obs
#linux #android-эмулятор #android-камера #v4l2loopback #obs
Вопрос:
Я хочу передать статическое изображение в эмулятор Android Studio. Для этого я создал виртуальную камеру, используя v4l2loopback v.12.5 в linux ubuntu 20.04. Виртуальная камера создается в /dev/video2. Я могу транслировать туда, используя obs и плагин, ffmpeg или gstreamer, но у меня разные проблемы с каждым из них. Мне все равно, какое программное обеспечение работает… Я всегда использую изображение с разрешением 1920×1080 для проверки этого.
OBS: Я установил плагин obs, следуя этому руководству здесь. В нем объясняется, как установить v4l2loopback и добавить плагин в obs. Плагин называется obs-v4l2sink. Я запускаю v4l2loopback с помощью этой команды:
sudo modprobe v4l2loopback exclusive_caps=1 video_nr=2 card_label=virtualCam
и затем:
v4l2loopback-ctl set-caps "video/x-raw, format=NV12, width=1920, height=1080" "/dev/video2"
Затем я запускаю Obs с базовым canvas 1920×1080 и тоже выводю 1920×1080. В плагине я выбираю NV12 в качестве видеоформата и /dev/video2 в качестве устройства V4L2. Изображение успешно отправлено на эмулятор, но разрешение неверное. Используя ffplay, я получаю это сообщение:
«Ввод # 0, video4linux2, v4l2, из ‘/ dev / video2’: B sq = 0B f = 0/0 Длительность: N / A, начало: 1650.347834, битрейт: 27648 кб / с Поток # 0: 0: Видео: rawvideo (NV12 / 0x3231564E), nv12, 320×240, 27648 кб/ с, 30 кадров в секунду, 30 тбит/с, 1000 К тбит /с, 1000 К тбит / с»
Кажется, что разрешение уменьшено до 320×240, и я понятия не имею, почему.
ffmpeg: я могу передавать потоковую передачу в / dev/ video2 с помощью ffmpeg, используя эту команду:
ffmpeg -re loop 1 -i licensePlate.png -f v4l2 /dev/video2
Но я получаю только неправильные пиксели в ffplay, которые выводят это:
[video4linux2, v4l2 @ 0x7fb494000bc0] Извлеченный из очереди буфер v4l2 содержит 118784 байта, но ожидалось 115200. Флаги: 0x00000001.
Gstreamer: Gstreamer работает только в том случае, если я не использую следующую команду после modprobe (если я использую ее, конвейер блокируется для Gstreamer):
v4l2loopback-ctl set-caps "video/x-raw, format=NV12, width=1920, height=1080" "/dev/video2"
Вместо этого я вызываю эту команду:
gst-launch-1.0 -v multifilesrc location=licensePlate2.png loop=1 caps="image/png,framerate=10/1" ! pngdec ! videoscale ! videoconvert ! "video/x-raw,format=NV12,width=1920,height=1080" ! v4l2sink device=/-dev/video2
Используя ffplay, я вижу желаемое изображение в формате 1920×1080, и все кажется прекрасным, но в эмуляторе Android studio я получаю только странный зеленый экран. Я уже получал этот зеленый экран раньше, и я думаю, что это как-то связано с неправильным разрешением. Я действительно не знаю, что здесь не так. Эмулятор показывает эти журналы много раз:
emulator: ERROR: camera_device_start_capturing: Dimensions 0x0 are wrong for pixel format NV12 emulator: ERROR: _camera_client_start: Cannot start camera '/dev/video2' for NV12[0x0]: Inappropriate ioctl for device
avd, который я использую, — это Pixel2 1920×1080 Android 11 x86 64, и я запускаю его с помощью этой команды:
./emulator -avd Pixel264 -camera-back webcam1 -no-snapshot
Pixel264 is my avd and webcam1 is the virtual webcam, that is linked to /dev/video2
Комментарии:
1. зачем вам нужно звонить
v4l2loopback-ctl set-caps
? я не вижу никакой особой необходимости делать это в вашем случае.2. До того, как я использовал эту команду, все, что я когда-либо видел, были зеленые экраны. Я думаю, что эти зеленые экраны отображаются из-за проблем с разрешением. Как только я настроил разрешение на hd везде, obs начал работать.
Ответ №1:
Я только что попробовал это с помощью Android Studio Emulator API 28 (Google X86_ARM), и это работает. Похоже, что это связано с архитектурой процессора эмулятора, и x86 64 не работает. Мне нужен был arm, и, к счастью, Google добавил перевод Arm к изображению в Api 28.
Кажется, что работают только изображения с разрешением 1920×1080, но, возможно, это связано только с соотношением.
По какой-то причине Obs сейчас не работает, но эта команда работает отлично: ffmpeg -loop 1 -re -i licensePlate2.png -f v4l2 -vcodec rawvideo -pixfmt nv12 -vf transpose=4 /dev / video2
Комментарии:
1. здорово, что вы нашли решение. как только у вас будет достаточно очков, рассмотрите возможность принятия вашего собственного ответа, чтобы вопрос был правильно помечен как решенный