Справка по декодерам WPF и MJPEG - PullRequest
2 голосов
/ 01 августа 2011

Это может показаться чем-то большим, но вот что: у меня есть проект 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 ]

3 голосов
/ 18 ноября 2011

Если вы позвоните StopStream(), немного подождете, а затем снова вызовете ParseStream, он должен закрыть первый поток и отобразить только второй.

Лучшей альтернативой будет использование только одного экземпляра MjpegDecoder для каждого потока, который вы хотите просмотреть.

Конечно, если вы не уверены, как он работает, вы можете просто загрузить код и посмотреть, как он работает.

0 голосов
/ 01 июня 2018

Хотя библиотека MJPEGDecoder великолепна, она, к сожалению, создает WPF BitmapImage и System.Drawing.Bitmap в каждом кадре.Это слишком много.

Нам нужен байтовый массив, который не зависит от платформы.Затем пользовательский интерфейс преобразует его в реальный объект Image.

Итак, я взял объект AForge.NET MJPEGStream.cs и немного его подстроил, чтобы он отправил байтовый массив.вместо растрового изображения.

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();

Конечно, посмотрите документацию , чтобы воспользоваться всеми ее функциями.

...