ЦЕЛЬ:
Я создаю робота FPV, я хочу управлять им с помощью веб-браузера через локальное соединение Wi-Fi.
Я использую Raspberry Pi 3B + с Raspbian Stretch. Я построил свою собственную шляпу для управления двигателем и регулятора мощности.
После множества исследовательских тестов я решил использовать node.JS в качестве http-сервера и socket.io, чтобы обеспечить двунаправленную связь с моим роботом с малой задержкой. Этот стек обеспечивает задержку около 7 мс.
ПРОБЛЕМА:
Мне нужно передавать в браузер потоковую передачу видео с низкой задержкой с USB-камеры, подключенной к RPI. Моя цель - добиться разрешения не менее 640x480 при 10 кадрах в секунду с задержкой 50 мс или лучше. Я счастлив пожертвовать визуальной федеративностью, чтобы получить более быстрый ответ от моего робота.
Если возможно, я хотел бы использовать поток UDP, чтобы повысить надежность потока.
Если возможно, я хотел бы транслировать видео, которое современные веб-браузеры могут декодировать изначально. Я хотел бы использовать кодек H264 и тег видео HTML5. Я могу вернуться к использованию проигрывателя javascript, если нет другого варианта.
ЧТО Я ПЫТАЛСЯ:
Я провел обширное исследование и перепробовал множество инструментов.
Среди прочего, я попробовал VLC, mjpg streamer, gstreamer и raspivid. Несколько раз я переходил к потоку, который мог просматривать веб-браузер, но в лучшем случае я получал задержку 700 мс при разрешении 320x240. Очень-очень далеко от моей цели.
Сейчас я изучаю решения WebRTC.
ВОПРОС:
Я хотел бы получить предложения по пакетам NODE.JS или другим решениям для предоставления видеопотока UDP H264, который можно декодировать с помощью тега видео HTML5 с целевой задержкой 50 мс.
Спасибо
ОБНОВЛЕНИЕ:
Спасибо за ответы! Я буду продолжать обновлять этот вопрос и опубликую решение, как только оно сработает.
НАЖМИТЕ ИНДИВИДУАЛЬНЫЕ ФРЕЙМЫ
Я попробовал другой подход, протолкнув отдельный кадр jpg размером 200 КБ 640x480 через веб-сокет, и получил задержку около 190 мс. Возможно, я смогу добиться большего, повторно используя объекты, но пока я откладываю эту попытку.
ОБНОВЛЕНИЕ 2:
Изучая WebRTC, я нашел стек, который выглядел достаточно простым. На стороне сервера он использует V4L2 в качестве драйвера, FFMPEG для транскодирования в HTTP-поток MPEG1 с локальной инкапсуляцией TS, node js для преобразования потока в веб-сокет. На стороне клиента есть javascript, который декодирует поток TS MPEG1 и рисует объект холста на странице HTML.
Он обеспечивает разрешение 640x480 при 20 кадрах в секунду с задержкой 240 мс. Достаточно хорошо для MVP, но я буду продолжать работать над этим. Код в ответ.