Python做屏幕錄制工具的實(shí)現(xiàn)示例
女朋友是一個(gè)軟件測(cè)試人員,在工作中經(jīng)常會(huì)遇到需要錄屏記錄自己操作,方便后續(xù)開(kāi)發(fā)同學(xué)定位。因?yàn)殇浧淋浖?dòng)不動(dòng)就開(kāi)始收費(fèi),所以她經(jīng)常更換錄屏軟件。閑暇之余,我就覺(jué)得手癢,感覺(jué)可以用萬(wàn)能的 Python 來(lái)解決她的煩惱。
思路
我上網(wǎng)搜尋了一下相關(guān)知識(shí),錄制視頻基本上都用的圖像處理庫(kù) PIL 的 ImageGrab 模塊。這個(gè)模塊可以用于將當(dāng)前屏幕的內(nèi)容或者剪貼板上的內(nèi)容拷貝到 PIL 圖像內(nèi)存。
既然這個(gè)模塊可以獲取當(dāng)前屏幕上的內(nèi)容,那么我一直不間斷地獲取,然后把這些獲取的內(nèi)容拼起來(lái),那不就是視頻了嗎?
實(shí)現(xiàn)
錄制
整體思路是 PIL 模塊中的 ImageGrab 不停的獲得當(dāng)前屏幕,利用 opencv 寫(xiě)入視頻流。
def video_record(sttime): global name # 當(dāng)前的時(shí)間(當(dāng)文件名) name = datetime.now().strftime('%Y-%m-%d %H-%M-%S') # 獲取當(dāng)前屏幕 screen = ImageGrab.grab() # 獲取當(dāng)前屏幕的大小 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) + '秒后開(kāi)始錄制----') time.sleep(int(sttime)) print('開(kāi)始錄制!') global start_time start_time = time.time() while True: if flag: print("錄制結(jié)束!") global final_time final_time = time.time() # 釋放 video.release() break # 圖片為RGB模式 im = ImageGrab.grab() # 轉(zhuǎn)為opencv的BGR模式 imm = cvtColor(np.array(im), COLOR_RGB2BGR) # 寫(xiě)入 video.write(imm)
錄制視頻的主要代碼只需幾行即可,但是我們需要對(duì)錄制操作進(jìn)行控制,例如開(kāi)始錄制、結(jié)束錄制等。以及獲取屏幕內(nèi)容之后,需要對(duì)內(nèi)容進(jìn)行轉(zhuǎn)碼,然后寫(xiě)入視頻流。
監(jiān)聽(tīng)鍵盤(pán)事件
錄制視頻我們是使用的一個(gè) while 循環(huán)來(lái)獲取屏幕信息,開(kāi)始之后會(huì)一直進(jìn)行。但是我們需要監(jiān)聽(tīng)鍵盤(pán)事件,來(lái)終止這個(gè)循環(huán),從而終止錄制視頻。這個(gè)監(jiān)聽(tīng)事件就顯得很重要了,這里采用的是 pynput 這個(gè)強(qiáng)大的三方庫(kù),可以全局監(jiān)聽(tīng)鍵盤(pán)、鼠標(biāo)事件。
我們?cè)O(shè)定的是用戶在按下鍵盤(pán)的 ESC 按鍵后,終止 while 循環(huán),從而終止視頻錄制。
# 監(jiān)聽(tīng)按鍵 def on_press(key): global flag if key == keyboard.Key.esc: flag = True # 返回False,鍵盤(pán)監(jiān)聽(tīng)結(jié)束! return False
主體控制
因?yàn)槲覀冃枰粩嗟孬@取屏幕內(nèi)容,所以我們最好啟動(dòng)一個(gè)線程來(lái)干這個(gè)事情。
th = threading.Thread(target=video_record, args=sstime) th.start() with keyboard.Listener(on_press=on_press) as listener: listener.join()
視頻信息
錄制視頻結(jié)束之后,我們也可以獲取視頻的一些相關(guān)信息,例如時(shí)長(zhǎng)、幀率、分辨率等。
# 視頻信息 def video_info(): # 記得文件名加格式不要錯(cuò)! 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('幀數(shù)=%.1f' % count) print('分辨率', size) print('視頻時(shí)間=%.3f秒' % (int(count) / fps)) print('錄制時(shí)間=%.3f秒' % (final_time - start_time)) print('推薦幀率=%.2f' % (fps * ((int(count) / fps) / (final_time - start_time))))
到此這篇關(guān)于Python做屏幕錄制工具的實(shí)現(xiàn)示例的文章就介紹到這了,更多相關(guān)Python 屏幕錄制工具內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python實(shí)現(xiàn)爬蟲(chóng)爬取NBA數(shù)據(jù)功能示例
這篇文章主要介紹了Python實(shí)現(xiàn)爬蟲(chóng)爬取NBA數(shù)據(jù)功能,涉及Python針對(duì)URL模塊、字符串、列表遍歷、Excel寫(xiě)入等相關(guān)操作技巧,需要的朋友可以參考下2018-05-05python實(shí)現(xiàn)在每個(gè)獨(dú)立進(jìn)程中運(yùn)行一個(gè)函數(shù)的方法
這篇文章主要介紹了python實(shí)現(xiàn)在每個(gè)獨(dú)立進(jìn)程中運(yùn)行一個(gè)函數(shù)的方法,涉及Python操作進(jìn)程的相關(guān)技巧,需要的朋友可以參考下2015-04-04python中使用 xlwt 操作excel的常見(jiàn)方法與問(wèn)題
這篇文章主要給大家介紹了關(guān)于python中使用 xlwt 操作excel的常見(jiàn)方法與問(wèn)題的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-01-01Python中splitlines()方法的使用簡(jiǎn)介
這篇文章主要介紹了Python中splitlines()方法的使用簡(jiǎn)介,是Python入門(mén)中的基礎(chǔ)知識(shí),需要的朋友可以參考下2015-05-05Python調(diào)用Matplotlib繪制振動(dòng)圖、箱型圖和提琴圖
Matplotlib作為用于數(shù)據(jù)可視化的Python軟件包,能夠繪制多種2D圖像,它使用簡(jiǎn)單、代碼清晰易懂,深受廣大技術(shù)愛(ài)好者喜愛(ài)。本文主要介紹了通過(guò)?Matplotlib繪制振動(dòng)圖、箱型圖、提琴圖,需要的朋友可以參考一下2021-12-12python3格式化字符串 f-string的高級(jí)用法(推薦)
從Python 3.6開(kāi)始,f-string是格式化字符串的一種很好的新方法。與其他格式化方式相比,它們不僅更易讀,更簡(jiǎn)潔,不易出錯(cuò),而且速度更快!本文重點(diǎn)給大家介紹python3格式化字符串 f-string的高級(jí)用法,一起看看吧2020-03-03利用Python實(shí)現(xiàn)一個(gè)可定制風(fēng)格的繪圖系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了如何基于Python實(shí)現(xiàn)一個(gè)可定制風(fēng)格的繪圖系統(tǒng),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起了解下2023-09-09python使用 zip 同時(shí)迭代多個(gè)序列示例
這篇文章主要介紹了python使用 zip 同時(shí)迭代多個(gè)序列,結(jié)合實(shí)例形式分析了Python使用zip遍歷迭代長(zhǎng)度相等與不等的序列相關(guān)操作技巧,需要的朋友可以參考下2019-07-07