У меня есть приложение C # winforms с живыми видеопотоками с 4 ip-камер через VLC.net (rtsp), и каждые 100 мс мы делаем снимок для анализа. Это работает нормально. Теперь нам нравится делать это вместо VLC.net с FFmpeg, чтобы иметь больше возможностей с (более быстрым) захваченным кадром. У меня уже есть рабочая оболочка ffmpeg, отправляющая каждый кадр как растровое изображение через событие. Тогда у меня есть класс «FmpegVideoWindow», наследующий от PictureBox, здесь мы слушаем входящие кадры и рисуем их на картинке. Таким образом, вместо использования vlc-control в форме, мы используем теперь Picturebox:
private void ffMpegWrapper_NewFrame1(object sender, NewFrameEventArgs e)
{
if (e != null)
{
try
{
using (Bitmap bm = new Bitmap(e.Frame))
{
frame = (Bitmap)bm.Clone();
}
}
catch
{
}
}
Invalidate();
}
protected override void OnPaint(PaintEventArgs pe)
{
base.OnPaint(pe);
if (frame != null)
{
pe.Graphics.DrawImage(frame, 0, 0, this.Width, this.Height);
//todo : disposing frame
}
}
Это нормально работает, чтобы видеть камеры вживую, они имеют @ 25fps и разрешение D1 704 * 576.
Проблема в том, что каждый раз, когда мы выполняем другую обработку, например, открываем форму (настройки) или анализируем снимок, изображение в окне картинки замораживается на короткое время. Та же программа с VLC.net никогда не была проблемой.
Процесс Ffmpeg выполняется в другом потоке. Почему управление VLC.net работает гладко в потоке GUI, а этот новый подход - нет? И что мы можем сделать, чтобы это исправить? Анализ также выполняется в другом потоке, запись результатов из анализатора в базу данных выполняется в потоке GUI. И я не люблю это менять, потому что с VLC.net этого также не нужно было делать.
Заранее спасибо.