python实现录屏功能
将生成的avi文件转为mp4格式后删掉avi文件
python
import os
import cv2
import time
import threading
import numpy as np
from PIL import ImageGrab
from pynput import keyboard
from datetime import datetime
from moviepy.editor import VideoFileClip
flag = False
def video_record():
global name, start_time, final_time
name = datetime.now().strftime('%Y-%m-%d %H-%M-%S') # 当前的时间(作为文件名)
screen = ImageGrab.grab() # 获取当前屏幕
width, height = screen.size # 获取当前屏幕的大小
fourcc = cv2.VideoWriter_fourcc(*'XVID') # MPEG-4编码,文件后缀可为.avi .asf .mov等
video = cv2.VideoWriter(f'{name}.avi', fourcc, 20, (width, height)) # (文件名,编码器,帧率,视频宽高)
print('开始录制!')
start_time = time.time()
while True:
if flag:
print("录制结束!")
final_time = time.time()
video.release() # 释放
break
im = ImageGrab.grab() # 图片为RGB模式
imm = cv2.cvtColor(np.array(im), cv2.COLOR_RGB2BGR) # 转为OpenCV的BGR模式
video.write(imm) # 写入
def on_press(key):
global flag
if key == keyboard.KeyCode.from_char('1') or key == keyboard.KeyCode.from_char('q'):
flag = True # 改变
return False # 返回False,键盘监听结束!
def video_info():
video = cv2.VideoCapture(f'{name}.avi') # 记得文件名加格式不要错!
fps = video.get(cv2.CAP_PROP_FPS)
count = video.get(cv2.CAP_PROP_FRAME_COUNT)
size = (int(video.get(cv2.CAP_PROP_FRAME_WIDTH)), int(video.get(cv2.CAP_PROP_FRAME_HEIGHT)))
print('帧率=%.1f' % fps)
print('帧数=%.1f' % count)
print('分辨率', size)
print('视频时间=%.3f秒' % (count / fps))
print('录制时间=%.3f秒' % (final_time - start_time))
print('推荐帧率=%.2f' % (fps * ((count / fps) / (final_time - start_time))))
def avi_2_mp4():
# 指定输入文件路径
avi_file = f'{name}.avi'
# 指定输出文件路径
mp4_file = f'{name}.mp4'
# 使用 VideoFileClip 加载 AVI 文件
video = VideoFileClip(avi_file)
# 将视频写入 MP4 文件
video.write_videofile(mp4_file, codec="libx264")
# 完成后释放资源
video.close()
# 删除原始的AVI文件
os.remove(avi_file)
def run():
th = threading.Thread(target=video_record)
th.start()
with keyboard.Listener(on_press=on_press) as listener:
listener.join()
time.sleep(1) # 等待视频释放过后
video_info()
avi_2_mp4()
if __name__ == '__main__':
run()
效果图