目录
-
目录
-
应用平台
-
屏幕录制部分
-
计算视频最优fps及使用numpy计算中间帧数组
-
使用pynput监听键盘按键
-
如何保存MP4格式视频
-
源码
-
总结
最近有在使用屏幕录制软件录制桌面,在用的过程中突发奇想,使用python能不能做屏幕录制工具,也锻炼下自己的动手能力。接下准备写使用python如何做屏幕录制工具的系列文章:
-
录制屏幕制作视频
-
录制音频
-
合成视频,音频
-
基于pyqt5制作可视化窗口
大概上述四个部分,希望自己能够尽快完善,接下来开始使用python制作屏幕录制部分。
应用平台
-
windows 10
-
python 3.7
屏幕录制部分
屏幕录制可以简单地理解为将屏幕快照以动图的形式播放,这里我选用PIL下的ImageGrab来截取屏幕画面,首先pip install Pillow
之后需要将截取到的快照数组合成为视频,使用cv2模块pip install opencv-python
ImageGrab类不能直接存储为视频,使用numpy模块进行数组化,再通过cv2.COLOR_BGR2RGB转换为cv2色彩通道。pip install numpy
屏幕录制主要代码:
import numpy as np
from PIL import ImageGrab
import cv2
im = ImageGrab.grab()
width, high = im.size # 获取屏幕的宽和高
fourcc = cv2.VideoWriter_fourcc(*'I420') # 设置视频编码格式
fps = 15 # 设置帧率
video = cv2.VideoWriter('test.avi', fourcc, fps, (width, high))
while True: # 开始录制
im = ImageGrab.grab()
im_cv = cv2.cvtColor(np.array(im), cv2.COLOR_BGR2RGB)
# 图像写入
video.write(im_cv)
if xx: # 当某某条件满足中断循环
break
video.release() # 释放缓存,持久化视频
测试运行可以保存屏幕快照为视频,但操作起来不优雅,也不利于后续的操作。
封装成类,继承线程父类,方便使用键盘来控制视频录制的结束。
from threading import Thread
class ScreenshotVideo(Thread):
def __init__(self):
"""初始化参数"""
super().__init__()
详细代码将在文末给出。
计算视频最优fps及使用numpy计算中间帧数组
实际操作中视频录制在不同电脑中会出现不一样的帧率,导致视频播放或快或慢,需要根据不同的电脑计算出相应的最优fps值。
def video_best_fps(self, path):
"""获取电脑录制视频的最优帧率"""
video = cv2.VideoCapture(path) # 读取视频
fps = video.get(cv2.CAP_PROP_FPS) # 获取当前视频的帧率
count = video.get(cv2.CAP_PROP_FRAME_COUNT) # 获取视频帧数,即该视频有多少幅画面
self.best_fps = int(fps * ((int(count) / fps) / self.spend_time)) # 计算播放时间与录制时间对比得到最优帧率
video.release()
再调整帧率参数进行录制视频就减弱了视频播放太快或者太慢。也可以给视频增加帧数从而延长播放时间,这里我采用一种很简单的方法增加视频帧,仅供参考。
from numba import jit
# 使用numpy计算相邻两帧图像且更接近于后一帧的图像
# 调用jit方法加速数组计算
@jit(nopython=True)
def average_n(x, y):
"""Numpy计算趋近值"""
return (