Emgu Capture воспроизводит видео очень быстро

Когда я воспроизвожу видео с помощью Emgu, оно воспроизводится намного быстрее, чем должно. Вот соответствующий код.

public Form1()
{
    InitializeComponent();

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

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

Я попытался установить FPS с помощью метода SetCaptureProperty для объекта Capture, но он по-прежнему воспроизводится в сверхбыстром движении.


person a432511    schedule 05.10.2011    source источник


Ответы (2)


Дескриптор Application.Idle вызывается, когда никакая другая функция не вызывается вашей программой и на вашем компьютере есть свободные ресурсы. Он не предназначен для вызова в установленные периоды. Вместо этого установите таймер и используйте его функцию тика, чтобы установить скорость воспроизведения.

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

Приведенный выше код должен делать то, что вы хотите, отрегулируйте FPS, чтобы получить желаемую скорость воспроизведения. Если вам нужно что-нибудь еще, дайте мне знать,

Ваше здоровье

Крис

person Chris    schedule 05.10.2011
comment
Потрясающий! Спасибо. Единственное, что вам не хватает, это My_Timer.Start() - person a432511; 06.10.2011
comment
@Chris У этого таймера адекватное разрешение? - person gonzobrains; 20.07.2013
comment
@gonzobrains да, он имеет миллисекундную точность, разрешение которой полностью зависит от процессора, но это означает, что вы можете воспроизводить 1000 кадров в секунду, если вам требуется более высокая скорость, вы можете использовать класс секундомера. Таймер: msdn.microsoft.com/en-us/library/ system.timers.timer.aspx Секундомер: msdn .microsoft.com/en-us/library/ stackoverflow.com/questions/7137121/ - person Chris; 30.07.2013

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

Используйте thread.sleep, чтобы установить скорость воспроизведения в реальном времени. вы можете легко добиться этого, используя это :)

person Nuwan    schedule 01.08.2014