我正在尝试从客户端向另一个客户端发送实时视频供稿,反之亦然。我正在使用TCP套接字。因此,AForge.NET帮助实际从网络摄像头获取视频并将其作为一组图像显示在PictureBox中。 AForge.NET的工作方式与预期一致;它只是将图像快速传递给另一个客户端,这就是问题所在。我已经尝试了很多这个问题的解决方案。
其中之一是首先通过网络将字节数作为Int发送,然后通过图像(帧)发送到客户端。但是出于某种原因,在经过如此多的帧(每次都有变化)后,它会收到一个数字,该数字不是要发送的字节的有效表示。我正在使用异步回调,所以可能有一些延迟或者它发送得太快。
然后我尝试的另一个解决方案是将接收的字节数设置为可以通过TCP / IP发送的最大数量,然后用空格或其他填充字符填充空字节。然后检查它有多大,你可以直接(从结尾开始)字节数组,找到第一个非空格字符或特别包含的字符,以字节表示帧的结尾。这将是更加动态的,因为每次都不需要尺寸,但是由于恒定的尺寸如此之大,效率会下降。并且存在使特殊字节起作用的问题。由于它是64位应用程序,因此单个字符为2个字节。所以我将字符添加到框架(最后)以表示框架停止的位置。但是当我跑回来时它无法检测到它。所以也许我在使用字节时犯了一个错误,但我觉得应该有一个工作。
基本上,我想知道,使用AForge.NET,如何获取视频图像,使用TCP套接字通过网络将实时视频从一个应用程序传输到下一个应用程序。
答案 0 :(得分:0)
你的第一种方法是正确的。你在机器之间传输的东西必须以传输的字节数开始,然后是实际的有效载荷。您应该尝试解决此方法中存在的问题。
使用特殊值,零或其他,不适用于二进制数据。您的图像数据可能有效地包含一系列字节,恰好是您的标记值,您的信息流将被破坏。
通过TCP套接字传输数据时需要注意很多事项。一个重要的是你收到一个流。接收处理程序可能获得的字节数少于应用程序级别从另一方发送的字节数。可能甚至没有足够的字节来重建图像长度变量。它必须消耗更多的流才能最终得到发送的整个对象。
在C#中,您可以使用TcpClient,获取其流并在其上调用Read(),它将阻塞,直到从管道消耗足够的字节。
在发送端仔细检查像素格式(8bpp,24bpp,32bpp?)和可能的行填充。
另请注意,当事件处理程序返回时,AForge将处置Bitmap。特别是你不能将Bitmap引用转移到另一个线程并从那里发送,自己制作副本。