LISHUZUOXUN_yangjiang/LSZXVideo/video_recording.py

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