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()