Пытаетесь эмулировать аппаратную камеру с помощью потока с Raspberry Pi/Picam?

Пытаетесь эмулировать аппаратную камеру с помощью потока с Raspberry Pi/Picam?

У меня есть Raspberry Pi и Pi Cam v2, подключенные к Wi-Fi. Я пытаюсь транслировать поток с камеры на ноутбук по Wi-Fi, а затем сделать так, чтобы поток выглядел так, как будто это аппаратная камера на ноутбуке. Я хочу сделать это, чтобы добавить его в какое-то другое программное обеспечение, которому требуется аппаратная камера (нельзя переписать это программное обеспечение, просто придется обойти это).

Я использую Ubuntu 18.04 на ноутбуке. Согласно моим исследованиям, это должно быть вполне возможно с использованием некоторой комбинации ffmpeg и vfl2loopback. Я начал с установки этой библиотеки для потоковой передачи камеры на веб-сервер:https://github.com/silvanmelchior/RPi_Cam_Web_InterfaceЭто работает, и я могу получить доступ к потоку с камеры в своем браузере по адресуhttp://10.0.0.47/httpЯ настроил его без имени пользователя/пароля для простоты. Я думаю, что порт камеры 80, основываясь на выводе nmap.

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

ffmpeg -re -ihttp://10.0.0.47/html-map 0:v -f v4l2 /dev/video0

(или то же самое с портом 80 вместо /html, не уверен, имеет ли это значение): ffmpeg -re -ihttp://10.0.0.47:80-map 0:v -f v4l2 dev/video0

Сначала это работает, но затем возникает следующая ошибка:

http://10.0.0.47:80: При обработке входных данных обнаружены неверные данные

Погуглив, это может быть связано с неправильным типом потока, выходящего из интерфейса rpi_cam_web, но я не уверен, так ли это, и если да, то как это исправить. Я также исследовал html-код страницы, которая обращается к веб-серверу, и я вижу, что он отправляет серию jpg-файлов, которые постоянно меняются с временными метками в имени файла. Так что, возможно, это проблема, но, опять же, не уверен.

Есть идеи? Помощь была бы очень кстати.

Редактировать: Я попробовал другой метод, который, кажется, немного продвинулся, но все еще сталкиваюсь с проблемами:

(на pi): raspivid -o - -t 0 -n -w 320 -h 240 -fps 30| cvlc -vvv stream:///dev/stdin --sout '#rtp{sdp=rtsp://:8000//:demux=h264

-->это запускает поток, который я могу успешно просмотреть в медиаплеере VLC

(затем на хост-системе): gst-launch-1.0 -v rtspsrc location=rtsp://10.0.0.47:8000/ ! v4l2sink device=/dev/video4

Я пробовал разные устройства, например /dev/video0, /dev/video1 и т. д. Все они выдают сообщение «/dev/videoX» не является выходным устройством», за исключением video4, которое сначала работает, но затем выдает ошибку:

ОШИБКА: из элемента /GstPipeline:pipeline0/GstRTSPSrc:rtspsrc0/GstUDPSrc:udpsrc1: Внутренняя ошибка потока данных. Дополнительная отладочная информация: gstbasesrc.c(3072): gst_base_src_loop (): /GstPipeline:pipeline0/GstRTSPSrc:rtspsrc0/GstUDPSrc:udpsrc1: потоковая передача остановлена, причина не связана (-1) Выполнение завершено после 0:00:00.082360368

Есть идеи, что там может быть не так?

Еще раз спасибо!

Редактировать 2:

Возможно, это заработает с помощью следующей последовательности команд:

(на pi): raspivid -o - -t 0 -n -w 320 -h 240 -fps 30| cvlc -vvv stream:///dev/stdin --sout '#rtp{sdp=rtsp://:8000//):demux=h264

(на хост-компьютере): ffmpeg -f h264 -i tcp://10.0.0.47:8000/ -f v4l2 -pix_fmt yuv420p /dev/video0

Это не выдает никаких ошибок, но я не уверен на 100%, что это работает, потому что я пока не смог загрузить поток в программное обеспечение, в которое я пытаюсь загрузить камеру. Я попробовал протестировать его с помощью этого веб-инструмента:

https://test.webrtc.org/

и инструмент позволяет мне выбрать "Dummy Video Device 0x0000", что, я почти уверен, и есть то, что нужно, но затем он говорит мне "видеоустройство не обнаружено", не может найти ни одной камеры в своем тестировании, а затем то же самое Dummy Video Device не отображается как опция при последующих перезагрузках страницы. Так что я думаю, что что-то не так с тем, как я передаю поток

решение1

На этом сайте показано, как транслировать RPi в OBS: https://www.instructables.com/Webcam-Over-WiFi-for-OBS/

Затем вы можете использовать OBS Virtual Camera для имитации аппаратной камеры.

(Лично я использую OBS Virtual Camera, но не использовал ее с RPi.)

В качестве альтернативы вы можете попробовать это: https://www.tomshardware.com/uk/how-to/use-raspberry-pi-as-pc-webcam

Связанный контент