2011-10-05 17 views
6

Kiedy odtwarzam wideo za pomocą Emgu, odtwarza się znacznie szybciej niż powinien. Oto odpowiedni kod.Emgu Capture odtwarza wideo super szybko

public Form1() 
{ 
    InitializeComponent(); 

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

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

Próbowałem ustawić FPS przy użyciu metody SetCaptureProperty na obiekcie robienia, ale to nadal odgrywa w bardzo szybki ruch.

Odpowiedz

11

Uchwyt Application.Idle jest wywoływany, gdy żadna inna funkcja nie jest wywoływana przez program, a komputer ma wolne zasoby. Nie jest przeznaczony do wywoływania w określonych okresach. Zamiast tego ustaw timer i użyj funkcji tick, aby ustawić szybkość odtwarzania.

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(); 
} 

Powyższy kod powinien zrobić, co chcesz, Dostosuj FPS, aby uzyskać żądaną szybkość odtwarzania. Jeśli potrzebujesz czegoś innego daj mi znać,

Cheers

Chris

+0

Awesome! Dzięki. Jedyne, czego ci brakuje, to My_Timer.Start() – a432511

+0

Opps o tak, głupio mnie :) poprawiono Cheers – Chris

+0

@Chris Czy ten timer ma odpowiednią rozdzielczość? – 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); 
} 

Zastosowanie Thread.Sleep ustawić odtwarzać prędkość czasie rzeczywistym. możesz łatwo osiągnąć to używając używając tego :)