WPF和MJPEG解码器帮助

时间:2011-08-01 17:35:35

标签: c# wpf mjpeg decoder

这可能只是一个长镜头,但是这里有:我有一个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

    }

我写信给解码器作者没有回应。我希望使用这个库的其他人能够阐明这一点。

2 个答案:

答案 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以使其所有功能受益。