MSS повторяет кадры при записи экрана компьютера - PullRequest
1 голос
/ 14 мая 2019

Я пытаюсь записать экран на моем MacBook Pro и сохранить его в видеофайле. Это не конечная цель, но это первый шаг, и я замечаю то, на что я установил частоту записи, я получаю только половину из этого в моем последнем видео. например если я установлю его на 30, я получу видео, сохраненное в 30 кадрах в секунду, но каждый кадр будет повторяться. кадры 1 и 2 будут одинаковыми, рамки 3 и 4 будут одинаковыми; так далее и так далее. Поэтому я получаю только 15 кадров.

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

import numpy as np
import cv2
from mss import mss
from PIL import Image

bbox = {'top': 270, 'left': 100, 'width': 600, 'height': 150}

sct = mss()

#fourcc = cv2.VideoWriter_fourcc(*'XVID')
out = cv2.VideoWriter('/Users/vipulrajan/Downloads/DinoGame/output.avi',cv2.VideoWriter_fourcc(*'XVID'), 60.0, (1200,300), isColor=0)

while 1:

    sct_img = sct.grab(bbox)
    im = np.array(sct_img)[:,:,2] #converting the image to grayscale

    out.write(im)

Я также попытался добавить и удалить функцию cv2.waitKey в коде, и это не имеет никакого значения. Кто-нибудь знает, что может быть причиной такого поведения?

1 Ответ

0 голосов
/ 09 июля 2019

Хм, похоже, этот код работает как положено.Возможно, вы могли бы попробовать и опубликовать видео, чтобы помочь нам понять, что вы видите?

import time

import cv2
import numpy as np
from PIL import Image
from mss import mss

frame_rate = 30
width, height = 600, 150
out = cv2.VideoWriter('output.avi',
                      cv2.VideoWriter_fourcc(*'XVID'),
                      frame_rate,
                      (width, height),
                      isColor=0)
bbox = {'top': 270, 'left': 100, 'width': width, 'height': height}

with mss() as sct:
    start = time.monotonic()
    while 'capturing':
        im = np.array(sct.grab(bbox))[:,:,2]  # Convert to grayscale
        out.write(im)
        time.sleep(1 / frame_rate)

        if time.monotonic() - start > 3:  # 3 seconds
            break

out.release()
...