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()被觸發。
沒有留言:
張貼留言