我有一个现有的C#winforms应用程序,该应用程序通过VLC.net(rtsp)通过4个IP摄像机提供实时视频流,我们每100ms拍摄一次快照进行分析。一切正常。现在,我们想用FFmpeg代替VLC.net来执行此操作,以便(更快)捕获的帧具有更多的可能性。我已经有一个可用的ffmpeg包装器,它通过事件将每个帧作为位图发送。然后,我有一个类“ FmpegVideoWindow”从PictureBox继承,在这里我们侦听传入的帧并将它们绘制在PictureBox上。因此,我们现在使用的是一个图片框,而不是使用表单中的vlc-control:
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也不需要这样做。 预先谢谢你。