149 lines
4.8 KiB
Python
149 lines
4.8 KiB
Python
import datetime
|
|
import threading
|
|
import time
|
|
import traceback
|
|
|
|
import cv2
|
|
import numpy as np
|
|
from PIL import ImageGrab
|
|
|
|
from AcrossPlatform.get_platform import *
|
|
|
|
# 视频存放位置
|
|
VIDEO_DIR = os.path.join(GLOBAL_DIR, "LSZXVideo", "Video")
|
|
OUTPUT_VIDEO = os.path.join(GLOBAL_DIR, "LSZXVideo", "Output_Video")
|
|
if not os.path.exists(VIDEO_DIR):
|
|
os.makedirs(VIDEO_DIR)
|
|
|
|
|
|
class VideoRecording(threading.Thread):
|
|
def __init__(self):
|
|
super().__init__()
|
|
self.video = None
|
|
self.__running = threading.Event()
|
|
self.__running.set()
|
|
self.__record = threading.Event()
|
|
self.video_dir = VIDEO_DIR
|
|
self.video_name = None
|
|
self.timer = None # 用于存储定时器的引用
|
|
|
|
try:
|
|
cur_screen = ImageGrab.grab() # 获取屏幕对象
|
|
self.height, self.width = cur_screen.size
|
|
# 截屏效率也就只能10帧左右
|
|
self.fps = 9
|
|
self.fourcc = cv2.VideoWriter_fourcc(*"XVID")
|
|
|
|
# 临时文件名称
|
|
temp_video_name = "temple.mp4v"
|
|
self.tmp_filename = os.path.join(VIDEO_DIR, temp_video_name)
|
|
|
|
# 状态
|
|
self.state = 0
|
|
except Exception as e:
|
|
print(traceback.format_exc())
|
|
|
|
def run(self):
|
|
while self.__running.is_set():
|
|
try:
|
|
# 等待开始录
|
|
self.__record.wait()
|
|
# 录屏初始化
|
|
self.video = cv2.VideoWriter(self.tmp_filename, self.fourcc, self.fps, (self.height, self.width))
|
|
|
|
# 设置两分钟后自动停止录制的定时器
|
|
self.timer = threading.Timer(240.0, self.stop_recording)
|
|
self.timer.start()
|
|
|
|
# 开始录屏
|
|
# 判断是否结束录屏
|
|
while self.__record.is_set():
|
|
capture_image = ImageGrab.grab() # 抓取屏幕
|
|
img = np.array(capture_image)
|
|
frame = cv2.cvtColor(img, cv2.COLOR_RGB2BGR)
|
|
self.video.write(frame)
|
|
# 收到信号,结束录屏
|
|
except Exception as e:
|
|
print(traceback.format_exc())
|
|
continue
|
|
|
|
# 停止录制
|
|
def stop_recording(self):
|
|
if self.state == 1:
|
|
"""停止录制并释放资源"""
|
|
self.__record.clear() # 清除录制信号
|
|
self.state = 0 # 更新状态为未录制
|
|
if self.timer:
|
|
self.timer.cancel() # 取消定时器
|
|
self.video.release() # 释放视频写入对象
|
|
try:
|
|
# 重命名临时文件
|
|
video_name_dir = os.path.join(VIDEO_DIR, f'{self.video_name}' + '_' + str(
|
|
datetime.datetime.now().strftime("%Y-%m-%d-%H-%M-%S")) + '.mp4v')
|
|
|
|
os.rename(self.tmp_filename, video_name_dir)
|
|
except OSError as e:
|
|
print(f"Error renaming video file: {e}")
|
|
cv2.destroyAllWindows() # 销毁所有OpenCV窗口
|
|
|
|
# 开始录制
|
|
def write_start(self, video_name):
|
|
if self.state == 0:
|
|
self.video_name = video_name
|
|
self.__record.set()
|
|
self.state = 1
|
|
|
|
# 手动暂停
|
|
def write_stop(self, video_name):
|
|
self.video_name = video_name
|
|
self.stop_recording()
|
|
|
|
def delete_video(self):
|
|
for root, dirs, files in os.walk(self.video_dir):
|
|
for name in files:
|
|
if name.endswith(".mp4v"):
|
|
os.remove(os.path.join(root, name))
|
|
|
|
for root, dirs, files in os.walk(OUTPUT_VIDEO):
|
|
for name in files:
|
|
if name.endswith(".mp4"):
|
|
os.remove(os.path.join(root, name))
|
|
|
|
|
|
if __name__ == '__main__':
|
|
recorder = VideoRecording()
|
|
recorder.start() # 启动录制线程
|
|
|
|
# 第一次录制
|
|
recorder.write_start('1_zzh_仰卧起坐_unknow')
|
|
time.sleep(30)
|
|
recorder.write_stop('1_zzh_仰卧起坐_98')
|
|
|
|
recorder.write_start('2_zzh_仰卧起坐_unknow')
|
|
# time.sleep(160)
|
|
# recorder.write_stop('2_zzh_仰卧起坐_98')
|
|
|
|
# def Video_recording():
|
|
# curScreen = ImageGrab.grab() # 获取屏幕对象
|
|
#
|
|
# height, width = curScreen.size
|
|
# fps = 20 # 帧数
|
|
# fourcc = cv2.VideoWriter_fourcc(*"XVID") # 编码
|
|
#
|
|
# if not os.path.exists(r'./video'):
|
|
# os.mkdir(r'./video')
|
|
# video_name = "t1.mp4v"
|
|
# filename = os.path.join('./video', video_name)
|
|
#
|
|
# video = cv2.VideoWriter(filename, fourcc, fps, (height, width))
|
|
#
|
|
# while 1:
|
|
# captureImage = ImageGrab.grab() # 抓取屏幕
|
|
# frame = cv2.cvtColor(np.array(captureImage), cv2.COLOR_RGB2BGR)
|
|
# video.write(frame) # 将一张张屏幕截图写入视频,停止while便可结束
|
|
# if cv2.waitKey(1) & 0xff == ord('q'):
|
|
# break
|
|
#
|
|
# video.release()
|
|
# cv2.destroyAllWindows()
|