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

Posted

技术标签:

【中文标题】使用 socket.io 流式传输网络摄像头【英文标题】:Stream WebCam using socket.io 【发布时间】:2017-02-27 01:11:39 【问题描述】:

我一直在尝试实现一个能够处理以下场景的 Web 应用程序:

同时将视频/音频从客户端流式传输到其他客户端(实际上是一组特定的客户端,没有广播)和服务器。数据源将是客户端的网络摄像头。 此流式数据必须实时显示在其他客户端的浏览器上保存在服务器端以用于“存档”目的。 必须在node.js + socket.io环境下实现。

把它放在一些更具体的上下文中......场景是有一个人为他选择的用户创造了一个房间。在选定的用户加入房间后,创建者开始从他/她的内置设备(网络摄像头)流式传输视频/音频。所有客人实时接收数据,并将数据发送到存储数据的服务器,以便在流和房间关闭后恢复。

我正在考虑将 Socket.IO 与 WebRTC 混合使用。从理论上讲,这两者的结合似乎非常适合这项工作。 Socket.IO 非常适合通过将一些套接字分配给房间以及 WebRTC 要求的信号处理来收集特定的用户集。 同时,WebRTC 非常适合聚集在同一个房间的用户之间的 P2P 连接,也很容易访问网络摄像头和其他我可能想要使用的内置设备。

所以是的,理论上一切看起来都不错,但我真的需要看到一些实际的代码,这样我才能真正尝试自己实现它。此外,我看到了一些问题:

如何保存 P2P 连接发送的流?显然服务器无权访问它。我在想我可能会将服务器视为另一个“客人”,所以它只是与房间创建者的 P2P 连接的另一个端点。不过,不知怎的,这让人感觉很前卫。 将服务器视为创建者和客户端之间的中间人不是更好吗?与 P2P 相比,在某一时刻可能会有一些(可能微不足道)延迟,但可能对于所有客户端来说都是相同的。 (我试过了,但我无法完成从网络摄像头到服务器的流式传输,但这是另一个问题的主题,因为我在处理 MediaStream 时遇到问题)

我一直在寻找一些不错的解决方案,但没有成功。我已经看到有一个为 socket.io 制作的不错的 P2P 解决方案:http://socket.io/blog/socket-io-p2p/。问题是 - 我认为它不能很好地处理数据流。这些例子只提到了简单的聊天应用程序,我需要比这更重的东西。

我真的很感谢一些具体的例子,文档,任何可能让我更接近实现它的东西,因为我真的不知道如何处理它。

提前致谢:)

【问题讨论】:

【参考方案1】:

您的任务可以通过使用开源 WebRTC 服务器之一来解决。 例如,kurento

你可以实现流的模式:

一对一 一对多 多对多

WebRtc-server schema

客户端将通过 WebRTC 服务器相互连接。 因此,在服务器端,您可以记录流,或将其发送以进行转码。

webSocket 用于与服务器通信。

你可以根据你的任务找到一些examples

【讨论】:

【参考方案2】:

向多个用户传输视频是一个非常困难的问题,不幸的是,它需要大量的基础设施才能实现。您将无法通过 websocket 流式传输视频数据。对于您所描述的内容,WebRTC 也不是一个可行的解决方案,因为正如您所提到的,WebRTC 协议是 P2P,因为在流式传输中,用户需要直接连接到所有“观众”。这显然不会超出几个“观众”。 WebRTC 更适合直接视频通话,例如 Skype。

Here 是一篇文章,描述了一个颇受欢迎的直播服务所使用的架构。正如您所见,实现任何规模的实时视频都需要大量资源。

【讨论】:

以上是关于使用 socket.io 流式传输网络摄像头的主要内容,如果未能解决你的问题,请参考以下文章

使用 FFmpeg 从 Mac 流式传输网络摄像头

如何使用 C# 流式传输网络摄像头视频? [关闭]

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

如何减少延迟 - 来自网络摄像头的 VLC 流式传输

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

寻找最快的视频编码器,将网络摄像头流式传输到 ipad