想用 Python 录像?这可不是什么难事,想象一下,你辛辛苦苦写的代码,跑出一个炫酷的界面,多想录下来分享给小伙伴们,或者记录下程序的运行过程,方便日后debug。别担心,Python 早就为你准备好了“秘密武器”!
用 Python 录像,选择可不少呢,总有一款适合你。我个人比较推荐使用 mss
这个库,速度快,占用资源也少,简直是良心之选。 当然,pyautogui
结合 PIL
也能实现,但效率嘛,就见仁见智了。 还有一些其他的库,比如 cv2
(OpenCV),也能用来录像,不过配置起来稍微麻烦点。
先来说说 mss
吧,安装非常简单,一条命令搞定:
bash
pip install mss
安装好之后,就可以开始写代码了。录像的核心思路是:先截取屏幕,然后把每一帧图片保存下来,最后再把这些图片合成为视频。
“`python
import mss
import mss.tools
import cv2
import numpy as np
import time
录制时长,单位秒
RECORD_SECONDS = 5
输出视频的文件名
OUTPUT_FILE = “output.mp4”
def main():
with mss.mss() as sct:
# 获取屏幕信息
monitor = sct.monitors[1] # 0 是所有屏幕的合并, 1是你的主屏幕
width = monitor[“width”]
height = monitor[“height”]
# 定义编码器和创建VideoWriter对象
fourcc = cv2.VideoWriter_fourcc(*'mp4v') # 或者使用 'XVID'
out = cv2.VideoWriter(OUTPUT_FILE, fourcc, 20.0, (width, height)) # 20.0 是帧率
print(f"开始录制 {RECORD_SECONDS} 秒...")
start_time = time.time()
while (time.time() - start_time) < RECORD_SECONDS:
# 抓取屏幕截图
sct_img = sct.grab(monitor)
img = np.array(sct_img)
# 将BGR转换为RGB
img = cv2.cvtColor(img, cv2.COLOR_RGBA2BGR) #考虑透明通道
# 写入帧
out.write(img)
# 可以选择在这里显示视频,方便调试,但会降低录制速度
# cv2.imshow('screen', img)
# if (cv2.waitKey(1) & 0xFF) == ord('q'):
# break
else:
print("录制完成!")
# 释放资源
out.release()
# cv2.destroyAllWindows() # 如果你用了 cv2.imshow,才需要这行
if name == “main“:
main()
“`
这段代码的关键在于 mss.mss()
和 sct.grab(monitor)
,前者创建了一个屏幕截图对象,后者负责抓取屏幕指定区域的截图。 monitor
变量定义了你要录制的屏幕区域,sct.monitors
包含了所有屏幕的信息,索引 0 代表所有屏幕的合并,1 通常是你的主屏幕。 当然,如果你的电脑有多个显示器,你可以根据实际情况修改索引。
然后,我们用 cv2.VideoWriter
创建一个视频写入对象,指定输出文件名、编码器、帧率和视频尺寸。编码器 fourcc
这里我使用了 mp4v
,你也可以尝试 XVID
等其他编码器,选择哪个取决于你的需求和电脑支持情况。 帧率 20.0
表示每秒 20 帧,你可以根据需要调整。
在 while
循环里,我们不断地抓取屏幕截图,然后用 out.write(img)
写入视频文件。 循环会持续 RECORD_SECONDS
秒,录制完毕后,释放资源。
这只是一个最简单的例子,你可以根据自己的需求进行扩展。 比如,你可以添加一个图形界面,让用户可以选择录制区域、设置帧率、自定义输出文件名等等。 也可以加入声音录制,让你的视频更加生动。
再说一下 pyautogui
结合 PIL
的方案,这种方式相对来说慢一些,因为 pyautogui
是通过模拟鼠标和键盘操作来实现屏幕截图的,而 PIL
负责图像处理。
“`python
import pyautogui
from PIL import Image
import cv2
import numpy as np
import time
录制时长,单位秒
RECORD_SECONDS = 5
输出视频的文件名
OUTPUT_FILE = “output_pyautogui.mp4”
def main():
# 获取屏幕尺寸
width, height = pyautogui.size()
# 定义编码器和创建VideoWriter对象
fourcc = cv2.VideoWriter_fourcc(*'mp4v')
out = cv2.VideoWriter(OUTPUT_FILE, fourcc, 20.0, (width, height))
print(f"开始录制 {RECORD_SECONDS} 秒...")
start_time = time.time()
while (time.time() - start_time) < RECORD_SECONDS:
# 抓取屏幕截图
img = pyautogui.screenshot()
frame = np.array(img)
# 将RGB转换为BGR
frame = cv2.cvtColor(frame, cv2.COLOR_RGB2BGR)
# 写入帧
out.write(frame)
else:
print("录制完成!")
# 释放资源
out.release()
cv2.destroyAllWindows()
if name == “main“:
main()
“`
这段代码和 mss
的版本很相似,主要的区别在于屏幕截图的方式。 pyautogui.screenshot()
函数会截取整个屏幕的截图,然后我们用 PIL.Image
对象将其转换为 numpy
数组。
最后,再简单提一下 cv2
(OpenCV) 直接录制屏幕的方式。 这种方式需要安装 OpenCV,配置起来稍微复杂一些,但是功能非常强大,可以进行各种图像处理和视频编辑。
总的来说,用 Python 录像 并不难,关键在于选择合适的库和掌握基本的代码逻辑。 mss
速度快,资源占用少,适合录制简单的屏幕操作; pyautogui
结合 PIL
比较灵活,可以模拟鼠标和键盘操作; cv2
(OpenCV) 功能强大,适合进行复杂的图像处理和视频编辑。 你可以根据自己的需求选择合适的方案。
别忘了,录制视频的时候,要确保你的电脑性能足够,否则可能会出现卡顿或者掉帧的情况。 另外,录制完毕后,最好检查一下视频的质量,看看是否符合你的预期。
希望这篇指南能够帮助你掌握 Python 录像的技巧,记录下屏幕上的精彩瞬间!现在,就动手试试吧,相信你一定会爱上这种便捷的方式!
评论(0)