Stack Overflow的Denizens我需要你的知识。我正在开发一个利用WPF和基本C#.NET套接字通信的视频处理系统。每个客户端以每秒30帧的速度将视频数据传输到LAN环境中的服务器以进行处理。某些处理由每个客户端处理,以减轻服务器负载。
我已经在硬件限制从未引起关注的环境中学习了编程。视频改变了......“Hello World”并没有让我为此做好准备。实施这两种前瞻性方法中的任何一种都不是一个严重的问题。确定哪些我应该投入时间和精力来到我需要帮助的地方。
我有两个选择(但愿意接受建议!)假设硬件限制客户产生尽可能接近实时的结果:
- 排队客户端 - 客户端处理视频帧队列。处理每个帧,然后通过TCP数据包发送到服务器进行进一步分析。该系统按传感器捕获的顺序一次只处理一个帧,并通过静态套接字客户端将其传输到服务器。 *该系统无法利用现代多核硬件。
- 螺纹客户端 - 客户端利用线程(后台工作者)处理并将每个帧传输到服务器。每个新帧触发新的处理线程以及新网络通信类的实例化。 *该系统使用现代硬件,但可能会产生严重的时序问题。
对于我的询问的核心,线程通信是否产生了大部分有序的通信?我已经计划在服务器端的客户端之间同步视频帧了...但是数据传输到目前为止是否会出现故障而导致出现新问题?回想一下,这是通过本地网络进行的通信。
更重要的是,实例化一个新的套接字通信类以及一个新的(简单的)视频处理类会产生足够的开销,使得每个帧不应该并行排队或处理?
代码刚刚开始形成。客户端系统的硬件未知,因此无法确定其性能。你会如何进行开发?
我是一名大学生。因此,任何输入都有助于我设计我的第一个真实世界的应用知识。
答案 0 :(得分:1)
'对于我的询问的核心,线程通信是否产生了大部分有序的通信?不,不是一般的。如果同时处理视频帧,则通常需要一些维持端到端顺序的机制(例如,序列号),以及合适的协议和足够的缓冲以在服务器处重新组装和维护有效的帧序列(如果需要显示而不是/以及流式传输到磁盘文件,请使用正确的时序和同步。
视频通常需要每种技巧来优化性能。框架对象池(最佳分配以避免错误共享),避免垃圾收集,用于图像处理的threadPools等。
'数据交付到目前为止是否会导致无法解决问题? - 很可能,如果您没有指定并应用合适的最小网络速度和可用性,某些流可能会将可用的缓冲扩展到必须丢弃,复制或插入帧以保持同步的点。有效地做到这一点是视频协议乐趣的一部分:)
答案 1 :(得分:0)
只有一个有效的回应“XXXXXXX的性能是否足够” - 尝试并测量。
在你的情况下,你应该估计
当您估计要求时 - 看它是否合理(即任何普通机器都无法处理10Tb /秒的传入数据,而100Mb / s可能适用于正常的1Gb网络)。
比构建系统的最基本版本(即使用ASP.Net构建单页网站并以所需速度将文件发布到它,“处理”使用Thread.Sleep)并观察/测量结果。
至于你“创建一个对象会很慢” - 因为你计划通过网络发送大量数据,所以你的情况极不可能。但这很容易尝试 - StopWatch + new MyObject()
会向您显示详细的时间。