Как транслировать видео из нескольких веб-источников, используя nodejs? - PullRequest
0 голосов
/ 12 мая 2019

У меня дома есть пара веб-камер, которые транслируют видео в мою локальную сеть.Теперь я хочу создать сервер узлов, который предоставляет единую конечную точку потоковой передачи и содержимое которой поступает с любой из этих веб-камер.Почти как «переключатель потокового канала» ( не картинка в картинке и не стереотипный экран камеры безопасности, видимый за партами охранников).

Теоретически я хочу иметь возможность указывать видеопроигрыватели на этой конечной точке (например, Quicktime или VLC), тег HTML5 <video> или даже мой Chromecast, и пусть эти потребители не знают о том, что я даже переключаюськаналы.

Тем не менее, нет веб-приложения, поэтому я не могу решить это с JS на стороне клиента, который изменяет src тега <video>.И источники видео не являются статическими файлами, которые находятся в файловой системе, поэтому я не могу использовать fs.createReadStream или получить размер файла заранее, и логика диапазона не имеет значения.Каждый ресурс, который я нашел в Интернете, предполагает хотя бы один из этих фактов, но ни один из них здесь не применим.

Я собрал крошечное приложение Express, которое отслеживает текущий канал в ОЗУ и предоставляет функции смены канала через интерфейс RESTful.,Это приложение прослушивает порт 3000. Я предполагаю, что следующим шагом будет установка отдельного не-Express HTTP-прослушивателя в том же узле процесса, который будет передавать содержимое из текущего потока чтения на выход этого сервера (поток с возможностью записи).

Вот что у меня есть для реализации потоковой передачи:

// this value can be changed via REST calls
let SOURCE_STREAM_URL = null
// this value will be the current read stream
let SOURCE_STREAM = null

const streamer = http.createServer(( req, res ) => {
    SOURCE_STREAM.pipe(res)
})

streamer.listen(3001)

Я считаю, что когда канал «установлен», мне нужно будет создать новый читаемый поток, источник которогоURL нового канала.(В моем случае этот URL будет выглядеть примерно как http://admin:password@192.168.1.10x:8081/stream.) Однако я подозреваю, что выходной поток будет прерван, если операция изменения канала отключит один поток чтения перед запуском нового.Я действительно хочу избежать этого.Может быть, есть способ восполнить этот пробел путем потоковой передачи повторяющейся 1-й «технической трудности» mp4 из файловой системы.Лучше было бы подготовить новый поток, а затем поменять канал перед закрытием старого потока.

Я также знаю, что не хочу, чтобы данные, поступающие в потоковом режиме, создавались для резервного копирования, если я их не смотрюпоэтому этот читаемый поток должен быть настроен на текущий режим .Я предполагаю, что это будет легко: функция «изменить канал» будет обрабатывать переключение входного потока и настройку этого потока:

function setInputChannelUrl( newInputStreamUrl ) {
    SOURCE_STREAM_URL = newInputStreamUrl

    // somehow, create new read stream for that url
    SOURCE_STREAM = magicalReadStreamFromWeb( newInputStreamUrl )
    SOURCE_STREAM.resume()
}

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

...