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

效果图

相关推荐
泡海椒14 分钟前
JQuick-Excel dateFormat 转换实战:日期值与 FORMAT 显示格式的边界
开发语言·python·excel
念越18 分钟前
接口自动化测试从入门到实战:接口用例设计、Requests、Pytest、YAML、JSON Schema 与 Allure 报告
python·测试工具·自动化·json·pytest
言乐622 分钟前
Python贪心算法实现搜索推荐
python·django·virtualenv·pygame·tornado
benchmark_cc27 分钟前
A股量化尾盘筛选对数据时效敏感:行情链路变慢时先排查哪里?
python·数据分析·pandas·量化交易·股票数据·quantdash
白杨尚青29 分钟前
C++入门篇(十三):vector(上)——动态数组:构造、空间增长与迭代器失效
开发语言·c++·笔记·算法·stl
江江爱编程34 分钟前
java零基础保姆级教学01
java·开发语言
vx_Biye_Design38 分钟前
expressDeepSeek社团咨询助手的学生社团管理系统60746-计算机课程设计、毕业设计
java·vue.js·spring boot·后端·python·课程设计·express
泡茶喝茶写代码1 小时前
A股量化数据工程:从 REST 接口到策略信号(第 5 篇):板块成分股映射与对齐
java·python·股票数据api·股票数据·股票数据api接口·股票api数据接口·股票量化数据接口
沐晓时光1 小时前
C语言入门,深入理解指针(2)
c语言·开发语言
vx_Biye_Design1 小时前
django就业信息推荐系统61953-计算机课程设计、毕业设计
java·vue.js·spring boot·python·架构·django·课程设计