【问题标题】:Send data over network to multiple recipient parallely通过网络将数据并行发送到多个接收者
【发布时间】:2021-02-24 13:15:19
【问题描述】:

您好,我正在使用网络编程,很难创建一个逻辑,允许将视频从单个服务器流式传输到多个客户端无延迟

这意味着我必须在流到所有连接的客户端期间实现并行执行,以便同时显示图像。

为什么这对我的项目很重要,因为我打算拥有大量客户(从 200 个到大约 700 个),现在有 10 个客户,延迟不过是 700 个客户可能会大大增加延迟到几个分钟(不确定但可能)。

对于那些不知道延迟原因是什么的人,它来自我正在使用的 for 循环,其中包含每个帧的发送函数,这是一个串行执行。

我尝试了 threadingmultiprocessing 甚至 function schedule 但每件事都变得一团糟,之前我使用的是 socket & opencv,但由于某种原因,它在流式传输过程中引起了问题,现在我切换到 NetgearVidgear 但我仍在苦苦挣扎。

希望有人能提供帮助。

PS: 多播不适合这项工作,在我尝试之后,由于传输图像的长度,我收到错误,UDP 协议将接受超过 65535 字节。

【问题讨论】:

  • 客户端是否在同一个网络上?客户端组是否在同一个网络上?
  • 服务器和客户端在同一个网络
  • 因为一切都在同一个网络中,所以你应该使用多播,这是为这种场景设计的。您可以将单个多播数据包发送到订阅该多播组的多个接收者。忘记尝试向每个客户端发送相同数据的副本,只需发送一次,所有客户端都会收到它。
  • 非常感谢您提供的信息,我会根据您的建议开始做一些测试,希望一切都按预期进行。

标签: python-3.x sockets opencv networking network-programming


【解决方案1】:

根据您的评论,所有内容都在同一个网络中,我们为您的问题提供了多播。您可以向多个接收者发送单个流量流,而不是一遍又一遍地向多个主机发送相同的数据。

您将客户端设置为订阅多播组,通常是239.0.0.0/8 Organization-Local 范围内的组。然后,您的服务器将其流量发送到客户端订阅的同一个多播组。每个订阅多播组的客户端都将接收和处理单个流量流。

由于多播发送到多个客户端,因此您必须使用无连接传输协议,例如UDP。面向连接的传输协议,例如TCP,在两台主机之间创建连接,因此它们不能与多播一起使用,这是一对多的。

默认情况下,多播仅在同一网络中有效。我们确实有组播路由将流量发送到其他网络,但它与通常的单播路由有很大不同。此外,您不能在公共 Internet 上进行多播,因为 ISP 没有多播路由。您可以使用支持多播的隧道,例如通过 Internet 多播到不同的站点。 GRE。源路由器和目标路由器都需要配置多播路由,以及多播数据包路径中的任何路由器(Internet 路由器上看到的是单播隧道数据包,而不是多播数据包,因此您可以通过互联网)。

【讨论】:

  • 非常感谢您分享了一些重要信息,并且您对主题非常准确,我真的很感激。
  • 不幸的是 UDP 无法发送大数据,当我流式传输视频并且数据长度达到 55000 时会引发错误,有什么办法处理吗?
  • UDP 不是流协议,它是基于消息的。您只需要应用程序或具有应用程序层协议即可将数据分成更小的 UDP 块。 TCP 是一种流协议,但它只在两个主机之间创建连接。有一些应用层协议可以在 UDP 之上传输视频等内容。
  • 能否请您发布一个此类应用层协议的示例,以便将数据分成更小的块,用于发送方代码和接收方代码的 UDP
【解决方案2】:

您好,我正在使用网络编程,很难创建一个允许将视频从单个服务器流式传输到多个客户端而没有延迟的逻辑。

嘿@zaki-lazhari 我是VidGear 视频处理Python 项目的创建者。实际上,NetGear 不是多播任务的正确 API 选择,您应该使用 WebGear API。 WebGear 可以充当强大的视频流服务器,将实时视频帧传输到网络上的任何网络浏览器。因此,您可以通过如下几行代码轻松设置 WebGear Server:

# import required libraries
import uvicorn
from vidgear.gears.asyncio import WebGear

#various performance tweaks
options={"frame_size_reduction": 40, "frame_jpeg_quality": 80, "frame_jpeg_optimize": True, "frame_jpeg_progressive": False}

#initialize WebGear app  
web=WebGear(source="foo.mp4", logging=True, **options)

#run this app on Uvicorn server at address http://0.0.0.0:8000/
uvicorn.run(web(), host='0.0.0.0', port=8000)

#close app safely
web.shutdown()

因此,同一网络上的每个设备(甚至是安装了任何浏览器的智能手机)都可以访问浏览器上的实时帧,而无需任何额外的依赖。 更多代码示例可以在这里找到: https://abhitronix.github.io/vidgear/gears/webgear/advanced/

希望对您有所帮助。祝你好运!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-06
    • 2015-06-29
    • 2011-09-13
    • 1970-01-01
    • 2016-05-21
    • 1970-01-01
    相关资源
    最近更新 更多