Согласно исходникам (C++/OpenCV), функция waitKey(), а также её специализации для Qt, Gtk и Win32 напрямую никак не связаны с видеозахватом или записью видео в файл. Единственное, в чём заключается её предназначение, это ожидание нажатия одной из клавиш на время в миллисекундах, указанное в качестве аргумента для этой самой функции.
Ожидание производится при помощи C++ функции sleep(), а также запуском соответствующего специализации диспетчера системных событий. Последний как раз и предназначен для определения факта нажатия какой-либо клавиши. Соответственно в случае с Python необходимо воспользоваться таймером или аналогом sleep() из C++.
Но без этой функции не записывает видео.
Если источником видео выступает устройство видеозахвата (камера) или поток данных из сети, то необходимо иметь в виду, что на формирование каждого последующего кадра требуется определённое время. Время это необязательно константное, однако в примерах OpenCV, так или иначе затрагивающих тему работы с видеозахватом, присутствует такой вызов waitKey():
waitKey(40);
Число 40 получается по нехитрой формуле:
1000 миллисекунд / 25 кадров в секунду = 40 миллисекунд
В данном примере 40 миллисекунд - это время, которое необходимо подождать, прежде чем обращаться за следующим кадром. Если же попытаться обратиться к устройству видеозахвата раньше установленного срока, то получим пустой (повреждённый) кадр, который, если отправить его на запись, приведёт к порче уже всего видеофайла.
intervalсекунд действие выполнять, то можно что-то вродеtime.sleep(interval - time.monotonic() % interval)вызвать. Как правильно сделать временный цикл? – jfs Sep 13 '17 at 08:05time.sleep()не ждёт чтения с клавиатуры, поэтому в общем случае её нельзя рассматривать заменойwaitKey(). Автор может попробовать time.sleep() и если в их случае это помогает, то достаточно упомянуть о time.sleep() существовании в вашем ответе. – jfs Sep 13 '17 at 09:06waitKey()запускает диспетчер событий, поэтому "фризов" не будет при любой длительности ожидания. Никто не оправдывает "порчу данных", просто в OpenCV видеозахват - это всего лишь дополнительный и не целевой инструмент для того, чтобы особо не заморачиваться и просто получить доступ к кадрам. – Sep 13 '17 at 12:24event.wait(timeout)) – jfs Sep 13 '17 at 13:48sleep()будет "фризить" GUI (С++/однопоток, за аналог для Python не знаю), но при этом не будет "фризить" сам захват кадров. Поэтому, если не используется GUI, то всё будет работать и соsleep(), поскольку задача сводится к тому, чтобы буквально ничего не делать и просто немного подождать. Что касаемо того, следовало ли сделать изначальный метод блокирующим или нет, тут можно согласиться, а можно и нет. Например, если использовать OpenCV совместно с Qt, то вызывать простоsleep()- плохое решение по понятным причинам. Аналогично, наверное, с Gtk и с WinApi. – Sep 13 '17 at 15:28