当前位置: 首页 > news >正文

python实现录屏功能

python实现录屏功能
将生成的avi文件转为mp4格式后删掉avi文件
参考感谢:https://www.cnblogs.com/peachh/p/16549254.html

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 VideoFileClipflag = Falsedef video_record():global name, start_time, final_timename = 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()  # 释放breakim = ImageGrab.grab()  # 图片为RGB模式imm = cv2.cvtColor(np.array(im), cv2.COLOR_RGB2BGR)  # 转为OpenCV的BGR模式video.write(imm)  # 写入def on_press(key):global flagif 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()

效果图

在这里插入图片描述

http://www.lryc.cn/news/462259.html

相关文章:

  • 酷克数据出席2024金融业数据库技术大会
  • find_library、pkg_check_modules、pkg_search_module的区别
  • 多jdk版本环境下,jenkins系统设置需指定JAVA_HOME环境变量
  • Java mybatis day1015
  • 音乐播放器项目专栏介绍​
  • 如何修改SpringBoot内置容器默认上下文
  • R语言详解predict函数
  • QT 实现随机码验证
  • 集合框架12:Set集合概述、Set接口使用
  • 如何打开荣耀手机的调试模式?
  • Meta新模型Dualformer:融合快慢思维,推理能力媲美人脑
  • CDGA|数据治理:如何让传统行业实现数据智能
  • Spring源码5.2.9 编译踩坑
  • 【前端】如何制作一个自己的网页(5)
  • Unity实战案例全解析 类宝可梦回合制的初级案例 源码分析(加了注释和流程图)
  • AI绘图大模型 Stable Diffusion 使用详解
  • es索引库操作和使用RestHignLevelClient客户端操作es
  • 安卓数据共享
  • Gin框架操作指南02:JSON渲染
  • 【随手记】MySQL单表访问方法
  • 机器学习:情感分析的原理、应用场景及优缺点介绍
  • 基于SSM的医院药品管理系统
  • 特征融合篇 | YOLOv10 引入动态上采样模块 | 超过了其他上采样器
  • 【Linux系列】写入文本到文件
  • 【踩坑随笔】Tensorflow-GPU训练踩坑
  • 【云岚到家】-day07-4-实战项目-优惠券活动-项目准备
  • axios的使用
  • Ubuntu 使用命令克隆和恢复SD卡
  • Java 小游戏《超级马里奥》
  • go语言defer详解