如何使用nodejs从多个Web源流式传输视频?

时间:2019-05-12 01:55:36

标签: node.js video-streaming

我家中有几个网络摄像头,可将他们的视频流式传输到本地网络。现在,我想构建一个节点服务器,该节点服务器提供单个流终结点,并且其内容来自那些网络摄像头中的任何一个。几乎就像一个“流媒体频道切换器”( not 画中画,以及 not 在警卫室桌子后面看到的定型安全摄像机屏幕)。

从理论上讲,我希望能够将视频播放器指向该端点(例如Quicktime或VLC),HTML5 <video>标签甚至我的Chromecast,并使这些消费者不知道以下事实:我什至要切换频道。

也就是说,没有web应用程序,因此我无法使用更改src标签的<video>的客户端JS解决此问题。而且视频源不是位于文件系统上的静态文件,因此我无法使用fs.createReadStream或事先获取文件大小,并且范围逻辑无关紧要。我在网上找到的所有资源都至少假设了其中一个事实,但在这里均不适用。

我整理了一个微型Express应用程序,该应用程序跟踪RAM中的当前通道,并通过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来填补空白。最好是准备新的流,然后在关闭旧流之前交换管道。

我还知道,如果我不看数据,我不希望备份流中的数据,因此需要为flowing mode配置此可读流。我认为这将是简单的部分:“更改频道”功能将处理切换输入流并将该流设置为流的方式:

function setInputChannelUrl( newInputStreamUrl ) {
    SOURCE_STREAM_URL = newInputStreamUrl

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

因此,我正在寻求帮助,以了解如何从流式视频的URL创建读取流以及如何处理无缝转换。任何其他帮助也将受到赞赏。

0 个答案:

没有答案