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

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

效果图

在这里插入图片描述


http://www.kler.cn/news/353653.html

相关文章:

  • 甲方安全和乙方安全的区别
  • Git常用指令【精简版】
  • CodeActAgent :Executable Code Actions Elicit Better LLM Agents解读
  • Meta新模型Dualformer:融合快慢思维,推理能力媲美人脑
  • Mamba学习笔记(2)—序列数据处理基础
  • 顺序表删除相关的算法题|删除最小值|删除值为x的值|删除区间内的值|删除重复的元素(C)
  • Vue3 路由基础 02
  • 爬虫案例——网易新闻数据的爬取
  • 【数据结构】宜宾大学-计院-实验三
  • 【Linux 从基础到进阶】防止数据泄露的策略与工具
  • 前端开发攻略---取消已经发出但是还未响应的网络请求
  • 文心智能体 | AI大师工坊 | 【超省钱小助手】智能体开发经验分享
  • Vidmore Screen Recorde 2.0.20 学习 体验 不错!
  • 【VUE】Vue2中 v-model 的原理
  • 使用 Bash 脚本实现交互式用户输入(参数选择)
  • vue3基础入门以及常用api使用
  • 视频智能分析平台LiteAIServer摄像机视频分析软件下载水土识别算法方案
  • 爬虫post收尾以及cookie加代理
  • BWA-mem Smith-Waterman 算法
  • 【VUE】Vue2中如何监听(检测)对象或者数组某个属性的变化