2012-09-15 151 views
0

我試圖將捕獲的視頻寫入使用VideoWriter和Capture從emguCV, 的文件中,問題是:如果我播放剛錄製的視頻播放快或慢。 我該如何解決這個問題,所以我錄製的視頻將會實時播放/錄製,所以不要放慢速度或加快速度?C#emgu cv:錄製的視頻回放到快/慢

這是我的代碼:


Capture capture = new Capture(); 
    VideoWriter vw; 
    Size ms_hd_cam_5000_resolution = new Size(1280, 720); 
    Label width_label, height_label, recordingTime; 
    Button record; 
    Thread isRecording; 
    Image<Bgr, byte> imageFrame; 

    int seconds; 
    int minutes; 

    public Form1() 
    { 
     InitializeComponent(); 
     InitializeConrols(); 

     //Cam_Properties 
     capture.SetCaptureProperty(Emgu.CV.CvEnum.CAP_PROP.CV_CAP_PROP_FRAME_WIDTH, 1280); 
     capture.SetCaptureProperty(Emgu.CV.CvEnum.CAP_PROP.CV_CAP_PROP_FRAME_HEIGHT, 720); 
     capture.SetCaptureProperty(Emgu.CV.CvEnum.CAP_PROP.CV_CAP_PROP_FPS, 30); 

     //VideoWriting_Properties 
     vw = new VideoWriter("test.avi", 30, ms_hd_cam_5000_resolution.Width, ms_hd_cam_5000_resolution.Height, true); 


    } 

    private void InitializeConrols() 
    { 
     this.BackColor = Color.Black; 
     this.ClientSize = new Size(ms_hd_cam_5000_resolution.Width + 25, ms_hd_cam_5000_resolution.Height + 75); 
     this.Picture_box.Size = ms_hd_cam_5000_resolution; 

     width_label = new Label(); 
     width_label.Location = new Point(10, ms_hd_cam_5000_resolution.Height + 15); 
     width_label.ForeColor = Color.White; 
     width_label.Text = "width: " + capture.Width.ToString(); 

     height_label = new Label(); 
     height_label.Location = new Point(10, ms_hd_cam_5000_resolution.Height + 40); 
     height_label.ForeColor = Color.White; 
     height_label.Text = "height: " + capture.Height.ToString(); 

     recordingTime = new Label(); 
     recordingTime.Location = new Point(225, ms_hd_cam_5000_resolution.Height + 40); 
     recordingTime.ForeColor = Color.White; 
     recordingTime.Text = "time: 0"; 

     record = new Button(); 
     record.Location = new Point(225, ms_hd_cam_5000_resolution.Height + 15); 
     record.ForeColor = Color.White; 
     record.Text = "record"; 

     Controls.Add(width_label); 
     Controls.Add(height_label); 
     Controls.Add(record); 
     Controls.Add(recordingTime); 

     record.Click += Record_Click; 
    } 

    private void Form1_Load(object sender, EventArgs e) 
    { 
     captureCamImage(sender, e); 
     Application.Idle += captureCamImage; 
    } 

    private void Record_Click(object sender, EventArgs e) 
    { 
     if (isRecording == null) 
     { 
      recordingTime.Text = "Time: 0"; 
      record.Text = "stop"; 
      isRecording = new Thread(this.Record); 
      isRecording.Start(); 
     } 
     else 
     { 
      record.Text = "record"; 
      isRecording = null; 
     } 
    } 

    private void captureCamImage(object sender, EventArgs e) 
    { 
     imageFrame = capture.QueryFrame(); 
     Picture_box.Image = imageFrame.ToBitmap(); 
     recordTime(); 
    } 

    private void recordTime() 
    { 
     recordingTime.Text = "Time: " + minutes.ToString() + " : " + seconds.ToString(); 
    } 

    private void Record() 
    { 
     Stopwatch stopWatch = new Stopwatch(); 
     stopWatch.Reset(); 
     stopWatch.Start(); 
     while (isRecording != null) 
     { 
      seconds = stopWatch.Elapsed.Seconds; 
      minutes = stopWatch.Elapsed.Minutes; 

      vw.WriteFrame(imageFrame); 
      Thread.Sleep(1000/30); 
     } 
    } 

回答

3

嘗試減少FPS value.In

vw = new VideoWriter("test.avi", 30, ms_hd_cam_5000_resolution.Width, ms_hd_cam_5000_resolution.Height, true); 

代替30幀/秒提供一個較低的值。

0

代碼沒有意義。掛到Application.Idle不是一個好主意。

將代碼扔到垃圾箱,有1個記錄線程capture.QueryFrame()並立即保存。
地獄甚至不打擾一個線程使用定時器,根據FPS設置它。這不會是確切的,但比現在好。