我正在尝试创建一个 MJPEG 流,我有一系列 jpeg,我想将它们组合成一个流,以便用户只需点击一个 URL 并获取一个 mjpeg 流。在过去的几天里,我一直在努力让它发挥作用,但这可能是不可能的。我提出了 ethereal 并听取了来自网络某处轴摄像头的数据包,并试图模仿它。我最初尝试使用 WCF,并返回一个“流”,但后来发现我需要在该流上设置内容类型,所以我尝试了 WCF REST api,但遇到了同样的问题。所以我现在只是使用一个简单的 HTTPListener,并处理事件。我非常喜欢使用 WCF,但我不确定它是否允许我返回具有正确内容类型的流。所以在这里'
在侦听器回调的处理程序中,我输入了以下内容。
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);
}
}
在这一点上,我刚刚在 dll 上添加了一些 jpeg 图像作为属性,并且正在对其进行迭代,最终这些将是动态图像,但现在我只想让它工作。
根据我对 MJPEG(规范)的了解,内容必须设置为 multipart/x-mixed-replace 和边界集。然后您只需按边界划分流内的 jpeg。
这似乎应该比我做的更简单,但我想知道我哪里出错了。如果我在 IE 或 Firefox 中加载此 URL,它就会挂起。如果我尝试使用 img 标签制作一个存根 html 页面,其来源是 URL,那么我会得到一个损坏的图像。
任何想法,谢谢
乔什