2016年7月6日 星期三

[emguCV]播放影片---臨時筆記(未整理)

 先上code

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()被觸發。

沒有留言:

張貼留言