2

这可能有点远,但这里有:我有一个 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

    }

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

4

2 回答 2

3

如果您调用StopStream(),请稍等,然后ParseStream再次调用,它应该关闭第一个流,并且只显示第二个流。

MjpegDecoder更好的选择是对您想要查看的每个流仅使用一个实例。

当然,如果你不确定它是如何工作的,你可以下载代码,看看它是如何工作的。

于 2011-11-18T19:37:41.160 回答
2

尽管 MJPEGDecoder 库很棒,但不幸的是,它在每一帧都创建了 WPF BitmapImage 和 System.Drawing.Bitmap。这太过分了。

我们需要的是一个独立于平台的字节数组。然后由 UI 将其转换为实际的 Image 对象。

因此,我采用了AForge.NET 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();

当然,请查看文档以使其所有功能受益。

于 2018-06-01T18:59:10.540 回答