这可能只是一个长镜头,但是这里有:我有一个WPF项目,需要流式传输MJPEG视频。 http://mjpeg.codeplex.com/的图书馆似乎是为数不多的PnP选项之一。它非常适合查看单个流。但是,当您尝试从一个URI切换到另一个URI时,最终结果是您从两个交互流中的帧中隔行扫描到我的WPF页面上的同一个图像对象。两个流都是实时的,而不仅仅是前一个流的缓存。
无论我尝试什么,似乎第一个流都不会消失,解码器中的stopstream方法除了设置一个布尔值之外不会做任何事情。
这是我如何使用库的伪代码。我做错了吗?
button_click{
//Create new decoder instance
//Remove the previous image object from my WPF page
//Add a new image object to the WPF page
//Stop stream
//Set the event for a new frams
//Request the new stream with a new URI
}
我写信给解码器作者没有回应。我希望使用这个库的其他人能够阐明这一点。
答案 0 :(得分:3)
如果您拨打StopStream()
,稍等一下,然后再次拨打ParseStream
,它应关闭第一个流,并仅显示第二个流。
更好的选择是仅为您要查看的每个流使用MjpegDecoder
的单个实例。
当然,如果你不确定它是如何工作的,你可以下载代码,看看它是如何工作的。
答案 1 :(得分:0)
虽然MJPEGDecoder库很棒,但遗憾的是它在每一帧都创建了一个WPF BitmapImage和一个System.Drawing.Bitmap。这太过分了。
我们需要的是一个字节数组,它与平台无关。然后由UI将其转换为实际的Image对象。
所以我拿了AForge.NET MJPEGStream.cs对象并调整了一下,所以它发送一个字节数组而不是一个Bitmap。
MJPEGStream.cs非常强大,非常快。我在生产中使用它来流式传输多达30个流。它会在URI更改时自动停止并重新启动流,如果凸轮停止响应,则会自行重试...
请使用此gist,然后以这种方式使用它:
var stream = new MJPEGStream("http://webcam.st-malo.com/axis-cgi/mjpg/video.cgi?resolution=352x288");
stream.NewFrame += img => {
Dispatcher.BeginInvoke(
System.Windows.Threading.DispatcherPriority.Render,
new Action(() => {
var bmp = new BitmapImage();
bmp.BeginInit();
bmp.StreamSource = new MemoryStream(img);
bmp.EndInit();
bmp.Freeze();
pic.Source = bmp;
}));
};
stream.Start();
当然,请查看the documentation以使其所有功能受益。