Работа с видео-потоком, ffmpeg
Здравствуйте.
Прошу помочь с поиском решения или разобраться с его возможными вариантами. Итак, есть некое устройство с камерами, которое подключается (tcp) к backend-серверу (node.js). Устройство может передавать видео-поток (raw h264), выглядит это примерно так: - устройство получило команду от сервера (допустим, "start live stream"); - и шлёт видео-поток с камеры на сервер, в виде сырых данных (hex). Пример: server.on('data', data => { // data - это и есть часть данных видео-потока. }); - далее, сервер обрабатывает полученные данные - парсит, сохраняет во временный массив. (Необходимо для определения, достаточно ли информации пришло, чтобы можно было её как-то дальше обрабатывать/отправлять куда-то ещё, здесь всё согласно специфике прошивки устройства); - Дальше, когда парсер говорит что информации достаточно ( parser.emit('data', streamData) ) - её можно и нужно куда-то отправлять, чтобы её можно было увидеть в браузере (<video>), то есть надо отправить на rtmp, например с помощью ffmpeg. В качестве rtmp сервера использую nginx-rtmp-module. (Запустить ffmpeg из node.js не проблема, и если я буду транслировать на rtmp какой-то видеофайл, что есть на диске - всё будет работать. Но у меня нет никакого файла.) В качестве альтернативного решения, я хотел найти клиент rtmp для node, чтобы подключиться напрямую и отправить данные, но рабочих/документированных модулей не нашёл. Таким образом, хочу разобраться как решить задачу используя ffmpeg. Рассматривал ещё такой вариант, ради тестов: мой парсер сохраняет полученную и обработанную информацию в файл на диске (video.h264), а потом запускается ffmpeg и с этого файла транслирует на rtmp - работает, без ошибок и warning's. Но такой вариант не может быть решением, просто тест. --- Мне нужно с помощью ffmpeg отправить мои собранные livestream-данные ( Buffer.concat([dataChunk_1, dataChunk_N, ]) ) на rtmp. Но что указывать в качестве INPUT для ffmpeg ?) Возможно есть другие идеи/решения ? |
в общем нужен websocket, и потом этот поток можно завернуть в video элемент на стороне клиента...
вот ссылка https://medium.com/canal-tech/how-vi...on-7919739f7e1 Separating video and audio allows to also manage them separately on the server-side. Doing so leads to several advantages as we will see later. This is how it works: после этого идет код-сниппет, тебе сюда надо присылать чанки через вебсокет... здесь товарищ показывает на третьем шаге через python: https://hackernoon.com/build-live-vi...s-82e1bb58949e ссылки по ходу ) нагугливания https://github.com/tahaipek/Nodcam https://github.com/kmoskwiak/node-tcp-streaming-server https://medium.com/@alexcambose/webc...4-64b1b4992db8 https://github.com/fluent-ffmpeg/node-fluent-ffmpeg https://medium.com/@alexanderleon/bu...s-f08a2c412aac |
SuperZen,
в общем нужен websocket - зачем ? Чтобы чанки слать на фронт, а там как в статье, MediaSource'ами воспроизводить ? А как же формат raw h264 ? Его сначала надо перекодировать. FFMPEG нужен в любом случае. Я пробовал немного другой пример, когда чанки отдавал декодеру (плееру h264) на фронте, и это работает, но процесс декодирования в браузере слишком ресурсоёмкий, к тому же, что если у меня на устройстве, скажем 10 камер будет ? Во всех статьях с примера используется в качестве INPUT'a для ffmpeg файл на диске или стрим с вебки - это не мой случай. Модуль что вы привели - https://github.com/fluent-ffmpeg/node-fluent-ffmpeg, я и так использую, и он отлично работает...с файлами что есть на диске) Задача - отправлять данные на rtmp, по мере их поступления (обработки) где данные это что-то вроде Buffer.concat([dataChunk_1, dataChunk_ 2]). |
Цитата:
Непонятно зачем в ноде вообще нужен видеопоток чтобы его просто перенаправить? Пальцем в небо но похоже нужно просто настроить DASH на NGINX |
MallSerg,
тынц - обратите внимание, во всех примерах с ffmpeg используется в качестве INPUT'а - файл на диске или вебка - не мой случай. настроить DASH на NGINX - я использую nginx-rtmp-module, нужные конфиги настроены (использую hls). Непонятно зачем в ноде вообще нужен видеопоток чтобы его просто перенаправить? - в первом посте об этом, вкратце - видео-данные завернуты в структуру, согласно прошивки устройства, не нужно на этом зацикливаться, основная задача - отправка на rtmp. Цитата:
в контейнер загнать - так в этом и проблема, как отправить на nginx-rtmp из ноды ? Очевидное решение - ffmpeg, но как это сделать когда INPUT это информация что приходит по мере обработки ( server.on('data', data) ), а OUTPUT должен быть URL на nginx-rtmp ? |
Цитата:
Как вариант создать нодой tcp сервер который подать на вход ffmpeg Но что тут явно не так ![]() |
MallSerg,
именно ) А что если устройств будет скажем 65656 ? Или на каждом по 100 камер ? Хочется как-то нормально сделать, возможно другое совсем решение нужно, идей нет. |
тогда нужны медиа серверы, они могут на сервере несколько поток склеивать в один
http://red5.org/ https://github.com/ant-media/Ant-Media-Server и т.д. или фантастический вариант сделать headless server на https://github.com/GoogleChrome/puppeteer в нем и будет несколько окон там все декодировать по вебсокету )) потом делаем webrtc там же ) и кастим уже кодированное видео... |
SuperZen,
нужны медиа серверы - не нужны, я пробовал node-media-server, нет никакой необходимости, они делают тоже что и nginx-rtmp-module. Но если предположить что нужны, то как на них слать данные ? Вопрос тот-же самый, про rtmp. декодировать по вебсокету : Цитата:
|
troublesMaker,
что если у меня на устройстве, скажем 10 камер будет ? а что если метеорит упадет? для этого продаются большие компьютеры, а ты как хотел?)) |
Часовой пояс GMT +3, время: 03:39. |