Запись видео слишком быстрая в opencv python

Я снимаю свой экран с помощью OpenCV в Windows. Он работает нормально, но когда я пытаюсь воспроизвести захваченное видео, оно воспроизводится слишком быстро. т. е. я захватываю видео в течение 60 секунд, но когда я его воспроизвожу, OpenCV записывает дольше и ускоряется, чтобы уместить дополнительное время в 60 секунд видео, т. е. ускоренное

import cv2
import numpy as np
import pyautogui

time = 10
# display screen resolution, get it using pyautogui itself
SCREEN_SIZE = tuple(pyautogui.size())
# define the codec
fourcc = cv2.VideoWriter_fourcc(*"XVID")
# frames per second
fps = 30.0
# create the video write object
out = cv2.VideoWriter("output.avi", fourcc, fps, (SCREEN_SIZE))

for i in range(int(time * fps)):
    # make a screenshot
    img = pyautogui.screenshot()
    # convert these pixels to a proper numpy array to work with OpenCV
    frame = np.array(img)
    # convert colors from BGR to RGB
    frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
    # write the frame
    out.write(frame)

# make sure everything is closed when exited
cv2.destroyAllWindows()
out.release()

Я пробовал разные fps, которые не сильно изменились. Пожалуйста, дайте мне знать, почему это происходит. Любые ответы и помощь приветствуются.

@Aaron Спасибо за совет, но я не понимаю, как внедрить решение в свой скрипт.

Digitas Merero 08.11.2022 17:44

мой плохой .. Я не полностью прочитал код. вы не пытаетесь ждать между созданием скриншотов, поэтому они будут делаться так быстро, как только могут. Вам нужно как-то подождать (например, time.sleep) между захватом кадров.

Aaron 08.11.2022 17:52
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
2
100
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

вам нужно подождать между съемкой снимков экрана. Может быть более идеальное решение, но этого, вероятно, будет достаточно:

from time import time, sleep
record_time = 10 #don't overwrite the function we just imported
start_time = time()
for i in range(int(record_time * fps)):
    # wait for next frame time
    next_shot = start_time + i/fps
    wait_time = next_shot - time()
    if wait_time > 0:
        sleep(wait_time)
    # make a screenshot
    img = pyautogui.screenshot()
    ...

ноты

  • time.time разрешение зависит от ОС. Убедитесь, что вы получили число с долями секунды. В противном случае вам может понадобиться использовать что-то вроде time.perf_counter или time.time_ns.
  • Это не может заставить цикл работать быстрее, только медленнее. Если вы не можете получать кадры достаточно быстро, запись будет длиться дольше, чем record_time секунд, а воспроизведение будет казаться «ускоренным». единственный способ исправить это — найти более быстрый способ получения скриншотов (например, уменьшить разрешение?).

Спасибо! Это очень полезно, что касается второй проблемы, не знаете ли вы, как принудительно завершить запись после рекордного_времени? Это может помочь предотвратить более длительное время записи

Digitas Merero 08.11.2022 18:40
if time() > start_time + record_time: break
Aaron 08.11.2022 19:29

@DigitasMerero обсуждение более быстрых скриншотов: stackoverflow.com/questions/3586046/…

Aaron 08.11.2022 19:59

Абсолютно высокая производительность достигается при прямом доступе к API захвата графического процессора, но это намного сложнее... (например, это)

Aaron 08.11.2022 20:00

Другие вопросы по теме