2014-11-21 63 views
1

我正在尝试从客户端向另一个客户端发送实时视频馈送,反之亦然。我正在使用TCP套接字。因此,AForge.NET可以帮助您从网络摄像头实际获取视频,并将其显示为PictureBox中的一组图像。 AForge.NET正如预期那样工作;它只是快速获取图像到另一个客户端,这是问题。我已经尝试了很多解决这个问题的方法。使用AForge.NET和Windows Forms流式传输实时视频的方法有哪些?

其中之一是首先将整个网络中的字节数作为Int发送,然后通过图像(帧)发送到客户端。不过,由于某些原因,在如此多的帧(它每次变化)之后,它会收到一个不是要发送的字节的有效表示。我正在使用异步回调,因此可能会有一些延迟,或者它发送得太快。

然后我尝试的另一个解决方案是将收到的字节设置为可以通过TCP/IP发送的最大数量,然后用空格或其他填充字符填充空字节。然后检查它有多大,你可以直接从字节数组中检索(从头开始),找到第一个非空格字符或特别包含的字符,以字节表示帧的结尾。这会更具活力,因为每次都不需要大小,但由于恒定的大小非常大,效率下降了。有些问题需要特殊字节才能起作用。由于它是一个64位应用程序,因此单个字符为2个字节。所以我将该字符添加到框架(最后)以表示框架停止的位置。但是当我跑过去时它无法检测到它。所以也许我在使用字节时犯了一个错误,但是我觉得这个应该可以工作。

基本上,我想知道,使用AForge.NET,如何获取视频图像,使用TCP套接字通过网络将实况视频从一个应用程序流式传输到下一个应用程序。

回答

0

你的第一个方法是正确的。您在机器之间传输的东西必须以传输的字节数开始,然后是实际的有效负载。您应该尝试解决您在此方法中遇到的问题。

使用特殊值,零或其他值不适用于二进制数据。您的图片数据可能包含一系列字节,这些字节恰好是您的定位值,您的图片数据流将被破坏。

在通过TCP套接字传输数据时有很多事情需要注意。一个重要的是你收到一个流。接收处理程序可能获得的字节数少于应用程序级另一侧发送的字节数。可能甚至没有足够的字节来重建图像长度变量。它必须消耗更多的流才能最终获得发送的整个对象。

在C#中,您可以使用TcpClient,获取其流并调用Read(),它将阻塞,直到从管道消耗足够的字节。

在发送端仔细检查像素格式(8bpp,24bpp,32bpp?)和可能的行填充。

另请注意,当您的事件处理程序返回时,AForge将处理位图。尤其是,您不能将Bitmap引用传送到另一个线程并从那里发送,请制作您自己的副本。

相关问题