前言
女朋友是一個老師,在作業中經常會遇到需要錄屏記錄自己操作,方便后續開發同學定位,因為錄屏軟體動不動就開始收費,所以她經常更換錄屏軟體,閑暇之余,我就覺得手癢,感覺可以用萬能的 Python 來解決她的煩惱,

實作思路
我上網搜尋了一下相關知識,錄制視頻基本上都用的影像處理庫 PIL 的 ImageGrab 模塊,這個模塊可以用于將當前螢屏的內容或者剪貼板上的內容拷貝到 PIL 影像記憶體,
既然這個模塊可以獲取當前螢屏上的內容,那么我一直不間斷地獲取,然后把這些獲取的內容拼起來,那不就是視頻了嗎?
如何錄制?
整體思路是 PIL 模塊中的 ImageGrab 不停的獲得當前螢屏,利用 opencv 寫入視頻流,
Python學習交流Q群:906715085### def video_record(sttime): global name # 當前的時間(當檔案名) name = datetime.now().strftime('%Y-%m-%d %H-%M-%S') # 獲取當前螢屏 screen = ImageGrab.grab() # 獲取當前螢屏的大小 width, high = screen.size # MPEG-4編碼,檔案后綴可為.avi .asf .mov等 fourcc = VideoWriter_fourcc('X', 'V', 'I', 'D') # (檔案名,編碼器,幀率,視頻寬高) video = VideoWriter('%s.avi' % name, fourcc, 15, (width, high)) print(str(sttime) + '秒后開始錄制----') time.sleep(int(sttime)) print('開始錄制!') global start_time start_time = time.time() while True: if flag: print("錄制結束!") global final_time final_time = time.time() # 釋放 video.release() break # 圖片為RGB模式 im = ImageGrab.grab() # 轉為opencv的BGR模式 imm = cvtColor(np.array(im), COLOR_RGB2BGR) # 寫入 video.write(imm)
錄制視頻的主要代碼只需幾行即可,但是我們需要對錄制操作進行控制,例如開始錄制、結束錄制等,以及獲取螢屏內容之后,需要對內容進行轉碼,然后寫入視頻流,
監聽鍵盤事件
錄制視頻我們是使用的一個 while 回圈來獲取螢屏資訊,開始之后會一直進行,但是我們需要監聽鍵盤事件,來終止這個回圈,從而終止錄制視頻,這個監聽事件就顯得很重要了,這里采用的是 pynput 這個強大的三方庫,可以全域監聽鍵盤、滑鼠事件,
我們設定的是用戶在按下鍵盤的 ESC 按鍵后,終止 while 回圈,從而終止視頻錄制,
# 監聽按鍵 def on_press(key): global flag if key == keyboard.Key.esc: flag = True # 回傳False,鍵盤監聽結束! return False
主體控制
因為我們需要不斷地獲取螢屏內容,所以我們最好啟動一個執行緒來干這個事情,
th = threading.Thread(target=video_record, args=sstime) th.start() with keyboard.Listener(on_press=on_press) as listener: listener.join()
視頻資訊
錄制視頻結束之后,我們也可以獲取視頻的一些相關資訊,例如時長、幀率、解析度等,
#視頻資訊 def video_info(): # 記得檔案名加格式不要錯! video = VideoCapture('%s.avi' % name) fps = video.get(CAP_PROP_FPS) count = video.get(CAP_PROP_FRAME_COUNT) size = (int(video.get(CAP_PROP_FRAME_WIDTH)), int(video.get(CAP_PROP_FRAME_HEIGHT))) print('幀率=%.1f' % fps) print('幀數=%.1f' % count) print('解析度', size) print('視頻時間=%.3f秒' % (int(count) / fps)) print('錄制時間=%.3f秒' % (final_time - start_time)) print('推薦幀率=%.2f' % (fps * ((int(count) / fps) / (final_time - start_time))))
標題 效果
最后,我啟兩個程式,第一個程式啟動錄制之后,我再來操作第二個程式,這樣大家就可以看到這個程式的運行程序,效果就大家自己去看了,
總結
這里的程式只是一個初版,剛剛實作了錄制螢屏的想法,后續還需要對其進行改進,支持 GUI 界面操作,支持框選特定區域錄制等等,今天的這一篇到這里來就完了,下一篇見,

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/456994.html
標籤:Python
上一篇:Python實作自動駕駛
