将实时网络摄像头流式传输到服务器并返回网络的最佳方式是啥?

Posted

技术标签:

【中文标题】将实时网络摄像头流式传输到服务器并返回网络的最佳方式是啥?【英文标题】:What's the best way to STREAM LIVE WEBCAM to SERVER and BACK TO THE WEB?将实时网络摄像头流式传输到服务器并返回网络的最佳方式是什么? 【发布时间】:2020-11-01 20:15:20 【问题描述】:

我需要一些帮助。

在网络上设置从我的 WEBCAM 到服务器并返回给多个用户的 LIVE STREAMING 的最佳方式是什么?

基本上我正在尝试创建一个可以支持许多用户的群组视频聊天应用程序。

我不希望它是点对点 webRTC。

我实际上设法使它与 getUserMedia() 一起工作 -> mediaRecorder -> ondataavailable -> 通过 SOCKET.IO 将 blob 块传递给 node.js -> socket.io 将 blob 块发送回其他连接的用户 -> 附加这些块到一个源缓冲区,该缓冲区连接到一个媒体源,该媒体源设置为

上的源 URL

它确实奏效了!但它是如此缓慢、滞后和资源密集型。由于这些块以每秒 20 次的速度通过,因此大大减慢了页面速度。我认为您不应该这么快将那么多 blob 传递给 sourceBuffer。只是为了测试,我尝试每 3 秒保存一次 mediaRecordings(所以它不是资源密集型)并将这些 webm blob 传递给 sourceBuffer 但由于某种原因,只有第一个 webm 加载,而其他 webm 没有添加或开始播放。

这种方式不能用于生产应用程序。

这样做的“正确”方法是什么?

如何将视频流从网络摄像头正确传递到 Node.js 服务器?

以及如何将此实时流从 Node.js 服务器流式传输回网络,以便我们可以进行视频群聊?

我有点迷茫。请帮忙。

我使用 HLS 吗?记录RTC?

我是通过 http 还是通过 socket.io 从 Node.js 流式传输?

已经有一些服务可以让你轻松做到这一点,比如 vonage video api tokbox,但那些似乎非常昂贵?

我想通过我自己控制的 Node.js 服务器运行视频流。

最好的方法是什么?

请帮忙。

谢谢

【问题讨论】:

【参考方案1】:

基本上我正在尝试创建一个可以支持许多用户的视频群聊应用程序。

我不希望它是点对点 webRTC。

视频聊天需要低延迟,因此需要使用 WebRTC。请记住,其中一个“对等点”实际上可以是服务器。

它确实奏效了!但它是如此缓慢、滞后和资源密集型。

无论如何,视频编码/解码都是资源密集型的。如果“慢”和“滞后”是指高延迟,那么是的,记录块、发送块、解码块,本质上都会有更高的延迟。此外,您所描述的内容不会丢帧或动态调整编码,因此如果连接无法跟上,它只会缓冲直到可以为止。这是一种与您想要的不同的权衡。

同样,对于视频聊天,实时性比质量和可靠性更重要。如果这意味着丢弃帧,重新采样音频以快速赶上,以低比特率编码,甚至暂时完全丢弃流几秒钟,这就是需要发生的事情。这就是整个 WebRTC 堆栈所做的事情。

由于这些块以每秒 20 次的速度通过,因此页面速度大大降低。我认为您不应该这么快将那么多 blob 传递给 sourceBuffer。

不,这不太可能是您的问题。接收端可能无法跟上所有这些流的解码速度。

我使用 HLS 吗?

不适用于任何积极参与聊天的人...需要低延迟的人。对于其他所有人,是的,您可以利用 HLS 和 DASH 为您提供一种更实惠的方式来通过现有 CDN 分发您的流。请参阅此答案:https://***.com/a/37475943/362536 基本上,仔细检查您的要求并确定是否每个人都真正参与其中。如果不是,请将它们转移到比 WebRTC 更便宜的流媒体方法。

记录RTC?

不,这与您的项目无关,坦率地说,我不知道为什么人们继续使用这个库来做任何事情。也许他们有一些我不知道的特定用例,但浏览器多年来一直内置MediaRecorder。

已经有一些服务可以让你轻松做到这一点,比如 vonage video api tokbox,但那些似乎非常昂贵?

这是一件昂贵的事情。我想你会发现,在大多数情况下,使用已经准备好基础设施的现有服务会比自己动手更便宜。

【讨论】:

感谢我的进一步研究,我得出了您指出的结论。我需要使用 webRTC 并有一个 webRTC 服务器来处理一群人的视频传输。我一次只需要连接 5-10 个人,但如果它是点对点的,它就行不通,这就是我打折 webRTC 的原因,但我错过了你可以拥有 webRTC 服务器的部分。你对此有什么建议吗?我设法改进了我的工作代码,现在它以 1 秒的间隔发送块,并将它们显示在旧视频标签之上的新视频标签中,哈哈。是的,我有 1 秒的延迟..

以上是关于将实时网络摄像头流式传输到服务器并返回网络的最佳方式是啥?的主要内容,如果未能解决你的问题,请参考以下文章

当前在网络浏览器中流式传输实时视频的最佳实践?

使用 socket.io 流式传输网络摄像头

寻找一个库/框架将实时视频从 OS X 流式传输到 Wowza 服务器(RTMP)[关闭]

将实时视频广播从 android 相机流式传输到服务器

如何在 flash/rtmp 中将客户端网络摄像头流式传输到网络服务器

Google Colab:“有没有办法使用网络摄像头流式传输视频并进行处理?”