python实现录屏功能

python实现录屏功能

将生成的avi文件转为mp4格式后删掉avi文件

参考感谢:https://www.cnblogs.com/peachh/p/16549254.html

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

效果图

相关推荐
paeamecium32 分钟前
【PAT甲级真题】- Rational Sum (20)
数据结构·c++·python·算法·pat考试·pat
Highcharts.js7 小时前
教程:基于 React + Highcharts 构建一个单页应用程序、按需数据拉取与图表渲染
开发语言·前端·数据结构·react.js·前端框架·highcharts·页面应用
爱昏羔7 小时前
下篇:从检索到交互 — 物流RAG问答系统与WebUI全实现
python·langchain·agent
_Jimmy_7 小时前
Agent引用数据库知识过时的增量同步方案
人工智能·python·langchain
头发还在的女程序员8 小时前
医院陪诊管理系统怎么选择?——2026 年选型避坑与架构参考
java·开发语言·陪诊系统·陪诊app·医院陪诊陪护
min(a,b)9 小时前
学习第 4 天:面向对象与异常处理
python·学习·学习方法
爱写代码的小朋友10 小时前
从零开始学 Win32 API:C++ 窗口编程实战(VS Code + MinGW-w64 命令行详解)
开发语言·c++
yangshicong10 小时前
第19章:AI安全防护与AI安全
人工智能·python·安全·prompt·ai编程
果汁华10 小时前
Function Calling 与 Python 实战完整指南
开发语言·网络·python
c_lb728811 小时前
2026年不同基础做量化,先找AI能参与的位置
人工智能·python