Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 10.09.2019, 12:47
Новичок на форуме
Отправить личное сообщение для troublesMaker Посмотреть профиль Найти все сообщения от troublesMaker
 
Регистрация: 10.09.2019
Сообщений: 9

Работа с видео-потоком, 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 ?)

Возможно есть другие идеи/решения ?
Ответить с цитированием
  #2 (permalink)  
Старый 10.09.2019, 19:59
Аватар для SuperZen
Профессор
Отправить личное сообщение для SuperZen Посмотреть профиль Найти все сообщения от SuperZen
 
Регистрация: 08.11.2017
Сообщений: 410

в общем нужен 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
Ответить с цитированием
  #3 (permalink)  
Старый 10.09.2019, 20:59
Новичок на форуме
Отправить личное сообщение для troublesMaker Посмотреть профиль Найти все сообщения от troublesMaker
 
Регистрация: 10.09.2019
Сообщений: 9

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]).
Ответить с цитированием
  #4 (permalink)  
Старый 11.09.2019, 02:52
Аватар для MallSerg
Профессор
Отправить личное сообщение для MallSerg Посмотреть профиль Найти все сообщения от MallSerg
 
Регистрация: 07.03.2011
Сообщений: 920

Цитата:
Его сначала надо перекодировать
из h264 в h264 скорее всего нужно raw в контейнер загнать тынц
Непонятно зачем в ноде вообще нужен видеопоток чтобы его просто перенаправить?
Пальцем в небо но похоже нужно просто настроить DASH на NGINX
Ответить с цитированием
  #5 (permalink)  
Старый 11.09.2019, 11:00
Новичок на форуме
Отправить личное сообщение для troublesMaker Посмотреть профиль Найти все сообщения от troublesMaker
 
Регистрация: 10.09.2019
Сообщений: 9

MallSerg,
тынц - обратите внимание, во всех примерах с ffmpeg используется в качестве INPUT'а - файл на диске или вебка - не мой случай.
настроить DASH на NGINX - я использую nginx-rtmp-module, нужные конфиги настроены (использую hls).
Непонятно зачем в ноде вообще нужен видеопоток чтобы его просто перенаправить? - в первом посте об этом, вкратце - видео-данные завернуты в структуру, согласно прошивки устройства, не нужно на этом зацикливаться, основная задача - отправка на rtmp.
Цитата:
- далее, сервер обрабатывает полученные данные - парсит, сохраняет во временный массив. (Необходимо для определения, достаточно ли информации пришло, чтобы можно было её как-то дальше обрабатывать/отправлять куда-то ещё, здесь всё согласно специфике прошивки устройства);
- Дальше, когда парсер говорит что информации достаточно ( parser.emit('data', streamData) ) - её можно и нужно куда-то отправлять, чтобы её можно было увидеть в браузере (<video>), то есть надо отправить на rtmp, например с помощью ffmpeg. В качестве rtmp сервера использую nginx-rtmp-module.

в контейнер загнать - так в этом и проблема, как отправить на nginx-rtmp из ноды ? Очевидное решение - ffmpeg, но как это сделать когда INPUT это информация что приходит по мере обработки ( server.on('data', data) ), а OUTPUT должен быть URL на nginx-rtmp ?

Последний раз редактировалось troublesMaker, 11.09.2019 в 11:07.
Ответить с цитированием
  #6 (permalink)  
Старый 11.09.2019, 12:28
Аватар для MallSerg
Профессор
Отправить личное сообщение для MallSerg Посмотреть профиль Найти все сообщения от MallSerg
 
Регистрация: 07.03.2011
Сообщений: 920

Цитата:
обратите внимание, во всех примерах с ffmpeg используется в качестве INPUT'а - файл на диске или вебка - не мой случай.
Официальная документация поддерживаемых протоколов для ввода и вывода http://ffmpeg.org/ffmpeg-protocols.html
Как вариант создать нодой tcp сервер который подать на вход ffmpeg

Но что тут явно не так
Ответить с цитированием
  #7 (permalink)  
Старый 11.09.2019, 12:31
Новичок на форуме
Отправить личное сообщение для troublesMaker Посмотреть профиль Найти все сообщения от troublesMaker
 
Регистрация: 10.09.2019
Сообщений: 9

MallSerg,
именно ) А что если устройств будет скажем 65656 ? Или на каждом по 100 камер ?
Хочется как-то нормально сделать, возможно другое совсем решение нужно, идей нет.
Ответить с цитированием
  #8 (permalink)  
Старый 11.09.2019, 13:28
Аватар для SuperZen
Профессор
Отправить личное сообщение для SuperZen Посмотреть профиль Найти все сообщения от SuperZen
 
Регистрация: 08.11.2017
Сообщений: 410

тогда нужны медиа серверы, они могут на сервере несколько поток склеивать в один

http://red5.org/
https://github.com/ant-media/Ant-Media-Server
и т.д.

или фантастический вариант сделать headless server на https://github.com/GoogleChrome/puppeteer
в нем и будет несколько окон там все декодировать по вебсокету )) потом делаем webrtc там же ) и кастим уже кодированное видео...
Ответить с цитированием
  #9 (permalink)  
Старый 11.09.2019, 13:48
Новичок на форуме
Отправить личное сообщение для troublesMaker Посмотреть профиль Найти все сообщения от troublesMaker
 
Регистрация: 10.09.2019
Сообщений: 9

SuperZen,
нужны медиа серверы - не нужны, я пробовал node-media-server, нет никакой необходимости, они делают тоже что и nginx-rtmp-module. Но если предположить что нужны, то как на них слать данные ? Вопрос тот-же самый, про rtmp.

декодировать по вебсокету :
Цитата:
Я пробовал немного другой пример, когда чанки отдавал декодеру (плееру h264) на фронте, и это работает, но процесс декодирования в браузере слишком ресурсоёмкий, к тому же, что если у меня на устройстве, скажем 10 камер будет ?
Ответить с цитированием
  #10 (permalink)  
Старый 11.09.2019, 13:58
Аватар для SuperZen
Профессор
Отправить личное сообщение для SuperZen Посмотреть профиль Найти все сообщения от SuperZen
 
Регистрация: 08.11.2017
Сообщений: 410

troublesMaker,
что если у меня на устройстве, скажем 10 камер будет ?
а что если метеорит упадет? для этого продаются большие компьютеры, а ты как хотел?))
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Видео без <VIDEO> и FLASH DIGIUS Общие вопросы Javascript 1 25.10.2016 03:34
Сайт торент видео онлайн (через браузер). nemo84 Ваши сайты и скрипты 1 18.05.2013 20:07
работа с видео dimon76 Общие вопросы Javascript 2 04.11.2011 15:50
Время вывода скина с видео (ffmpeg) TRANCE Общие вопросы Javascript 1 17.01.2010 11:55