Как отобразить последовательность кадров на экране с заданным FPS без пропусков?
Доброго времени суток!
Есть задача записать камерой кадры, отображаемые на проекторе.
Камера и проектор аппаратно синхронизированы.
Отображение кадров происходит с помощью cv::imshow (без openGL).
Видеозахват дает 50fps, но не равномерно (кадры выдаются по схеме 37мс -> кадр -> 3мс -> кадр. Поэтому цикл видеозахвата в качестве часов использовать не удается, происходят разрывы изображения (tearing) и вообще мрак какой-то.
При использовании программного таймера (std::chrono) периодически теряются кадры (скорее всего эффект стробоскопа).
Подскажите пожалуйста как отобразить последовательность кадров на экране с заданным FPS без пропусков. (Например MPC-HC так почти умеет при включенном VSYNC, хотя порой теряет кадр)
Забуферезуйте пару кадров. Воспользуйтесь fifo очередью, начинайте отображать когда в ней будет 2-3 кадра. По таймеру берёте кадр из очереди и показываете, видеозахват кладёт в очередь кадры когда захочет.
Кадры из буфера и так. Они не с видеозавхвата.
По таймеру, к сожалению, происходят описанные выше явления.
Проблема в том, что я не могу синхронизировать таймер с частотой выдачи видеокадров.
Тогда по другому - сохраняйте для каждого кадра его время. А по таймеру берите среди всех кадров последний, который был до текущего времени (т. е. при необходимости - пропускайте пару кадров или наоборот - берите старый, если новых не было).