Capture camCapter = null; int delay; Mat frame; Timer PlayerTimer = new Timer(); public Form1() { InitializeComponent(); try { camCapter = new Capture(@"影片位置"); } catch (NullReferenceException ex) { MessageBox.Show(ex.Message); } camCapter.SetCaptureProperty(Emgu.CV.CvEnum.CapProp.PosFrames, 2241); delay = (int)(1000 / (camCapter.GetCaptureProperty(Emgu.CV.CvEnum.CapProp.Fps))); PlayerTimer.Interval = delay; PlayerTimer.Tick += Time_Tick; } private void Time_Tick(object sender, EventArgs e) { if (frame != null){frame.Dispose();} frame = camCapter.QueryFrame(); if (frame == null) { Debug.WriteLine("Video End"); PlayerTimer.Stop(); } imageBox1.Image = frame; }
下面兩行程式分別是顯示影片的FPS跟設定從第幾個frame播放
camCapter.GetCaptureProperty(Emgu.CV.CvEnum.CapProp.Fps); camCapter.SetCaptureProperty(Emgu.CV.CvEnum.CapProp.PosFrames, 2241);
timer.Interval的單位是ms所以可以用第19行算出每多少個Tick觸發一次
因為每秒產生/拋棄數十個frame的速度太快,如果不先將拋棄的frame dispose掉,
記憶體會持續被佔用直到下一次GC.collect()被觸發。
沒有留言:
張貼留言