Python实现屏幕录制工具:基于PIL与OpenCV的完整方案
本文介绍如何使用Python结合PIL的ImageGrab模块与OpenCV库,实现一个轻量级的屏幕录制工具。通过多线程处理屏幕抓取与视频流写入,并利用pynput库监听ESC键终止录制,最终生成包含帧率、分辨率及时长信息的AVI视频文件。
由于女友从事软件测试工作,日常需频繁录屏以记录操作过程,便于开发人员后续排查问题。面对市面上多数录屏软件收费高昂且频繁更替的困境,我决定利用Python的灵活性为其开发一款专属工具,以解决这一痛点。
思路
经调研发现,主流的视频录制方案多依赖图像处理库PIL中的ImageGrab模块。该模块能够将当前屏幕画面或剪贴板内容捕获至PIL图像内存中。基于此原理,若持续不间断地获取屏幕图像并将序列帧拼接,即可构成视频流。
实现
录制
核心逻辑在于利用PIL模块中的ImageGrab持续捕获屏幕画面,随后调用OpenCV将图像数据写入视频流。
def video_record(sttime):
global name
# 当前的时间(当文件名)
name = datetime.now().strftime('%Y-%m-%d %H-%M-%S')
# 获取当前屏幕
screen = ImageGrab.grab()
# 获取当前屏幕的大小
width, high = screen.size
# MPEG-4编码,文件后缀可为.avi .asf .mov等
fourcc = VideoWriter_fourcc('X', 'V', 'I', 'D')
# (文件名,编码器,帧率,视频宽高)
video = VideoWriter('%s.avi' % name, fourcc, 15, (width, high))
print(str(sttime) + '秒后开始录制----')
time.sleep(int(sttime))
print('开始录制!')
global start_time
start_time = time.time()
while True:
if flag:
print("录制结束!")
global final_time
final_time = time.time()
# 释放
video.release()
break
# 图片为RGB模式
im = ImageGrab.grab()
# 转为opencv的BGR模式
imm = cvtColor(np.array(im), COLOR_RGB2BGR)
# 写入
video.write(imm)虽然录制视频的核心代码仅数行,但需对录制过程进行有效控制,包括启动与停止录制等功能。此外,获取屏幕图像后,还需进行格式转码并写入视频流。
监听键盘事件
视频录制依赖while循环持续获取屏幕信息,该过程一旦启动便持续运行。因此,必须监听键盘事件以终止循环,进而结束录制。此处选用功能强大的第三方库pynput,它支持全局监听键盘与鼠标事件。
设定当用户按下ESC键时,触发终止while循环的逻辑,从而结束视频录制过程。
# 监听按键
def on_press(key):
global flag
if key == keyboard.Key.esc:
flag = True
# 返回False,键盘监听结束!
return False主体控制
鉴于需持续获取屏幕内容,建议启动独立线程执行此任务,以避免阻塞主程序。
th = threading.Thread(target=video_record, args=sstime)
th.start()
with keyboard.Listener(on_press=on_press) as listener:
listener.join()视频信息
录制结束后,可提取视频的关键元数据,包括视频时长、帧率及分辨率等信息。
# 视频信息
def video_info():
# 记得文件名加格式不要错!
video = VideoCapture('%s.avi' % name)
fps = video.get(CAP_PROP_FPS)
count = video.get(CAP_PROP_FRAME_COUNT)
size = (int(video.get(CAP_PROP_FRAME_WIDTH)), int(video.get(CAP_PROP_FRAME_HEIGHT)))
print('帧率=%.1f' % fps)
print('帧数=%.1f' % count)
print('分辨率', size)
print('视频时间=%.3f秒' % (int(count) / fps))
print('录制时间=%.3f秒' % (final_time - start_time))
print('推荐帧率=%.2f' % (fps * ((int(count) / fps) / (final_time - start_time))))
至此,关于Python实现屏幕录制工具的示例介绍完毕。如需了解更多Python屏幕录制相关内容,可查阅本站过往文章或继续浏览后续教程,感谢支持。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









