2011-10-05 27 views
6

Khi tôi phát lại video bằng Emgu, nó phát lại nhanh hơn bình thường. Đây là mã có liên quan.Emgu Capture phát video cực nhanh

public Form1() 
{ 
    InitializeComponent(); 

    _capture = new Capture("test.avi"); 
    Application.Idle += RefreshFrames; 
} 

protected void RefreshFrames(object sender, EventArgs e) 
{ 
    imageBox.Image = _capture.QueryFrame(); 
} 

Tôi đã cố gắng đặt FPS bằng phương pháp SetCaptureProperty trên đối tượng Capture, nhưng nó vẫn phát trong chuyển động siêu nhanh.

Trả lời

11

Ứng dụng Xử lý ứng dụng được gọi khi không có chức năng nào khác đang được chương trình bạn gọi và máy tính của bạn có tài nguyên miễn phí. Nó không được thiết kế để được gọi trong các khoảng thời gian đã định. Thay vào đó hãy đặt hẹn giờ và sử dụng chức năng đánh dấu để đặt tốc độ phát lại.

Timer My_Time = new Timer(); 
int FPS = 30; 

public Form1() 
{ 
    InitializeComponent(); 

    //Frame Rate 
    My_Timer.Interval = 1000/FPS; 
    My_Timer.Tick += new EventHandler(My_Timer_Tick); 
    My_Timer.Start(); 
    _capture = new Capture("test.avi"); 
} 

private void My_Timer_Tick(object sender, EventArgs e) 
{ 
    imageBox.Image = _capture.QueryFrame(); 
} 

Đoạn mã trên phải làm những gì bạn muốn, Điều chỉnh FPS để đạt được tốc độ phát lại mong muốn. Nếu bạn cần bất cứ điều gì khác cho tôi biết,

Cheers

Chris

+0

Tuyệt vời! Cảm ơn. Chỉ nghĩ rằng bạn đang thiếu là My_Timer.Start() – a432511

+0

Opps oh yes ngớ ngẩn tôi :) sửa chữa Cheers – Chris

+0

@Chris Bộ hẹn giờ này có độ phân giải đầy đủ không? – gonzobrains

0
public Form1() 
{ 
    InitializeComponent(); 

    _capture = new Capture("test.avi"); 
    Application.Idle += RefreshFrames; 
} 

protected void RefreshFrames(object sender, EventArgs e) 
{ 
    imageBox.Image = _capture.QueryFrame(); 

    Thread.sleep(1000/FrameRate); 
} 

Sử dụng Thread.Sleep để thiết lập phát lại tốc độ thời gian thực. bạn có thể dễ dàng đạt được điều đó bằng cách sử dụng này :)