本文主要讲解如何用python实现录频功能,主要用到的库 PIL,numpy ,cv2。
是亲测好用哦!
对大家的工作或学习具有一定的参考借鉴价值,需要的朋友可以参考下
背景
需要录屏·监控程序的运行过程,以直观的发现错误原因
首先需要创建录频组件代码,如下:
用的是python结合从cv2实现截图然后保存到文件实现视频流。
screen_recode.py
"""
python 屏幕录制
by:一岚大霞
"""
from PIL import ImageGrab
import numpy as np
import cv2
import datetime
import time
import os
from parse import ReadConf
conf = ReadConf()
class ScreenVideoControl(object):
def __init__(self, save_dir ):
self.fps = 25 # 帧率为25,可以调节
self.start_time = time.time()
#self.save_day =20
self.save_dir = save_dir
self.screen_file_path = None
self.get_video_path()
self.video = cv2.VideoWriter(self.screen_file_path, cv2.VideoWriter_fourcc(*'XVID'), self.fps,
ImageGrab.grab().size)
def run(self):
# 设置运行开始标志 FLAG=true则为结束录频
conf.write_or_update_value('conf', "FLAG", 'False')
# 最长录制时间
time_delay = 60.0 # 秒 可设置
self.video_record(time_delay)
#self.remove_path_file()
def video_record(self, time_delay):
print("screen record is doing........")
print('---录屏已经开始了--')
while True:
im = ImageGrab.grab()
imm = cv2.cvtColor(np.array(im), cv2.COLOR_RGB2BGR) # 转为opencv的BGR格式
self.video.write(imm)
now_time = time.time()
delay = now_time - self.start_time
if delay >= time_delay:
print("---超过指定时间,录制结束!---")
break
elif self.end_process():
print("---程序结束,录制结束!---")
break
self.video.release()
cv2.destroyAllWindows()
# 判断是否结束
def end_process(self):
flag = conf.get_value("conf", 'FLAG')
if flag == 'False' or flag == "false":
return False
else:
return True
def get_video_path(self):
# 录屏保存的文件目录路径
if not os.path.exists(self.save_dir):
os.makedirs(self.save_dir)
# 得到录屏保存的文件路径 按照时间创建文件夹
file_name = datetime.datetime.now().strftime('%Y-%m-%d %H-%M-%S') + '_screen.avi'
# 文件路径
self.screen_file_path = os.path.join(self.save_dir, file_name)
# # 删除历史数据
# def remove_path_file(self):
# file.remove_screen_files(self.save_dir, self.save_day)
if __name__=="__main__":
screen_video=ScreenVideoControl(r'C:\Users\Onexia\Desktop\video_scree')
screen_video.run()
parse.py
配置文件处理组件
import os
import configparser
class ReadConf(object):
# 程序化入口类
def __init__(self, file_name='system.inf', path='./', encode='utf-8'):
self.conf = configparser.ConfigParser()
self.file_path = os.path.join(path, file_name)
a=self.conf.read(self.file_path, encoding=encode)
def get_value(self, section,key,):
# 获取配置文件的信息
return self.conf.get(section, key)
def get_conf(self):
return self.conf
def write_or_update_value(self, section, key, value):
self.conf.set(section, key, value)
with open(self.file_path, 'w',encoding='utf-8') as fw: # 循环写入
self.conf.write(fw)
system.inf
配置文件
[conf]
fps = True
flag = False
运行结果
。
flag是录频·结束与否的标志,可用于监控其他组件的运行过程,比如键盘焦点或者其他线程运行,当其他程序开始时把flag设置为False,结束时把flag设置为True。
fps帧率FPS 是图像领域中的定义,是指画面每秒传输帧数,通俗来讲就是指动画或视频的画面数。
不同的电脑处理速度不同,有人的视频可能比实际的偏快或者偏慢,这是由于帧率的不同,不同电脑要找到合适的帧率才最接近真实的速度。这个需要自己调节。
下次我会讲怎么找到合适的帧率。see you!!