C# WPF和MJPEG解码器帮助

C# WPF和MJPEG解码器帮助,c#,wpf,mjpeg,decoder,C#,Wpf,Mjpeg,Decoder,这可能有点遥不可及,但我有一个WPF项目,需要流式传输MJPEG视频。位于的库似乎是为数不多的PnP选项之一。它非常适合于查看单个流。但是,当您尝试从一个URI切换到第二个URI时,最终的结果是,您将两个流中的帧交错到我的WPF页面上的同一图像对象中。两个流都是活动的,而不仅仅是前一个流的缓存 不管我怎么做,第一个流似乎不会消失,解码器中的stopstream方法除了设置一个布尔值外,什么都不会做 下面是我如何使用该库的伪代码。我做错什么了吗 button_click{ //Creat

这可能有点遥不可及,但我有一个WPF项目,需要流式传输MJPEG视频。位于的库似乎是为数不多的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

    }

我已经写信给译码器的作者,没有回应。我希望使用此库的其他人能够对此有所了解。

如果调用
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();
当然,您可以从中受益