C#FFmpeg位图帧到图片框

时间:2019-01-08 09:26:48

标签: c# ffmpeg

我有一个现有的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也不需要这样做。 预先谢谢你。

0 个答案:

没有答案