網站首頁 編程語言 正文
由于最近測試需要錄制系統界面的操作過程,因為都是全屏的操作,所以用python做一個簡單的錄屏小工具。
實現過程也是比較簡單,就是通過對屏幕操作進行不斷的截圖,最后將截圖合成一個操作視頻的過程。由于我們只是做簡單的截屏功能,并沒有加入音頻效果。
1、準備
開始之前我們還是按照以往的方式介紹一下使用到的第三方的python模塊。
from?PIL?import?ImageGrab
import?numpy?as?np
import?cv2
import?datetime
from?pynput?import?keyboard
import?threading
from?loguru?import?logger
import?time
由于實現過程比較少,這里我們不再創建標準的class實現,直接在.py文件寫相關的函數來實現。
2、代碼
實現過程主要是通過兩個函數來實現的,一個是實現具體的屏幕截圖操作,并且將其寫入視頻。另一個則是用來監聽鍵盤的輸入,若是按下esc鍵時則退出當前的錄制操作。
初始化一個變量作為停止標志。
is_running?=?True
創建錄制過程生成函數generate_video,用以生成錄制視頻。
def?generate_video():
????'''
????生成錄制視頻函數
????:return:
????'''
????file_name?=?datetime.datetime.now().strftime('%Y-%m-%d?%H-%M-%S')
????screen?=?ImageGrab.grab()
????width,?height?=?screen.size
????fourcc?=?cv2.VideoWriter_fourcc(*'XVID')
????video?=?cv2.VideoWriter('%s.avi'?%?file_name,?fourcc,?20,?(width,?height))
????for?n?in?range(3):
????????logger.debug(str(3?-?n)?+?'秒后開始錄制!')
????????time.sleep(1)
????while?True:
????????im1?=?ImageGrab.grab()
????????im2?=?cv2.cvtColor(np.array(im1),?cv2.COLOR_RGB2BGR)
????????video.write(im2)
????????if?is_running?is?False:
????????????logger.debug('屏幕錄制已經結束!')
????????????break
????video.release()
創建鍵盤監聽函數press_keyboard,監聽輸入,若是按下esc鍵則改變運行狀態。
is_running=False
def?press_keyboard(key):
????'''
????鍵盤監聽函數
????:param?key:
????:return:
????'''
????global?is_running
????if?key?==?keyboard.Key.esc:
????????logger.debug('ESC已經被按下,馬上結束錄制!')
????????is_running?=?False
????????return?False
執行主函數main,啟動則執行屏幕錄制。
if?__name__?==?'__main__':
????thread_?=?threading.Thread(target=generate_video)
????thread_.start()
????logger.debug('?開始進入視頻錄制!')
????with?keyboard.Listener(on_press=press_keyboard)?as?listener:
????????listener.join()
最后,使用pyinstaller將其打包成exe的可執行應用,使用時直接雙擊打開即可開始錄制屏幕的操作過程。
pyinstaller?-i?.\video.ico?-Fw?.\test2.py
至此,錄制屏幕小工具就大功告成了。
原文鏈接:https://mp.weixin.qq.com/s/Dt0obCVDS9KN_K4uYxgpwQ
相關推薦
- 2022-10-31 解讀Python腳本的常見參數獲取和處理方式_python
- 2024-03-08 SpringBoot開發中VO、DTO的作用,以及使用場景
- 2023-05-30 docker如何查看容器啟動命令(已運行的容器)_docker
- 2022-11-13 Elasticsearch6.2服務器升配后的bug(避坑指南)_服務器其它
- 2022-08-29 C#中Attribute特性的用法_C#教程
- 2022-04-22 自定義注解+Spel實現分布式鎖
- 2022-04-11 C++中為什么要使用動態內存_C 語言
- 2022-11-15 C++構造析構賦值運算函數應用詳解_C 語言
- 最近更新
-
- 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同步修改后的遠程分支