大家好,欢迎来到 Crossin的编程教室 !

录屏是一个非常常见的电脑操作需求。比如你要向别人说明一个软件的使用方法,最直观的方法就是录屏发给对方。但不少录屏软件都是收费的,如果只是偶尔用一下,就感觉很不划算。今天我们就分享一个小案例:用万能的 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来做一个屏幕录制工具

总结

这里的程序只是一个初版,刚刚实现了录制屏幕的想法。后续还需要对其进行改进,支持 GUI 界面操作,支持框选特定区域录制等等。

如果文章对你有帮助,欢迎转发/点赞/收藏~

作 者:闲欢

来源 :Python 技术「ID: pythonall」

如需了解付费精品课程教学答疑服务

请在Crossin的编程教室内回复:666