C# WPF和MJPEG解码器帮助
这可能有点遥不可及,但我有一个WPF项目,需要流式传输MJPEG视频。位于的库似乎是为数不多的PnP选项之一。它非常适合于查看单个流。但是,当您尝试从一个URI切换到第二个URI时,最终的结果是,您将两个流中的帧交错到我的WPF页面上的同一图像对象中。两个流都是活动的,而不仅仅是前一个流的缓存 不管我怎么做,第一个流似乎不会消失,解码器中的stopstream方法除了设置一个布尔值外,什么都不会做 下面是我如何使用该库的伪代码。我做错什么了吗C# WPF和MJPEG解码器帮助,c#,wpf,mjpeg,decoder,C#,Wpf,Mjpeg,Decoder,这可能有点遥不可及,但我有一个WPF项目,需要流式传输MJPEG视频。位于的库似乎是为数不多的PnP选项之一。它非常适合于查看单个流。但是,当您尝试从一个URI切换到第二个URI时,最终的结果是,您将两个流中的帧交错到我的WPF页面上的同一图像对象中。两个流都是活动的,而不仅仅是前一个流的缓存 不管我怎么做,第一个流似乎不会消失,解码器中的stopstream方法除了设置一个布尔值外,什么都不会做 下面是我如何使用该库的伪代码。我做错什么了吗 button_click{ //Creat
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
}
我已经写信给译码器的作者,没有回应。我希望使用此库的其他人能够对此有所了解。如果调用
StopStream()
,请稍等,然后再次调用ParseStream
,它应该关闭第一个流,只显示第二个流
更好的选择是,对于要查看的每个流,只使用MjpegDecoder
的单个实例
当然,如果您不确定它是如何工作的,您可以下载代码,看看它是如何工作的。尽管MJPEGDecoder库很棒,但不幸的是,它在每一帧创建了一个WPF位图和一个System.Drawing.Bitmap。这太过分了 我们需要的是一个字节数组,它与平台无关。然后由UI将其转换为实际的图像对象 因此,我获取了MJPEGStream.cs对象并对其进行了一些调整,使其发送字节数组而不是位图 MJPEGStream.cs非常健壮,速度非常快。我在生产中使用它来流多达30个流。当URI更改时,它会自动停止并重新启动流,如果cam停止响应,它会自行重试 请拿着这个,然后这样使用:
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();
当然,您可以从中受益