我正在尝试创建一个MJPEG流,我有一系列的JPEG图片,想把它们合并成一个流,以便用户只需点击一个URL即可获取MJPEG流。我已经尝试了几天,但可能无法实现。我使用Ethereal监听了来自某个网络上Axis相机的数据包,并试图模仿它。最初我尝试使用WCF返回“流”,但后来发现需要设置该流的内容类型,所以我尝试了WCF REST API,但它也存在同样的问题。因此,现在我只是使用了最基本的HTTPListener,并处理事件。我非常希望使用WCF,但我不确定它是否允许我返回具有正确内容类型的流。下面是HTTPListener的处理程序。
渲染方法看起来像这样:
HttpListenerResponse response = context.Response;
response.ProtocolVersion = new System.Version(1, 0);
response.StatusCode = 200;
response.StatusDescription = "OK";
response.ContentType = "multipart/x-mixed-replace;boundary=" + BOUNDARY + "\r\n";
System.IO.Stream output = response.OutputStream;
Render(output);
渲染方法看起来像这样:
var writer = new StreamWriter(st);
writer.Write("--" + BOUNDARY + "\r\n");
while (true)
{
for (int i = 0; i < imageset.Length; i++)
{
var resource = Properties.Resources.ResourceManager.GetObject(imageset[i]) as Bitmap;
var memStream = new MemoryStream();
resource.Save(memStream,ImageFormat.Jpeg);
byte[] imgBinaryData = memStream.ToArray();
string s = Convert.ToBase64String(imgBinaryData);
writer.Write("Content-type: image/jpeg\r\n");
foreach (var s1 in imgBinaryData)
{
writer.Write((char)s1);
}
writer.Write("\n--" + BOUNDARY + "\n");
writer.Flush();
Thread.Sleep(500);
}
}
目前,我已经将几个jpeg图像作为dll的属性添加,并正在对它们进行迭代。最终,这些将是动态图像,但现在我只想让它正常工作。
根据我对MJPEG(规范)的理解,内容必须设置为multipart/x-mixed-replace,并设置一个边界。然后,您只需通过边界在流中分隔jpegs即可。
这似乎应该比我做的更简单,但我想知道我错在哪里。如果我在IE或Firefox中加载此URL,它就会挂起。如果我尝试制作一个带有img标记的存根html页面,其源是URL,则会出现损坏的图像。
有任何想法,谢谢。
Josh