pictureBox图像处理异常

时间:2016-10-22 17:46:41

标签: c# ffmpeg

我最近想尝试AForge.NET,因为我发现它非常简单,所以我决定使用Video.FFMPEG命名空间进行一些简单的视频播放,所以我可以将每个帧直接放在pictureBox上。仅此一点效果很好,但我想在不重要之后处理每个图像,因为它没有明显的原因需要大约1.5GB的内存。这就是我的问题开始的地方。出于某种原因,它有时会抛出此异常(通常在调整窗口大小时)。我不确定它可能是由什么引起的。也许这真的是一个愚蠢的错误。我的猜测是它可能是由计时器引起的,但我本可以做一个完全不同的错误而且看不到它。这是我不断获得的例外:

    ************** 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(Message& m)
   at System.Windows.Forms.Control.WndProc(Message& m)
   at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
   at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& 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 个答案:

答案 0 :(得分:0)

我想在计时器方面我错过了一些东西,但对于这种情况,它们似乎并不是最好的。对于想要使用AForge.NET进行播放的人来说,这可能是一个解决方案。我推迟了计时器并使用了带秒表的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();
        }
    }