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

效果图

相关推荐
CodeCraft Studio2 分钟前
国产化PPT处理控件Spire.Presentation教程:使用Python将图片批量转换为PPT
python·opencv·powerpoint·ppt文档开发·ppt组件库·ppt api
鼾声鼾语19 分钟前
matlab的ros2发布的消息,局域网内其他设备收不到情况吗?但是matlab可以订阅其他局域网的ros2发布的消息(问题总结)
开发语言·人工智能·深度学习·算法·matlab·isaaclab
五阿哥永琪19 分钟前
Spring Boot 中自定义线程池的正确使用姿势:定义、注入与最佳实践
spring boot·后端·python
Data_agent32 分钟前
Python编程实战:从类与对象到设计优雅
爬虫·python
Swizard42 分钟前
别再迷信“准确率”了!一文读懂 AI 图像分割的黄金标尺 —— Dice 系数
python·算法·训练
麦麦鸡腿堡1 小时前
Java_类的加载
java·开发语言
我命由我123451 小时前
VSCode - Prettier 配置格式化的单行长度
开发语言·前端·ide·vscode·前端框架·编辑器·学习方法
JIngJaneIL1 小时前
基于java + vue校园快递物流管理系统(源码+数据库+文档)
java·开发语言·前端·数据库·vue.js
超级大只老咪1 小时前
数组的正向存储VS反向存储(Java)
java·开发语言·python
柏木乃一1 小时前
进程(2)进程概念与基本操作
linux·服务器·开发语言·性能优化·shell·进程