<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          用Python來做一個屏幕錄制工具

          共 2677字,需瀏覽 6分鐘

           ·

          2021-12-19 00:34

          大家好,歡迎來到 Crossin的編程教室 !

          錄屏是一個非常常見的電腦操作需求。比如你要向別人說明一個軟件的使用方法,最直觀的方法就是錄屏發(fā)給對方。但不少錄屏軟件都是收費(fèi)的,如果只是偶爾用一下,就感覺很不劃算。今天我們就分享一個小案例:用萬能的 Python 來解決錄屏這個小功能。

          思路

          我上網(wǎng)搜尋了一下相關(guān)知識,錄制視頻基本上都用的圖像處理庫 PIL 的 ImageGrab 模塊。這個模塊可以用于將當(dāng)前屏幕的內(nèi)容或者剪貼板上的內(nèi)容拷貝到 PIL 圖像內(nèi)存。

          既然這個模塊可以獲取當(dāng)前屏幕上的內(nèi)容,那么我一直不間斷地獲取,然后把這些獲取的內(nèi)容拼起來,那不就是視頻了嗎?

          實(shí)現(xiàn)

          錄制

          整體思路是 PIL 模塊中的 ImageGrab 不停的獲得當(dāng)前屏幕,利用 opencv 寫入視頻流。

          def?video_record(sttime):
          ????global?name
          ????#?當(dāng)前的時間(當(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)?+?'秒后開始錄制----')
          ????time.sleep(int(sttime))
          ????print('開始錄制!')
          ????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)
          ????????#?寫入
          ????????video.write(imm)

          錄制視頻的主要代碼只需幾行即可,但是我們需要對錄制操作進(jìn)行控制,例如開始錄制、結(jié)束錄制等。以及獲取屏幕內(nèi)容之后,需要對內(nèi)容進(jìn)行轉(zhuǎn)碼,然后寫入視頻流。

          監(jiān)聽鍵盤事件

          錄制視頻我們是使用的一個 while 循環(huán)來獲取屏幕信息,開始之后會一直進(jìn)行。但是我們需要監(jiān)聽鍵盤事件,來終止這個循環(huán),從而終止錄制視頻。這個監(jiān)聽事件就顯得很重要了,這里采用的是 pynput 這個強(qiáng)大的三方庫,可以全局監(jiān)聽鍵盤、鼠標(biāo)事件。

          我們設(shè)定的是用戶在按下鍵盤的 ESC 按鍵后,終止 while 循環(huán),從而終止視頻錄制。

          #?監(jiān)聽按鍵
          def?on_press(key):
          ????global?flag
          ????if?key?==?keyboard.Key.esc:
          ????????flag?=?True
          ????????#?返回False,鍵盤監(jiān)聽結(jié)束!
          ????????return?False

          主體控制

          因?yàn)槲覀冃枰粩嗟孬@取屏幕內(nèi)容,所以我們最好啟動一個線程來干這個事情。

          th?=?threading.Thread(target=video_record,?args=sstime)
          ????th.start()
          ????with?keyboard.Listener(on_press=on_press)?as?listener:
          ????????listener.join()

          視頻信息

          錄制視頻結(jié)束之后,我們也可以獲取視頻的一些相關(guān)信息,例如時長、幀率、分辨率等。

          #?視頻信息
          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('幀數(shù)=%.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))))

          效果

          最后,我啟兩個程序,第一個程序啟動錄制之后,我再來操作第二個程序,這樣大家就可以看到這個程序的運(yùn)行過程:


          總結(jié)

          這里的程序只是一個初版,剛剛實(shí)現(xiàn)了錄制屏幕的想法。后續(xù)還需要對其進(jìn)行改進(jìn),支持 GUI 界面操作,支持框選特定區(qū)域錄制等等。

          獲取文中完整代碼,請在公眾號回復(fù)關(guān)鍵字 錄屏

          如果文章對你有幫助,歡迎轉(zhuǎn)發(fā)/點(diǎn)贊/收藏~

          者:閑歡
          來源:Python 技術(shù)「ID: pythonall」


          _往期文章推薦_

          效果爆炸的漫畫變身AI,python代碼已開源




          如需了解付費(fèi)精品課程教學(xué)答疑服務(wù)
          請在Crossin的編程教室內(nèi)回復(fù): 666

          瀏覽 96
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  在线观看一区二区视频 | 四虎4hu| AA片在线免费观看 | 欧美大香蕉四级片在线网站成熟 | 99伊人|