2016-10-22 3 views
0

私は最近、非常にシンプルであることを発見してからAForge.NETを試したかったので、Video.FFMPEG名前空間を使って単純なビデオ再生を行うことにしました。 。それだけではうまくいきますが、重要でない後にすべてのイメージを処分したかったのは、明白な理由がないのに約1.5GBのメモリが必要だったからです。それが私の問題が始まったところです。なんらかの理由で、この例外をスローすることがあります(通常はウィンドウのサイズを変更するとき)。私は本当にそれが原因で起こり得るかどうかはわかりません。たぶんそれは本当にばかげた過ちです。私の推測では、それはタイマーによって引き起こされる可能性があるが、私は完全に異なる間違いを犯した可能性があり、それを見ることはできない。これは私が取得しておく例外です:picturebox image dispose exception

************** 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; 
} 

答えて

0

私は逃したと思いますタイマーになると何か、彼らはこの場合のために最善を尽くすように見えません。再生のためにAForge.NETを使用したい人にとって、これは解決策かもしれません。タイマーを止め、代わりにStopWatchで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(); 
     } 
    }