Python opencv 屏幕录像机 fps 问题

问题描述 投票:0回答:1

我正在使用

opencv-python
制作屏幕录像机,它可以工作,但 fps 有问题,视频太快,当我降低 fps 时,视频速度变慢,我真的不知道问题是什么,因为我我是一名 JavaScript 开发人员,如果有人知道如何解决这个问题,即以 1 倍速度获得更高的 fps,请帮忙!

我的代码

import cv2
import numpy as np
import pyautogui

def start_screen_recording():
    # Define screen resolution and frame rate
    screen_width, screen_height = pyautogui.size()
    fps = 30
    bitrate = 6000  # Adjust as needed

    # Create video writer object for MP4
    fourcc = cv2.VideoWriter_fourcc(*'mp4v')  # You can also use 'x264'
    out = cv2.VideoWriter('output.mp4', fourcc, fps, (screen_width, screen_height))

    # Record screen
    try:
        while True:
            screenshot = pyautogui.screenshot()
            frame = np.array(screenshot)
            frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
            out.write(frame)

    except KeyboardInterrupt:
        # Release resources on Ctrl+C
        out.release()
        cv2.destroyAllWindows()

if __name__ == "__main__":
    start_screen_recording()
python opencv pyautogui
1个回答
0
投票

根据屏幕捕获的实际帧速率,这可能会导致视频看起来太快或太慢。您应该以较高的帧速率捕获帧,然后在发布视频时更改帧速率,以使屏幕录制看起来以常规速度进行,同时允许更高的帧速率。以下是您可以更改代码来执行此操作的方法。

import cv2
import numpy as np
import pyautogui

def start_screen_recording():
    # Define screen resolution and desired frame rate
    screen_width, screen_height = pyautogui.size()
    desired_fps = 30  # Choose your desired frame rate
    bitrate = 6000  # Adjust as needed

    # Create video writer object for MP4
    fourcc = cv2.VideoWriter_fourcc(*'mp4v')  # You can also use 'x264'
    out = cv2.VideoWriter('output.mp4', fourcc, desired_fps, (screen_width, screen_height))

    # Calculate the time interval between frames to achieve the desired frame rate
    frame_interval = 1 / desired_fps

    try:
        start_time = time.time()
        while True:
            screenshot = pyautogui.screenshot()
            frame = np.array(screenshot)
            frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
            out.write(frame)

            # Calculate the time elapsed and sleep to maintain the desired frame rate
            elapsed_time = time.time() - start_time
            sleep_time = frame_interval - elapsed_time
            if sleep_time > 0:
                time.sleep(sleep_time)
            
            start_time = time.time()

    except KeyboardInterrupt:
        # Release resources on Ctrl+C
        out.release()
        cv2.destroyAllWindows()

if __name__ == "__main__":
    start_screen_recording()

“frame_interval”计算为预期帧速率的倒数(“1 /desired_fps”),用于决定帧之间的睡眠时间以达到所需的帧速率。 “时间”模块用于确定帧和睡眠之间经过的时间,以维持指定帧速率所需的时间量。这应该确保您的视频以正常速度播放,无论您用于录制的帧速率如何。

© www.soinside.com 2019 - 2024. All rights reserved.