Python自动覆盖录屏软件——NIRE工作室开源软件(参数自动校正)(欢迎白嫖)

2023-05-16

复调录屏软件

版本号:0.1.1 Alpha
发行时间:2021年02月11日
发布方:NIRE工作室
开发者:Nire_Yeyu

一、软件描述

  • 目标群体:软件开发工程师、测试工程师、工程实施人员、软件购置方
  • 软件功能:依照设定自动覆盖过期录屏文件
  • 使用场景:相关人群在使用或测试软件过程中,可能发现软件异常,但不易描述或记录具体问题现象和自己的操作过程。从而导致研发人员在Bug修复过程中,需要耗费大量时间与精力在问题的复现上。通过复调录屏软件即第三方软件(以下称:本软件),用户可以24小时不间断录屏,一旦超过预设时间,将自动覆盖过期视频,从而保证占用较小磁盘空间。以此减少研发、测试、工程等互相推卸责任的现象,降低软件维护成本,提高工作效率
  • 关键字: 录屏、覆盖过期文件、工作效率

二、程序流程

在这里插入图片描述

2.1 参数设置

  • 本软件有两个文件:配置文件 与 代码文件
  • 单个文件录制时间、保留文件个数由用户在配置文件中自行设置,而视频的FPS由本软件自动设置

2.2 录制的视频播放速度过快问题

  • 不少尝试用Python录屏的开发者都会遇到这个问题,假设录制时长为10秒,录制结束后,用播放器不到5秒就放完了,而且播放速度明显过快。
  • 这种播放过快或过慢的现象,是由于FPS设置不恰当造成的。
  • 本软件会在初始化过程中自动设置适合当前机器的FPS,并在录制一段时间后进行自动校正,从而保证录屏效果。

2.3 结束条件

  • 软件在运行时,会开启键盘监听事件,一旦检测到用户按下ESC,软件会停止运行。建议用户用ESC结束程序,不要直接点击右上角的×关闭,否则录制的视屏没有进行释放操作,会出现异常现象。

三、配置文件

config.ini

[screen]
fps = 7.0
bk = 3
time = 10

四、源文件

VideoCut.py

# 复调录屏软件 : 持续迭代近期数据的录屏软件

# Copyright (c) 2021 NIRE工作室

# 在此免费授予任何获得软件和相关文件副本(“软件”)的开发者,无限制经营软件的权利
# 权利包括但不限于使用、复制、修改、合并、发布、分发、转授和/或出售软件副本

# 但软件使用者必须遵守以下条件:

# 上述版权声明和本许可声明应包含在软件的所有副本或重要部分中。

# 本软件是"按现样"提供,并无任何形式的保证,亦无任何形式的表达或暗示
# 包括但不局限于对可销售性、达到特定目的的适合性的保证。
# 不论是特殊、偶然或任何情况之下,NIRE工作室概不负任何责任。

"""
复调录屏软件通过Python3.7进行开发

使用复调录屏软件,您可以轻松地在各种平台上录制音频。
并且通过配置文件,设置保留视频的时长以及保留的视频个数
从而达到持续录屏,但节省空间,保留重要信息的目的

复调录屏软件的设计灵感来自:

日常测试软件过程中,需要记录操作过程及崩溃现象
如果长时间开启市面上现有的录屏软件会导致视频文件过大
并且在长视频中不易提取有效信息

关键字:

持续录屏、节省空间
"""

__author__  = "Nire_Yeyu"
__mail__    = "Nire_Yeyu@163.com"
__version__ = "0.1.1 Alpha"
__date__    = "2021.02.10"

# coding: utf-8

import os
import time
import threading
import configparser as cp
from datetime import datetime
# 尝试添加第三方库
try:
    import cv2
    import numpy as np
    from PIL import ImageGrab
    from pynput import keyboard
except ImportError:
    print("初始化失败:缺少依赖库")
    raise


class FileMgt(object):
    """
    文件管理类:
        通过此类实现对配置文件的读写,以及相关文件、文件夹的管控
    """

    def __init__(self):
        self.current = os.getcwd()                                      # 程序所在路径
        self.screen_record_path = os.path.join(self.current, "video")   # 存放视频文件的文件夹路径
        self.config_path = ".\\config.ini"                              # 配置文件路径
        self.video_path = ""                                            # 视频文件路径
        self.fps = 7                                                    # 帧率
        self.n_screen_record = 3                                        # 保留文件数量
        self.video_time = 300                                           # 单个文件录制时长(单位:秒)
        self.create_folder()                                            # 创建文件夹

    def create_folder(self):
        """创建文件夹"""
        try:
            if not os.path.exists(self.screen_record_path):
                os.mkdir(self.screen_record_path)
        except:
            print("错误:文件夹创建异常")
            return False

    def make_file_path(self):
        """依据当前时间获取欲录制视频路径"""
        now = str(datetime.now())[:19].replace(':', '_').replace('-', '_').replace(' ', '_')
        video_name = "{}.avi".format(now)
        self.video_path = os.path.join(self.screen_record_path, video_name)
        return self.video_path

    def control_screen_record_path(self):
        """删除过期文件"""
        try:
            while True:
                dir_list = os.listdir(self.screen_record_path)
                if len(dir_list) >= self.n_screen_record:
                    dir_list = sorted(dir_list,
                                      key=lambda x: os.path.getmtime(os.path.join(self.screen_record_path, x)))
                    f_path = os.path.join(self.screen_record_path, dir_list[0])
                    os.remove(f_path)
                    print("删除:", f_path)
                else:
                    break
        except FileNotFoundError:
            print("错误:系统找不到指定的视频文件")

    def read_config(self):
        """读取配置文件"""
        try:
            inifile = cp.ConfigParser()
            inifile.read(self.config_path, "UTF-8")
            self.fps = int(float(inifile.get("screen", "fps")))       # 帧率
            self.n_screen_record = int(inifile.get("screen", "bk"))   # 保存视频个数
            self.video_time = int(inifile.get("screen", "time"))      # 单个视频时长(单位:秒)
            if self.fps <= 0:
                print("配置文件异常:fps必须大于0")
                return False
            if self.n_screen_record < 3:
                print("配置文件异常:保留视频个数不得小于3个")
                return False
            if self.video_time < 10 or self.video_time > 60 * 60:
                print("配置文件异常:单个视频时长应在10秒至1小时之间")
                return False
            return True
        except FileNotFoundError:
            print("读取配置文件错误:未找到配置文件")
            return False

    def set_config(self, fps, record, video_time):
        """设置配置文件信息"""
        self.fps = fps
        self.n_screen_record = record
        self.video_time = video_time

    def write_config(self):
        """写配置文件"""
        try:
            inifile = cp.ConfigParser()
            inifile.read(self.config_path, "UTF-8")
            inifile["screen"]["fps"] = str(self.fps)                # 帧率
            inifile["screen"]["bk"] = str(self.n_screen_record)     # 保存视频个数
            inifile["screen"]["time"] = str(self.video_time)        # 单个视频时长(单位:秒)
            with open(self.config_path, 'w') as configfile:
                inifile.write(configfile)
            return True
        except FileNotFoundError:
            print("写配置文件错误:未找到配置文件")
            return False


class VideoMgt(object):
    """
    录屏管理类:
        通过该类实现录屏功能管控
    """

    def __init__(self):
        self.flag = False                   # 录屏结束标记位
        self.end = False                    # 程序结束标记位
        self.fileMgt = FileMgt()            # 文件管理对象

    def set_flag(self):
        """设置录屏标志位为结束录屏状态"""
        self.flag = True

    def test(self):
        """测试当前计算机性能,实现参数自动配置"""
        print("初始化中,请稍候...")
        if self.fileMgt.read_config() is False:
            print("读取配置文件错误")
            return False
        test_file_name = "test.avi"                                 # 初始化过程中的测试文件名称
        timer = threading.Timer(5,                                  # 测试时长为5秒
                                self.set_flag)
        timer.start()
        screen = ImageGrab.grab()                                   # 获取当前屏幕
        video = cv2.VideoWriter(test_file_name,
                                cv2.VideoWriter_fourcc(*"XVID"),    # 视频编码格式:   XVID
                                7,                                  # 帧率:           20
                                screen.size                         # 尺寸:           截屏界面大小
                                )
        count = 0
        time_start = time.time()
        while True:
            cv2.waitKey(50)                                         # 图像暂留时间
            im = ImageGrab.grab()                                   # 获取当前屏幕
            imm = cv2.cvtColor(np.array(im), cv2.COLOR_RGB2BGR)     # 转换为BGR格式
            video.write(imm)                                        # 将当前屏幕保存至视频文件中
            count = count + 1                                       # 记录已存储帧数
            """已录制5秒,测试结束"""
            if self.flag:
                break
        time_end = time.time()
        video.release()                                      # 释放视频资源
        self.fileMgt.fps = count // (time_end - time_start)  # 计算当前计算机性能可满足的帧率
        self.fileMgt.write_config()
        os.remove(os.path.join(                              # 删除测试文件
            self.fileMgt.current, test_file_name))
        self.flag = False
        print("初始化完成")
        print("帧率:", self.fileMgt.fps)
        print("时长:", self.fileMgt.video_time)
        print("保留视频个数:", self.fileMgt.n_screen_record)
        return True

    def make_video(self):
        """录屏"""
        self.fileMgt.control_screen_record_path()           # 在录制新视频之前,先删除过期文件
        if self.fileMgt.read_config() is False:
            return False
        timer = threading.Timer(self.fileMgt.video_time,    # 依据配置文件设置每一段视频的时长
                                self.set_flag)
        timer.start()
        screen = ImageGrab.grab()                                   # 获取当前屏幕
        video = cv2.VideoWriter(self.fileMgt.make_file_path(),      # 路径:           视频文件路径
                                cv2.VideoWriter_fourcc(*"XVID"),    # 视频编码格式:   XVID
                                self.fileMgt.fps,                   # 帧率:           由配置文件获取
                                screen.size                         # 尺寸:           截屏界面大小
                                )
        print("录制:", self.fileMgt.video_path)
        time_start = time.time()
        count = 0
        while True:
            cv2.waitKey(50)                                         # 图像暂留时间
            im = ImageGrab.grab()                                   # 获取当前屏幕
            imm = cv2.cvtColor(np.array(im), cv2.COLOR_RGB2BGR)     # 转换为BGR格式
            video.write(imm)                                        # 将当前屏幕保存至视频文件中
            count = count + 1
            """录制结束"""
            if self.flag:
                break
        video.release()
        self.flag = False
        time_end = time.time()
        self.fileMgt.fps = count // (time_end - time_start)  # 计算当前计算机性能可满足的帧率
        if self.fileMgt.write_config() is False:
            return False
        print("录制成功")
        return True

    def on_press(self, key):
        """按键事件"""
        if key == keyboard.Key.esc:     # 检测ESC按键
            self.flag = True            # 标志录屏结束
            self.end = True             # 标志程序结束

    def run(self):
        """程序运行"""
        if self.test() is False:
            return False
        while(True):
            if self.make_video() is False:
                return False
            if self.end:
                print("录制结束")
                return True


if __name__ == "__main__":
    print("*" * 27, "复调录屏软件", "*" * 27)
    print("版权方:NIRE工作室")
    print("按ESC结束录屏")
    print("版本号:", __version__)
    VedioMgt = VideoMgt()
    th = threading.Thread(target=VedioMgt.run)                       # 录屏逻辑
    th.start()
    with keyboard.Listener(on_press=VedioMgt.on_press) as listener:  # 监听键盘
        listener.join()


五、编译

  • 需要使用本软件的开发者只需将Config.ini与VideoCut.py这连个文件保存至本地便可以运行。
  • 本软件已经过长时间的使用,可以确保以上代码可以编译通过。
  • 如果在编译过程中发现有大量错误,请检查本地是否已安装需要用到的第三方库。

六、生成可执行文件

  • 如果有些开发者需要生成可执行文件,可以点击查看生成方法。

6.1 Pynput ImportError

在这里插入图片描述

  • 如果在打包完成后出现上述问题,是因为当前使用的pynput版本过高,当前最新版本为1.7.2,卸载后安装1.6.8,问题可解决。

6.2 PermissionError: [Errno 13] Permission denied:“XXX.dll”

在这里插入图片描述

  • 网络上的解释是这个dll正在被使用或找不到这个库,其实根本不是这样。
  • 解决方法:把360关掉(对,你刚刚被360制裁了)
    在这里插入图片描述

七、结语

  • 致每一位打工者:
  • 中国的程序员每天没日没夜地工作着,创造了大量现象级的软件,却领着远低于发达国家程序员的薪资,如果大家甘于现状,我们创造的价值将永远被资本家占据着,还要每天听着这些人歌颂996这样的制度。
  • 如果跳出来创业,又会面临大公司的围剿。
  • 在这样的情况下,只有大家更加踊跃地分享自己的劳动成果,才能给一个个新兴的小团队带来便利,让他们有机会与现有的大公司较量,才能促进中国的IT行业向着更健康的方向发展。
  • 愿奉献大于索取,愿明日优于过往。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python自动覆盖录屏软件——NIRE工作室开源软件(参数自动校正)(欢迎白嫖) 的相关文章

  • Intel Realsense D435i驱动安装及固件升级

    前言 实验室购买了intel realsense d435i RGBD相机 xff0c 用于无人机平台上的定位导航 xff0c 最近新购买了intel nuc xff0c 需要重新布置相机驱动 xff0c 特此把安装经历重新梳理一遍 xff
  • PixHawk飞控和Mission Planner地面站安装调试

    常用地面站软件主要有QGroundControl和MissionPlanner两种 下面以mission planner来介绍如何使用地面站软件进行固件升级和传感器校准 一 PixHawk飞控配置 www pixhawk com PixHa
  • PX4&GAAS

    PX4源码 xff1a https github com PX4 Firmware QGroundControl安装教程 xff1a https docs qgroundcontrol com en getting started down
  • MSCKF那些事-知乎转载

    MSCKF那些事 xff08 一 xff09 MSCKF算法简介MSCKF那些事 xff08 二 xff09 S MSCKF试用与源码解析MSCKF那些事 xff08 三 xff09 算法详解1 xff1a 前端特征跟踪MSCKF那些事 x
  • 赶快入手12代酷睿,畅享性能飞升体验-Acer掠夺者战斧300笔记本评测

    在这个社会全面数字化转型的时代 xff0c 人们对于计算机算力的需求越来越大 xff0c 对于日常使用的主力办公笔记本也是要求越来越全面 xff0c 尤其像笔者这样的编程一族 xff0c 今年一季度酷睿12代系列处理器的推出 xff0c 堪
  • 视觉惯性里程计VIO综述

    参考 xff1a https blog csdn net xiaoxiaowenqiang article details 81192045 目前主流的VIO开源方案主要有以下几类 xff0c 按照相机与IMU的耦合方式可分为松耦合和紧耦合
  • 常用地图结构和基础知识

    1 Occupancy grid map 占用栅格图 最稠密 每隔一个距离就要进行切分 xff08 当每个格子切的比较小也就是分辨率比较大的时候 xff0c 内存非常大 xff09 结构化坐标索引查询 xff0c O 1 https git
  • 2022年度盘点:十大最佳开源SLAM算法

    激光雷达里程计 香港大学开源激光雷达惯性视觉里程计FAST LIVO 论文名 xff1a FAST LIVO Fast and Tightly coupled Sparse Direct LiDAR Inertial Visual Odom
  • STL标准模版库之算法(algorithm)

    STL xff08 Standard Template Library xff0c 标准模板库 是惠普实验室开发的一系列软件的统称 它是由Alexander Stepanov Meng Lee和David R Musser在惠普实验室工作时
  • 树苺派TF卡备份/还原镜像

    树苺派TF卡备份 还原镜像 TF卡备份TF卡还原 备份和还原树莓派TF卡镜像推荐在Linux下进行 TF卡备份 在Ubuntu下插入装有Raspbian的TF卡会直接挂载 xff0c 挂载后的盘在 dev下显示为 34 dev sdx 34
  • 通过dockerfile 创建镜像以及更新镜像

    制作Docker镜像 1 安装 Docker Docker 要求 CentOS 系统的内核版本高于 3 10 查看当前系统的版本 uname r 安装 Docker 软件包和依赖包 yum y install docker 安装完成 从远程
  • RT-Thread 线程同步及通信 -- 信号量、互斥量、事件、邮箱、消息队列

    目录 一 RT Thread 信号量 二 RT Thread 互斥量 三 RT Thread 事件标志组 四 RT Thread 邮箱 五 RT Thread 消息队列 一 RT Thread 信号量 1 信号量相关函数 创建信号量 64
  • Fiddler抓不到浏览器包的常见原因

    代理未设置成功 fiddler 之所以能抓包 xff0c 本质上是因为浏览器 App 软件设置了代理为 fiddler 一旦遇到抓不到包的情况 xff0c 首先应排查浏览器代理是否设置正确 以 Chrome 为例 xff0c 代理设置为 x
  • 经典 SQL 数据库笔试题及答案整理

    马上又是金三银四啦 xff0c 有蛮多小伙伴在跳槽找工作 xff0c 但对于年限稍短的软件测试工程师 xff0c 难免会需要进行笔试 xff0c 而在笔试中 xff0c 基本都会碰到一道关于数据库的大题 xff0c 今天这篇文章呢 xff0
  • 软件测试项目实战(web+app+h5+小程序)

    没有实战经验 xff0c 简历不好编写 xff0c 而且也不好就业 今天给大家分享一个非常适合练手的软件测试项目 xff0c 此项目涵盖web端 app端 h5端 小程序端 xff0c 可以说非常之全面 获取方式在文末 项目介绍 项目名 x
  • 基础软件照搬开源不可取,自力更生才是正途

    最近有关开源软件的话题始终牢牢占据着IT界的新闻头条 xff0c Log4j开源软件的惊天漏洞 Fake js的作者也惊天删库跑路了 xff0c CurL的作者怒怼苹果只会白嫖开源却不出力 xff0c Linux的祖师爷Linus也不知所云
  • ADB 命令知多少?详细 ADB 命令大全来啦

    一 ADB 简介 1 什么是 ADB ADB 全称为 Android Debug Bridge xff0c 起到调试桥的作用 xff0c 是一个客户端 服务器端程序 其中客户端是用来操作的电脑 xff0c 服务端是 Android 设备 A
  • 软测面试如何介绍项目?要做哪些技术准备?

    测试人员在找工作中 xff0c 基本都会碰到让介绍项目的这种面试题 xff0c 如何正确介绍自己的项目 xff1f 需要做哪些技术准备 xff1f 今天这篇文章 xff0c 围绕这些问题 xff0c 跟大家一起聊一聊 Q 关于介绍自己的项目
  • 看完即会,抓取微信小程序数据包教程

    在给学员答疑的时候 xff0c 有很多小伙伴问到能不能抓取到微信小程序数据呢 xff1f 答案当然是肯定的 xff0c 通过Fiddler或者Charles这些主流的抓包工具都可以抓得到 xff0c 在IOS平台抓取微信小程序和https请
  • 金三银四必备软件测试刷题神器,刷完还怕面试不过吗?

    小编热衷于收集整理资源 xff0c 记录踩坑到爬坑的过程 希望能把自己所学 xff0c 实际工作中使用的技术 学习方法 心得及踩过的一些坑 xff0c 记录下来 也希望想做软件测试的你一样 xff0c 通过我的分享可以少走一些弯路 xff0

随机推荐