Я пытаюсь прочитать видео (.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;
}