Как стать автором
Обновить

Комментарии 27

Интересно было бы попробовать встроенную в GStreamer поддержку WebRTC, чтобы избавиться от промежуточного браузера.

Тоже читал про это. Но тут уже вопрос как мне на стороне распберри вытащить стрим. Если в той же ноде - но скорей всего опять будет загрузка процессора. Стоит в листе тудушек в любом случае =)

Правильно я понимаю, что вы изначально использовали непроизводительное решение и вместо того, чтобы разобраться, почему оно непроизводительное и поискать другие решения, запустили браузер?

Чроме же не на волшебстве работает, и раз его движок показывает приемлемую производительность, то это не проблема RPi, а проблема имплементации, которую вы использовали. А раз это проблема aioRTC, значит можно просто другое средство использовать.

Когда каждый текстовый редактор тащит за собой браузер, к этому все привыкли.
Но тащить целый браузер в эмбед, когда вам надо только стрим сделать, это какая-то дичь.

Для пишек можно либо просто μStreamer использовать (если webrtc не обязателен), либо Janus попробовать.

Для ноды есть библиотека wrtc которая позволяет осуществлять соединение. Которая как раз и грузила процессор. Я все расписывал в прошлой статье

А зачем именно WebRTC?
Можно ведь просто чутьли не напрямую слать MJpeg поток с камеры в браузер (Большинство китайских камер вообще ничего кроме mjpeg не могут даже через USB). В таком случае даже ничего перекодировать не нужно - достаточно сказать камере какое разрешение и FPS вам надо - она сама переключить поток на нужный. Остаётся только эти байты переслать в браузер клиенту "как есть".

Лично я давно использую связку из Python3 + Linuxpy + Flask
Linuxpy - только для удобства работы с камерой. По факту можно вообще напрямую с ней общаться через v4l2
Flask - в качестве веб-сервера. Можно и FastAPI или любой другой сервер использовать. Смотря какой доп. функционал вам нужен прямо в браузере.

Заметка: Orange PI Zero 2 даже по WiFi даёт задержку 200-500мс с таким сервером, нагружая процессор менее чем на 10%.

Интересно, у меня mjpeg был сильно тормозной, особенно по вебу (как грузил проц уже не помню). С другой стороны в интернетах пишут что наименьшая задержка у webrtc

Вы, возможно, пытались как-то обрабатывать картинку (менять разрешение, кол-во кадров, цветовой формат и т.п.), отсюда и куча тормозов (процессор с подобным справляется весьма неважно).

В моём-же случае - мы берём готовые байты (jpeg) и отсылаем их сразу клиенту в браузер. Без обработки, без вмешательства, лиш добавляется немного нагрузки в виде работы с HTTP протоколом.

https://pypi.org/project/linuxpy/ - Пробуйте. Там прямо в описании есть готовый пример с Flask.

А вот так задаются разрешение, формат и фреймрейт
from linuxpy.video.device import Device as VideoDev, BufferType

cam = VideoDev.from_id(1)  # /dev/video1
cam.open()
cam.set_format(BufferType.VIDEO_CAPTURE, 1920, 1080, "MJPG")  # MJPG or YUYV
cam.set_fps(BufferType.VIDEO_CAPTURE, 30)  # 30 FPS

Интересно попробывать еще раз =) С картинкой ничего не делал (пока что)

На пи можно сразу стрим мпег сделать и его слать по вебу (но интересно задержка какая)

Тоже сталкивался с подобными задачами, в итоге сделал решение на базе rtsp через mediamtx. Только им удалось на первом zero w добиться хорошего fps при 720p. Нагрузка при этом была в районе 60%. Работало стабильно для использования в качестве круглосуточной камеры наблюдения. WebRTC, кстати тоже поддерживается mediamtx.

Слышал про такую штуку, не пробывал. Не знаю как с ним можно еще параллельно получить доступ к видео стриму (локально создавать коннекшн еще один?), например для передачи в Tensorflow.

Никаких проблем с локальной доступностью быть не должно. В примере, что я смотрел, для теста используют команду ffplay rtsp://raspberrypi.local:8554/cam .

Другой вопрос, насколько zero хватит еще и на TF. Я лично выносил обработку потока с камеры zero нейронкой (кстати с usb ускорителем coral) на внешнюю rpi4.

Там на самом деле разницы никакой не будет. Энкодинг выполняют аппаратные блоки - процу остаётся только шифрование для webrtc поверх замутить и всё.

Так что в теории, mjpeg даст больше трафика и большую нагрузку по шифрованию

В моем случае RPi3 без проблем справлялась с отправкой нескольких фрэймов в секунду (без шифрования). И главное, не нужно было городить весь этот огород с WEBRTC, который (к тому моменту) не так давно появился на горизонте.

Даже zero2w успевает кодировать 720p@60

zero2w имеет более мощный CPU чем RPi3, если я не ошибаюсь. да и не было zero в 16-ом году.

Откуда информация? В WebRTC используется VP8, и библиотека libvpx которая полностью софтварная. Блоков доя аппаратного енкодинга vp8 на rpi нет

WebRTC может использовать любой кодек о котором договорятся пиры.

Вы ошибаетесь, там VP8 прибит гвоздями, разве что только голос может разными кодеками кодироваться, а для видео там выбора нет.

Ну-да ну-да, и то, что я сам запускал webrtc с h264 мне приснилось. И вот этот примера не существует https://webrtc.github.io/samples/src/content/peerconnection/change-codecs/

Чёт по ощущениям - слишком большая нагрузка.

Я тоже делал что-то подобное на .NET - взял довольно известную либу и немного соптимизоровал.

https://github.com/buldo/RtpToWebRtcRestreamer

Правда по дороге выкинуд часть кода со stun и тп и моё поделие работает только если сервер и клиент в одной сети :)

Последнее - самое как раз важное для меня =) Ибо когда мджпег не через локалку, там уже достаточно большая задержка.

Самое продуктивное здесь, что пробывал и гуглил - это WebRTC.

Так и у меня в примере не mjpeg, a h264.

Проблемы с локалкой обычно решаются zerotier.

Вообще, если нужно быстро и без браузера, то gstreamer на клиенте и сервере. Если нужно ещё быстрее, то здравствуй C++.

Но с другой стороны, камеры и энкодер на raspberry жутко медленные - они дают большую часть задержки

Рекомендую переходить на rk3568 или rk3588, если хотите задержку менее 80-100мс

О про такие даже не знал

я бы заменил nodejs на компилируемый язык типа Go, что позволит еще больше сэкономить ресурсы raspberry pi

node только страницу отдает и порт слушает +-

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории