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
相关产品推荐
相关产品推荐

