Исключение удаления изображения PictureBox

#c# #ffmpeg

#c# #ffmpeg

Вопрос:

Недавно я хотел попробовать AForge.NET поскольку я обнаружил, что это довольно просто, я решил выполнить простое воспроизведение видео с использованием Video.Из него удалено пространство имен FFMPEG, чтобы я мог поместить каждый кадр непосредственно в PictureBox. Это само по себе работает хорошо, но я хотел удалить каждое изображение после того, как оно не было важным, потому что оно занимало около 1,5 ГБ памяти без видимой причины. Вот где началась моя проблема. По какой-то причине иногда это просто выдает это исключение (обычно при изменении размера окна). Я не совсем уверен, чем это может быть вызвано. Возможно, это действительно глупая ошибка. Я предполагаю, что это могло быть вызвано таймером, но я мог бы сделать совершенно другую ошибку и просто не могу ее увидеть. Это исключение, которое я продолжаю получать:

     ************** Exception Text **************
System.ArgumentException: Parameter is not valid.
   at System.Drawing.Image.get_Width()
   at System.Drawing.Image.get_Size()
   at System.Windows.Forms.PictureBox.ImageRectangleFromSizeMode(PictureBoxSizeMode mode)
   at System.Windows.Forms.PictureBox.OnPaint(PaintEventArgs pe)
   at System.Windows.Forms.Control.PaintWithErrorHandling(PaintEventArgs e, Int16 layer)
   at System.Windows.Forms.Control.WmPaint(Messageamp; m)
   at System.Windows.Forms.Control.WndProc(Messageamp; m)
   at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Messageamp; m)
   at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Messageamp; m)
   at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
  

Это код (я понимаю, что общедоступные переменные не годятся, я просто тестирую, конечно):

 public long i = 0;
public Bitmap img;
public VideoFileReader reader;
public System.Timers.Timer aTimer;

public void render(object source, ElapsedEventArgs e)
{
    if (img != null) img.Dispose();
    if (i < reader.FrameCount)
    {
        img = reader.ReadVideoFrame();
        pictureBox1.Image = img;
    }
    i  ;
}

private void button1_Click(object sender, EventArgs e)
{
    reader = new VideoFileReader();
    aTimer = new System.Timers.Timer();
    reader.Open("d:\result.avi");
    aTimer.Elapsed  = new ElapsedEventHandler(render);
    aTimer.Interval = reader.FrameRate;
    aTimer.Enabled = true;
}
  

Ответ №1:

Я думаю, я что-то пропустил, когда дело доходит до таймеров, они, похоже, не работают наилучшим образом для этого случая. Для людей, которые хотели бы использовать AForge.В сети для воспроизведения это может быть решением. Я отключил таймеры и вместо этого использовал BackgroundWorker с секундомером, пока никаких проблем не возникало.

     public Image img;
    public VideoFileReader reader;

    private void button1_Click(object sender, EventArgs e)
    {
        reader = new VideoFileReader();
        reader.Open("d:\result.avi");
        backgroundWorker1.RunWorkerAsync();
    }

    private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
    {
        Stopwatch watch = new Stopwatch();
        for (i=0;i<reader.FrameCount;i  )
        {
            img = pictureBox1.Image;
            pictureBox1.Image = reader.ReadVideoFrame();
            if (img != null) img.Dispose();
            watch.Start();
            while (watch.ElapsedMilliseconds < reader.FrameRate);
            watch.Stop();
            watch.Reset();
        }
    }