Image.FromStream卡住了

时间:2013-08-03 07:51:45

标签: c# .net networkstream

所以我的目标是制作一个基本的简单视频流应用程序。

为此目的,我不断通过网络摄像头捕获图像并通过NetworkStream课程发送它们(我知道它是一个粗略的解决方案,但我说它只是一个基本的裸骨应用程序,不能在生产环境中使用)。 / p>

所以现在问题在于这一行

Image img = Image.FromStream(receiveStream);

现在这会阻止线程从此行移开。假设从流中捕获图像,那么这里有什么问题?

2 个答案:

答案 0 :(得分:3)

我怀疑问题是NetworkStream没有关闭,所以Image.FromStream不知道当前图片何时完成。

假设您负责协议,您可以对每个图像进行长度前缀,然后当您从流中读取时,您可以将精确的字节数读入字节数组,用MemoryStream包装,然后将其传递给Image.FromStream。这样,对Image.FromStream的每次调用都会获得一个在单个图像之后结束的流。

所以你的NetworkStream看起来像这样:

Length (4 bytes)
Data for one image
Length (4 bytes)
Data for one image
// etc

答案 1 :(得分:3)

您还没有解决真正的问题。 Image.FromStream()方法需要CanSeek属性为true的流。图像解码器需要它。然而,这不是NetworkStream的情况,它不支持搜索。

必须首先将图像存储在MemoryStream中。填充完成后,将Position设置回0并调用Image.FromStream()。确保处置或重新使用MemoryStream,这会导致以后很难诊断GenericException。图像解码器是惰性的,需要能够在渲染图像时访问流。

要使其工作,您必须知道从NetworkStream读取多少数据。换句话说,您需要知道帧中存在多少字节。您可以通过让发送器首先写入 int ,然后写入图像中的字节来完成此操作。在读取端,您可以先从流中读取4个字节,然后使用BitConverter.ToInt32()来恢复长度。并且可以简单地计算流中的字节数,以了解MemoryStream何时就绪并且可以调用Image.FromStream()。

一旦你有了这个,你就要么已经解决了当前代码的任何错误,或者有一个非常好的方法来调试它。