網站首頁 編程語言 正文
最近有在使用屏幕錄制軟件錄制桌面,在用的過程中突發奇想,使用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
原文鏈接:https://blog.csdn.net/weixin_46281427/article/details/124334720
相關推薦
- 2022-04-28 python的字典和集合你了解嗎_python
- 2022-12-14 Flutter應用框架搭建實現屏幕適配方案詳解_Android
- 2022-02-01 es ik分詞插件安裝
- 2022-04-18 python?如何使用requests下載文件_python
- 2022-06-12 Python同步方法變為異步方法的小技巧分享_python
- 2023-03-25 React錯誤邊界Error?Boundaries_React
- 2022-07-13 spring-boot2.6.x兼容swagger2問題
- 2022-10-05 教你使用RustDesk?搭建一個自己的遠程桌面中繼服務器_服務器其它
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支