import numpy as np import cv2 from mss import mss from PIL import Image mon = {'left': 400, 'top': 0, 'width': 200, 'height': 200} with mss() as sct: while True: screenShot = sct.grab(mon) img = Image.frombytes( 'RGB', (screenShot.width, screenShot.height), screenShot.rgb, ) cv2.imshow('test', np.array(img)) if cv2.waitKey(33) & 0xFF in ( ord('q'), 27, ): break修改为可将视频保存到该文件的文件夹下
时间: 2025-03-18 13:12:35 浏览: 24
### 使用 `mss` 和 `cv2` 实现屏幕录制并保存为视频
为了实现将屏幕录制保存为本地视频文件的功能,可以利用 `mss` 库高效捕获屏幕图像,并通过 OpenCV (`cv2`) 将这些帧写入到视频文件中。以下是完整的解决方案:
#### 安装依赖库
在开始之前,请确保安装了所需的 Python 库:
```bash
pip install mss opencv-python-headless numpy
```
#### 屏幕录制代码示例
以下是一个基于 `mss` 和 `cv2` 的屏幕录制脚本[^1][^3]:
```python
import cv2
import numpy as np
from mss import mss
from PIL import Image
def record_screen(output_file="output.avi", fps=30, region=None):
"""
记录屏幕并将录像保存为指定的视频文件。
参数:
output_file (str): 输出视频文件名,默认为 'output.avi'。
fps (int): 录制帧率,默认为 30 帧每秒。
region (tuple): 要记录的区域坐标 (左, 上, 右, 下),默认全屏。
"""
# 初始化 MSS 对象用于截取屏幕
with mss() as sct:
if not region:
monitor = sct.monitors[1] # 默认为主显示器
else:
monitor = {"left": region[0], "top": region[1],
"width": region[2] - region[0], "height": region[3] - region[1]}
# 获取屏幕分辨率以设置视频编码器参数
width, height = monitor["width"], monitor["height"]
# 设置视频编解码器和输出对象
fourcc = cv2.VideoWriter_fourcc(*"XVID") # 编码格式
video_writer = cv2.VideoWriter(
output_file, fourcc, fps, (width, height))
try:
while True:
# 截图当前屏幕画面
screenshot = sct.grab(monitor)
# 将截图转换为 NumPy 数组以便于 OpenCV 处理
img_np = np.array(Image.frombytes("RGB", screenshot.size, screenshot.bgra, "raw", "BGRX"))
# 写入帧至视频文件
video_writer.write(cv2.cvtColor(img_np, cv2.COLOR_RGB2BGR))
# 显示实时预览窗口(可选)
cv2.imshow('Screen Recording', img_np)
# 按下 ESC 键退出循环
if cv2.waitKey(1) & 0xFF == 27: # ASCII 码 27 表示 ESC 键
break
finally:
# 清理资源
video_writer.release()
cv2.destroyAllWindows()
if __name__ == "__main__":
# 开始录制整个屏幕
record_screen(output_file="screen_recording.avi", fps=20)
```
#### 关键点说明
1. **MSS 性能优化**: `mss` 是一个多平台高效的屏幕抓取模块,相比其他工具如 `pyscreenshot` 或者 PyObjC 更加轻量级且快速。
2. **OpenCV 视频编写**: 利用 OpenCV 提供的 `VideoWriter` 类创建了一个 AVI 文件作为存储介质,并指定了四字符编码 `"XVID"` 来压缩数据流[^4]。
3. **自定义录制范围**: 如果只需要部分屏幕而不是整块,则可以通过调整函数调用中的 `region` 参数来限定具体位置与大小。
4. **终止条件设计**: 用户可通过键盘输入 ESC 键手动停止录制过程;此外还加入了异常处理机制保障程序结束时能够释放所有占用资源.
---
阅读全文
相关推荐














