You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python脚本录制的屏幕视频播放速度过快问题解决咨询

解决Python录屏视频播放速度过快的问题

问题原因

你的代码存在两个核心问题导致视频播放异常:

  1. 帧率不匹配:代码设置视频输出帧率为60.0,但通过time.sleep(1/30)强制每秒仅生成30帧。播放器会按照视频元数据标记的60fps速率播放实际仅30帧的内容,直接导致播放速度翻倍。
  2. 缺失依赖模块:代码使用了time.sleep()但未导入time模块,运行时会抛出错误;且time.sleep精度有限,加上截图本身的耗时,会进一步加剧帧率偏差。

解决方案

方案1:匹配帧率设置与实际录制速率

将视频输出帧率调整为和实际录制速率一致,补充缺失模块并优化帧间隔控制逻辑:

import pyautogui
import cv2
import numpy as np
import time  # 补充导入time模块

resolution = (1920, 1080)
codec = cv2.VideoWriter_fourcc(*"XVID")
filename = "Recording.avi"
fps = 30.0  # 改为与实际录制速率匹配的30fps
out = cv2.VideoWriter(filename, codec, fps, resolution)
cv2.namedWindow("Live", cv2.WINDOW_NORMAL)
cv2.resizeWindow("Live", 480, 270)

while True:
    start_time = time.time()  # 记录当前帧开始时间
    img = pyautogui.screenshot()
    frame = np.array(img)
    frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
    out.write(frame)    
    cv2.imshow('Live', frame)   
    if cv2.waitKey(1) == ord('q'):
        break
    
    # 计算并等待剩余时间,确保每帧间隔符合30fps要求
    elapsed_time = time.time() - start_time
    sleep_time = max(0, 1/fps - elapsed_time)
    time.sleep(sleep_time)

out.release()
cv2.destroyAllWindows()

方案2:用高效截图工具实现高帧率录制

如果需要录制60fps视频,pyautogui.screenshot()速度可能不足,推荐使用mss库(截图速度更快):

  1. 先安装依赖:
pip install mss
  1. 替换后的代码:
import cv2
import numpy as np
import time
from mss import mss

resolution = (1920, 1080)
codec = cv2.VideoWriter_fourcc(*"XVID")
filename = "Recording.avi"
fps = 60.0
out = cv2.VideoWriter(filename, codec, fps, resolution)
cv2.namedWindow("Live", cv2.WINDOW_NORMAL)
cv2.resizeWindow("Live", 480, 270)

# 初始化mss截图对象
sct = mss()
monitor = {"top": 0, "left": 0, "width": resolution[0], "height": resolution[1]}

while True:
    start_time = time.time()
    # 快速截取屏幕
    sct_img = sct.grab(monitor)
    frame = np.array(sct_img)
    frame = cv2.cvtColor(frame, cv2.COLOR_BGRA2BGR)  # 转换为OpenCV支持的BGR格式
    out.write(frame)    
    cv2.imshow('Live', frame)   
    if cv2.waitKey(1) == ord('q'):
        break
    
    # 动态调整等待时间,保证60fps的录制速率
    elapsed_time = time.time() - start_time
    sleep_time = max(0, 1/fps - elapsed_time)
    time.sleep(sleep_time)

out.release()
cv2.destroyAllWindows()

内容的提问来源于stack exchange,提问作者Akshai

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 16:55:20