首页 > 解决方案 > C# FFmpeg 位图帧到图片框

问题描述

我有一个现有的 C# winforms 应用程序,其中包含通过 VLC.net (rtsp) 来自 4 个 ip 摄像机的实时视频流,我们每 100 毫秒拍摄一次快照以进行分析。这工作正常。现在我们喜欢用 FFmpeg 代替 VLC.net 来实现(更快)捕获帧的更多可能性。我已经有一个工作的 ffmpeg 包装器通过事件将每一帧作为位图发送。然后我有一个继承自PictureBox的类“FmpegVideoWindow”,这里我们监听传入的帧并将它们绘制在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 也不需要这样做。先感谢您。

标签: c#ffmpeg

解决方案


推荐阅读