Memory 如何解决Accord.Video.FFMPEG内存泄漏问题

Memory 如何解决Accord.Video.FFMPEG内存泄漏问题,memory,ffmpeg,mp4,Memory,Ffmpeg,Mp4,我正在开发一个数字广告牌应用程序,允许客户在触摸屏上来回点击 屏幕0->触摸->屏幕1->触摸->屏幕2->超时->屏幕0 如果没有交互,屏幕0将无限循环。每个屏幕都运行自己的MP4文件 但是,对于Screen 1的每个运行周期,它都会占用内存,应用程序很快就会崩溃 是因为VideoFileSource的视频对象未被正确处理,还是因为video_NewFrame中存在线程问题 因为我偶尔会遇到这样的错误——“在创建windows句柄之前,无法对控件调用Invoke或BeginInvoke” 我正

我正在开发一个数字广告牌应用程序,允许客户在触摸屏上来回点击

屏幕0->触摸->屏幕1->触摸->屏幕2->超时->屏幕0

如果没有交互,屏幕0将无限循环。每个屏幕都运行自己的MP4文件

但是,对于Screen 1的每个运行周期,它都会占用内存,应用程序很快就会崩溃

是因为VideoFileSource的视频对象未被正确处理,还是因为video_NewFrame中存在线程问题

因为我偶尔会遇到这样的错误——“在创建windows句柄之前,无法对控件调用Invoke或BeginInvoke”

我正在使用VS2017.NET Framework 4.5和Accord.NET 3.8版的Accord.Video.FFMPEG

屏幕0 MP4大小-5.5MB 屏幕1 MP4大小-5.6MB 屏幕2 MP4尺寸-7.0MB

这是我的密码:-

Bitmap image;
VideoFileSource video;
int screenIdx = 0;
bool enableClicking = true;
bool isTimeOut = false;
string VideoPath = @"d:\KioskApp\Bkgrnd\"

public frmMain()
    {
        InitializeComponent(); 
        StartFirstScreen();
        tmrScreen01.Interval = 10000;
        tmrScreen02.Interval = 10000;
    }
    
     private void StartFirstScreen()
    {
        try
        {
            string fileName = VideoPath + Screen00();
            video = new VideoFileSource(fileName);
            video.PlayingFinished += new Accord.Video.PlayingFinishedEventHandler(video_Finished);
            video.NewFrame += new Accord.Video.NewFrameEventHandler(video_NewFrame);
            video.Start();
            screenIdx = 1;
        }
        catch (Exception ex)
        {
            string strErrMsg = strMsg + " - " + ex.Message;
            MessageBox.Show(strErrMsg);
        }
    }
    
    private void video_NewFrame(object sender, Accord.Video.NewFrameEventArgs eventArgs)
    {
        try
        {
            Invoke(new Action(() =>
            {
                System.Drawing.Image OldImage;
                OldImage = pictureBox1.Image;
                pictureBox1.Image = AForge.Imaging.Image.Clone(eventArgs.Frame);
                if (OldImage != null)
                    OldImage.Dispose();
            }));    
        }
        catch (Exception ex)
        {
            var strErrMsg = "video_NewFrame - " + ex.Message;
            MessageBox.Show(strErrMsg);
        }
    }
    
     private void video_Finished(object sender, Accord.Video.ReasonToFinishPlaying reason)
    {
        try
        {
            if (screenIdx == 1)
            {
                video.PlayingFinished -= video_Finished;
                video.NewFrame -= video_NewFrame;
                video = null;                    
                StartFirstScreen();
                return;
            }
            enableClicking = true;

        }
        catch (Exception ex)
        {
            var strErrMsg = "video_Finished - " + ex.Message;
            MessageBox.Show(strErrMsg);

        }
    }
    
    void startLastScreen()
    {
        string fileName = string.Empty;
        video.SignalToStop();
        fileName = VideoPath + Screen02();
        screenIdx = 0;
        if (object.ReferenceEquals(null, video))
        {
            video = new VideoFileSource(fileName);
        }
        else
        {
            video = null;
            video = new VideoFileSource(fileName);
        }

        video.PlayingFinished += new Accord.Video.PlayingFinishedEventHandler(video_Finished);
        video.NewFrame += new Accord.Video.NewFrameEventHandler(video_NewFrame);
        video.Start();
        enableClicking = false;
    }
    
    private void pictureBox1_Click(object sender, EventArgs e)
    {
        if (!enableClicking && screenIdx != 1) return;

        tmrScreen01.Stop();
        tmrScreen02.Stop();
        
        //  Check clickable area before allow to proceed to the next screen     
        string fileName = string.Empty;
        video.SignalToStop();
        video.Stop();

        if (screenIdx == 0)
        {
            fileName = VideoPath + Screen00();
            screenIdx = 1;
        }
        else if (screenIdx == 1)
        {
            fileName = VideoPath + Screen01();
            screenIdx = 2;
            
        }
        else if (screenIdx == 2)
        {
            fileName = VideoPath + Screen02();
            screenIdx = 0;
           
        }

        if (object.ReferenceEquals(null, video))
        {
            video = new VideoFileSource(fileName);
        }
        else
        {
            video = null;
            video = new VideoFileSource(fileName);
        }
        video.PlayingFinished += new Accord.Video.PlayingFinishedEventHandler(video_Finished);
        video.NewFrame += new Accord.Video.NewFrameEventHandler(video_NewFrame);
        enableClicking = false;
        isTimeOut = false;
        video.Start();
    }