Я снимаю свой экран с помощью 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, которые не сильно изменились. Пожалуйста, дайте мне знать, почему это происходит. Любые ответы и помощь приветствуются.
мой плохой .. Я не полностью прочитал код. вы не пытаетесь ждать между созданием скриншотов, поэтому они будут делаться так быстро, как только могут. Вам нужно как-то подождать (например, time.sleep) между захватом кадров.






вам нужно подождать между съемкой снимков экрана. Может быть более идеальное решение, но этого, вероятно, будет достаточно:
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 секунд, а воспроизведение будет казаться «ускоренным». единственный способ исправить это — найти более быстрый способ получения скриншотов (например, уменьшить разрешение?).Спасибо! Это очень полезно, что касается второй проблемы, не знаете ли вы, как принудительно завершить запись после рекордного_времени? Это может помочь предотвратить более длительное время записи
if time() > start_time + record_time: break@DigitasMerero обсуждение более быстрых скриншотов: stackoverflow.com/questions/3586046/…
Абсолютно высокая производительность достигается при прямом доступе к API захвата графического процессора, но это намного сложнее... (например, это)
@Aaron Спасибо за совет, но я не понимаю, как внедрить решение в свой скрипт.