使用Pyqt5制作屏幕录制界面功能

 更新时间:2022年04月22日 12:06:24   作者:宿者朽命  
这篇文章主要介绍了使用Pyqt5制作屏幕录制界面,主要介绍如何使用ffmpeg将同时录制的屏幕录像和音频合成为有声音的屏幕录像,需要的朋友可以参考下

最近有在使用屏幕录制软件录制桌面,在用的过程中突发奇想,使用python能不能做屏幕录制工具,也锻炼下自己的动手能力。
接下准备写使用python如何做屏幕录制工具的系列文章:

录制屏幕制作视频

录制音频

合成视频,音频

基于pyqt5制作可视化窗口

大概上述四个部分,希望自己能够尽快完善,前两篇文章分享了利用opencv制作了屏幕录制部分,利用PyAudio录制音频,本篇文章分享如何使用ffmpeg将同时录制的屏幕录像和音频合成为有声音的屏幕录像。

应用平台

  • windows 10
  • python 3.7
  • ffmpeg

窗口设置

暂定窗口显示效果如下,固定大小:

  • 左侧显示部分:显示当前抓取的窗口图像
  • 右侧–选择区域:点击按钮会出现半透明框,左击鼠标划选,松开选定,此时按钮显示划选的窗口大小,并且左侧进行显示当前划选位置的图像。
  • 是否录制鼠标:默认录制,若在录制过程中鼠标出现频闪现象属于正常。
  • 画面录制帧率:10~60,默认为15,步进单位为1。
  • 音频来源:会读取当前设备支持的音频录制硬件并显示,可选择无,即不录制声音。
  • 保存目录:选择当前录制的音频保存位置,在首次录制时必须选择。 命名规则为当前时间戳,每次录制结束后会更新时间戳作为新的文件名。
  • 开始/停止:快捷键F7,开始录制或停止录制桌面视频。

主体窗口代码

在窗口设计中选择合适的部件是非常重要的,可以使用QtDesigner,拉取部件并绘制合适的窗口大小,使用pip install pyqt5-tools安装,在包路径下可以找到QtDesigner工具,布局好后将ui文件导出成py文件,在后续绑定函数时继续使用,或者使用代码编码创建窗口。

from PyQt5.QtWidgets import (QMainWindow, QApplication, QDesktopWidget, QWidget, QFrame,
                             QLabel, QPushButton, QComboBox, QCheckBox, QSpinBox, QDialog, QFileDialog, QMessageBox)
from PyQt5.QtGui import QIcon, QFont, QColor, QImage, QPixmap, QPen, QPainter
from PyQt5.QtCore import QRect, Qt, QPoint, QMetaObject, QThread  

class Ui_MainWindow(QMainWindow):
    """主体窗口设置"""
    def __init__(self):
        super().__init__()
        self.setObjectName("MainWindow")  # 设置窗口对象名称
        self.setWindowTitle('屏幕录制')    # 设置窗口标题
        self.resize(512, 352)   # 设置窗口大小
        self.setupUi()     # 设置显示部件
        self.show()        # 窗口显示
    def setipUi(self):
        # 设置窗口需要显示的部件
        # self.centralwidget = QWidget(self)  部件载体
        # self.centralwidget.setObjectName("centralwidget")
        # 标签框设置: QLabel(self.centralwidget)
        # 复选框设置: QCheckBox(self.centralwidget)
        # 按键设置:   QPushButton(self.centralwidget)
        # 调度框设置: QSpinBox(self.centralwidget)
def main():
    """运行函数"""
    app = QApplication(sys.argv)
    app.setAttribute(Qt.AA_UseHighDpiPixmaps)
    ui = Ui_MainWindow()
    sys.exit(app.exec_())
if __name__ == '__main__':
    main()

划选窗口代码

在录制桌面屏幕有只录制部分界面的需求,这需要设置一个事件来完成划选的动作,这里选择重新打开一个窗口来充满整个屏幕,鼠标在新建立的画面中可以滑动鼠标以选择需要录制的窗口部分。

class MousePaint(QDialog):
    """移动鼠标获取屏幕捕获范围"""

    def __init__(self):
        super().__init__()
        self.setMouseTracking(True)
        # 设置窗口布满整个屏幕
        self.showFullScreen()
        # 设置窗体无边框
        self.setWindowFlags(Qt.FramelessWindowHint)  # 窗口置顶,无边框
        # 设置背景透明
        self.setWindowOpacity(0.5)
        self.initUI()
        self.setFocus()
    def initUI(self):
        self.setGeometry(*(QDesktopWidget().screenGeometry()).getRect())
        self.pix = QPixmap()
        self.lastpoint = QPoint()
        self.endpoint = QPoint()
        self.pos = None
        self.bline = 0
    def mousePressEvent(self, event):
        # 监听鼠标按压事件
        if event.button() == Qt.LeftButton:
            self.lastpoint = event.x(), event.y()
            self.bline = 1
        elif event.button() == Qt.RightButton:
            self.close()
        event.accept()
    def mouseReleaseEvent(self, event):
        # 监听鼠标释放事件
        self.endpoint = event.x(), event.y()
        self.close()
    def mouseMoveEvent(self, event):
        # 监听鼠标移动事件
        if self.bline == 1:
            self.pos = event.x(), event.y()
            event.accept()
            self.update()
    def paintEvent(self, event):
        # 绘画事件
            pp = QPainter(self)
            pen = QPen()  # 定义笔格式对象
            pen.setWidth(5)  # 设置笔的宽度
            pen.setColor(QColor(255, 0, 0))
            pp.setPen(pen)
            lpx, lpy = self.lastpoint
            pp.drawRect(lpx, lpy, self.pos[0] - lpx, self.pos[1] - lpy)

监听鼠标事件在Pyqt5中都有相应的事件方法,这里只需要重载函数,并在对应函数方法下定义在本次监听事件中需要完成怎样的任务即可。

跟主窗口函数部分进行照应,当按下选择区域按钮后,打开屏幕捕获窗口,当选择完成时,返回窗口位置及大小,在主窗口显示窗口画面及大小。

在窗口运行过程中录制视频,如果未在程序中设置线程进行任务会造成窗口界面出现卡死现象,所以在调用录制视频和录制音频部分,可以使用线程与界面运行程序进行分离。

例如:

from PyQt5.QtCore import QThread  # Pyqt5的QThread类
from Screenshot_record import Screenshot

class Thread_screenshot(QThread):
    def __init__(self):
        super().__init__()
        self.screen = Screenshot()  # 屏幕录制类

总结

用python动手做一个屏幕录制工具到这里已经完成了,后续如果有改进部分依旧会更新文章,此系列中使用了很多第三方包,也就是因为python第三包繁多且优质,可以减少很多时间,通过这些第三方包来组建自己想要实现程序。由于总体代码限于文章篇幅,已经该系列文章所提到的代码上传至github,如有兴趣,可下载测试。

源码储存仓库:

https://github.com/lk-itween/FunnyCodeRepository/tree/main/Screenshot

软件链接提取:

如需测试生成的软件(仅windows平台)。
github

本地网盘下载:

链接: https://pan.baidu.com/s/1TqQ1JH-M15f4RfVI0_DxPQ?pwd=92ds

提取码: 92ds

到此这篇关于使用Pyqt5制作屏幕录制界面的文章就介绍到这了,更多相关Pyqt5屏幕录制界面内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • python执行shell并获取结果的详细示例

    python执行shell并获取结果的详细示例

    在Python中执行Shell命令并获取其结果,通常可以使用subprocess模块,这个模块允许我们启动新的进程,连接到它们的输入/输出/错误管道,并获取它们的返回码,下面是一个详细的示例,展示了如何使用subprocess.run()函数来执行Shell命令并获取其输出,需要的朋友可以参考下
    2024-07-07
  • 一文秒懂Python中的字符串

    一文秒懂Python中的字符串

    这篇文章主要介绍了一文秒懂Python中的字符串,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-03-03
  • 对Tensorflow中tensorboard日志的生成与显示详解

    对Tensorflow中tensorboard日志的生成与显示详解

    今天小编就为大家分享一篇对Tensorflow中tensorboard日志的生成与显示详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-02-02
  • Python Flask框架使用介绍

    Python Flask框架使用介绍

    今天来给大家说一个Python的轻量级web开发框架——Flask,为什么要推荐它呢?当然是因为它够轻量级了,开发迅速是它的特点,当然它也有缺点,不过这里不说,因为既用它又说它差感觉不好
    2022-08-08
  • Python实现打印实心和空心菱形

    Python实现打印实心和空心菱形

    今天小编就为大家分享一篇Python实现打印实心和空心菱形,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-11-11
  • python rsa实现数据加密和解密、签名加密和验签功能

    python rsa实现数据加密和解密、签名加密和验签功能

    本篇文章主要说明python库rsa生成密钥对数据的加密解密,api接口的签名和验签功能,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友参考下吧
    2019-09-09
  • Python使用pandas模块实现表之间的关联

    Python使用pandas模块实现表之间的关联

    在数据分析和处理中,表之间的关联是非常常见的操作,本文为大家介绍了pandas中实现表之间的关联有四种方式,感兴趣的小伙伴可以了解一下
    2023-07-07
  • 深入解析Python中的JSON比较

    深入解析Python中的JSON比较

    进行接口自动化时,有时候我们需要断言的数据比较多,一个字段一个字段进行断言比较麻烦,那么如何利用Python实现轻松判断数据格式是否相同呢,下面小编就为大家详细讲讲
    2023-09-09
  • Python读取pdf文件的简单代码示例

    Python读取pdf文件的简单代码示例

    PDF文件的数据主要是文本、图片、表格,这三部分组成,但是也会穿插流程图、各种柱状图等,这篇文章主要给大家介绍了关于Python读取pdf文件的简单代码示例,需要的朋友可以参考下
    2024-02-02
  • CentOS系统Python卸载攻略大揭秘

    CentOS系统Python卸载攻略大揭秘

    想要彻底卸载 CentOS 上的 Python 吗?不用担心,我们来帮你搞定!本指南将教你如何在 CentOS 系统上完全清理 Python,让你的系统焕然一新,跟着我们的步骤,让你的系统焕然一新吧!
    2023-11-11

最新评论