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

Python实现的录屏程序无法生成.avi文件且按q退出失效如何解决

问题原因&解决方案

1. 按下q键无法终止录制的问题

Mac系统下cv2.waitKey()的按键事件仅能被cv2.imshow()创建的窗口捕获,你需要先点击激活弹出的screenshot预览窗口,再按下q键才能触发终止逻辑。如果不想依赖窗口聚焦,可以额外引入keyboard库实现全局按键监听。

2. Ctrl+C强制中断无输出文件的问题

你当前的代码只有正常触发break跳出循环后,才会执行out.release()释放视频写入器,强制中断时这行代码不会运行,因此视频文件不会被正确写入生成。可以通过捕获KeyboardInterrupt异常,保证无论是否强制中断,都能执行资源释放逻辑。

3. 额外兼容性问题

你代码里硬编码的屏幕分辨率需要和Mac实际显示分辨率匹配,否则也会导致视频文件损坏;同时原有颜色转换逻辑写反了,pyautogui截图为RGB格式,OpenCV视频写入需要BGR格式,原代码转换后会出现颜色错乱问题。


修改后的完整代码

import cv2
import numpy as np
import pyautogui

# 动态获取当前屏幕实际分辨率,避免硬编码错误
SCREEN_SIZE = pyautogui.size()
fourcc = cv2.VideoWriter_fourcc(*"XVID")
out = cv2.VideoWriter("output2.avi", fourcc, 20.0, (SCREEN_SIZE))

try:
    while True:
        img = pyautogui.screenshot()
        frame = np.array(img)
        # 修正颜色转换逻辑:RGB转BGR适配OpenCV要求
        frame = cv2.cvtColor(frame, cv2.COLOR_RGB2BGR)
        out.write(frame)
        cv2.imshow("screenshot", frame)
        # 预览窗口聚焦时按q可正常终止录制
        if cv2.waitKey(1) == ord("q"):
            break
# 捕获Ctrl+C强制中断信号
except KeyboardInterrupt:
    print("录制已被手动中断")
finally:
    # 无论正常退出还是异常中断,都强制释放视频写入资源,保证视频文件正常生成
    cv2.destroyAllWindows()
    out.release()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.14 04:48:01