项目上需要监控电脑画面,故想到设计一个录制电脑视频的程序,
Python的第三方库PIL有个模块ImageGrab可以实现屏幕画面的抓取,配合opencv实现图片转为视频即可实现录制电脑视频
整体思路就是PIL模块中的ImageGrab不停的获得当前屏幕画面,利用opencv写入视频流
代码语言:javascript复制from PIL import ImageGrab
import numpy as np
import cv2
import time
tlast = 10 # 录制的时长,单位秒
p = ImageGrab.grab() # 获得当前屏幕
a, b = p.size # 获得当前屏幕的大小
fourcc = cv2.VideoWriter_fourcc(*'XVID') # 编码格式
video = cv2.VideoWriter('test.mp4', fourcc, 16, (a, b)) # 输出文件命名为test.mp4,帧率为16,可以自己设置
print('start record the screen')
time1 = time.time()
while True:
if time.time()-time1 > tlast:
break
im = ImageGrab.grab()
imm = cv2.cvtColor(np.array(im), cv2.COLOR_RGB2BGR) # 转为opencv的BGR格式
video.write(imm)
video.release()
这个代码有个不太方便的地方就是需要指定录制视频,没法通过键盘来触发推出命令,故考虑通过pynput方法,监控键盘,通过键盘特定键实现屏幕录制自动结束
代码语言:javascript复制from PIL import ImageGrab
import numpy as np
import cv2
import datetime
from pynput import keyboard
import threading
flag = False # 停止标志位
def video_record():
"""
屏幕录制!
:return:
"""
name = datetime.datetime.now().strftime('%Y-%m-%d %H-%M-%S') # 当前的时间
p = ImageGrab.grab() # 获得当前屏幕
a, b = p.size # 获得当前屏幕的大小
fourcc = cv2.VideoWriter_fourcc(*'XVID') # 编码格式
video = cv2.VideoWriter('%s.avi' % name, fourcc, 16, (a, b)) # 输出文件命名为时间.avi,帧率为16,可以自己设置
while True:
im = ImageGrab.grab()
imm = cv2.cvtColor(np.array(im), cv2.COLOR_RGB2BGR) # 转为opencv的BGR格式
video.write(imm)
if flag:
print("录制结束!")
break
video.release()
def on_press(key):
"""
键盘监听事件!!!
:param key:
:return:
"""
# print(key)
global flag
if key == keyboard.Key.esc:
flag = True
print("stop monitor!")
return False # 返回False,键盘监听结束!
if __name__ == '__main__':
th = threading.Thread(target=video_record)
th.start()
with keyboard.Listener(on_press=on_press) as listener:
listener.join()