Image.FromStream获取';s卡住了

本文关键字:FromStream 获取 Image | 更新日期: 2023-09-27 18:25:58

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

为此,我不断通过网络摄像头捕捉图像,并通过NetworkStream类发送图像(我知道这是一个粗略的解决方案,但正如我所说,这只是一个基本的应用程序,不适用于生产环境)。

所以现在问题出在这一行

Image img = Image.FromStream(receiveStream);

现在这会阻塞线程,它不会从这条线上移动。假设是从流中捕获图像,那么这里出了什么问题?

Image.FromStream获取';s卡住了

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

假设您负责该协议,您可以为每个图像添加长度前缀,然后当您从流中读取时,您可以将确切数量的字节读取到字节数组中,用MemoryStream封装,然后将其传递给Image.FromStream。这样,对Image.FromStream的每个调用都会得到一个流,该流在单个图像之后结束。

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

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

您还没有找到真正的问题。Image.FromStream()方法需要CanSeek属性为true的流。图像解码器需要它。但是NetworkStream的情况并非如此,它无法支持查找。

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

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

一旦你做到了这一点,你要么已经解决了困扰你当前代码的任何错误,要么就有了一个很好的方法来调试它