C # Почему моя частота кадров видео медленнее при использовании OpenCV VideoCapture? - PullRequest
0 голосов
/ 16 апреля 2019

Я пытаюсь прочитать видео (.mp4) из файла и показать его на поле Imagebox в формах. Когда я определяю общее время воспроизведения, оно больше, чем фактическая длина видео. Например, если видео действительно 10 секунд, оно воспроизводится в течение 12-13 секунд. Это почему? Частота кадров для моего видео составляет 31 кадр / с

Я пытался убедиться, что переменная fps уже имеет правильную частоту кадров.

private void Play_Video(string filePath)
{
    VideoCapture cameraCapture = new VideoCapture(filePath);

    var stopwatch = new Stopwatch();
    stopwatch.Start();
    while (true)
    {
        Mat m = new Mat();
        cameraCapture.Read(m);
        if (!m.IsEmpty)
        {
            imageBox1.Image = m;
            double fps = cameraCapture.GetCaptureProperty(CapProp.Fps);
            Thread.Sleep(1000 / Convert.ToInt32(fps));
        }
        else
        {
            break;
        }
    }
    stopwatch.Stop();
    double elapsed_time = stopwatch.ElapsedMilliseconds * 0.001;
    // My elapsed_time here shows about 13 seconds, when the actual length of video is 10 seconds. Why?
}

НОВОЕ РЕДАКТИРОВАНИЕ: Я обновил поиск кадров в отдельной функции, чтобы не вызывать задержку во время рендеринга, но задержка все еще составляет несколько секунд. Например, 30 секунд видео воспроизводится в течение 32-33 секунд. Мой обновленный код:

private void Play_Video(List<Mat> frames, double fps, Emgu.CV.UI.ImageBox imageBox)
{
    var stopwatch = new Stopwatch();
    stopwatch.Start();

    for (int i = 0; i < frames.Count; i++)
    {
        imageBox.Image = frames[i];
        Thread.Sleep(1000 / Convert.ToInt32(fps));
    }
    stopwatch.Stop();
    double elapsed_time = stopwatch.ElapsedMilliseconds * 0.001;
}
...