文/IT可達鴨
圖/IT可達鴨、網絡
寫在前面
這次不蹭熱點了,簡簡單單分享一個錄屏軟件的源碼。我在閱讀了近十多個錄屏軟件的源碼後,發現這個是最簡單,最好練手的一個源碼。
為了便於理解,裡面的一些不必要的代碼我作了刪減,主要是用來學習研究。
- 環境配置
python版本: 3.6.0
編輯器: pycharm
項目所需要的環境安裝包
<code>pip
install numpy
pip
install opencv-python
pip
install pillow
/<code>
- 需要注意的點
要先安裝numpy,再安裝opencv-python。
第一步:導包
time: 是一個時間包,其中time.sleep(n) 表示主線程睡眠 n 秒鐘,子線程可以併發執行。
threading: 是一個關於線程操作的包,包括常用的線程函數、線程對象、鎖、事件等。
cv2: 是一個強大的圖像處理庫 opencv, 據說人臉識別、視頻處理等操作都可以做到。
numpy: 是一個擴展包,支持大量的維度數組與矩陣運算,包含大量數學函數。
PIL: 是一個圖像處理標準庫,一般和opencv一起用。
- 進程和線程簡單介紹
什麼是進程?舉個例子,音樂播放器是一個進程,瀏覽器也是一個進程,互相不干擾。
什麼是線程?音樂播放器中,音頻播放是一個線程、歌詞播放也是一個線程,它們之間有交流,保證歌詞和音頻同步播放。
第二步:錄屏線程編寫
寫一個屏幕錄製線程工具類,繼承 threading.Tread。重寫__init__() 方法,調用threading.Thread的__init__() 方法。重寫 run() 方法,不斷截屏,並保存到video 對象中。利用 b_record 來控制是否停止錄屏。這是一個線程開發的基本寫法,只要涉及多線程,都可以這麼寫。
後續如果想加一個錄製麥克風聲音,可以寫一個聲音錄製的線程類。
第三步:主函數
首先設定好錄屏保存的路徑,新建一個錄屏對象。 start() 啟動錄製線程,time.sleep(10)
表示主線程停留10秒,但是錄屏線程依舊運行。直到主線程運行十秒後,運行 stop_record(), 修改b_record 變量為Flase,錄屏線程檢測變化到就會立刻停止錄屏,並輸出保存視頻文件。
完整代碼
<code>import
timeimport
threadingfrom
cv2import
cv2import
numpyas
npfrom
PILimport
ImageGrabclass
VideoCapThread
(threading.Thread)
:def
__init__
(self, video_file=
'record.avi'
): threading.Thread.__init__(self) self.b_record =True
self.video = cv2.VideoWriter(video_file, cv2.VideoWriter_fourcc(*'XVID'
),32
, ImageGrab.grab().size)def
run
(self)
:while
self.b_record: im = ImageGrab.grab() imm = cv2.cvtColor(np.array(im), cv2.COLOR_RGB2BGR) self.video.write(imm) self.video.release() cv2.destroyAllWindows()def
stop_record
(self)
: self.b_record =False
if
__name__ =="__main__"
: avi_file ='data/avi_tmp.avi'
t1 = VideoCapThread(avi_file) t1.start() time.sleep(10
) t1.stop_re/<code>
最後,附上完整代碼。僅有三十多行,是不是非常簡潔?其實,編程也沒那麼難。
結語
當然,距離完整的錄屏軟件還有很多東西可以做。如果有興趣深究下去,可以在這個源碼的基礎上做優化和改進。例如,錄製屏幕的分辨率設置、錄屏位置座標自由設置、增加UI界面(QtPython)、增加聲音或者麥克風錄製、視頻音頻合併(FFmpeg)等等。
如果有疑問想獲取源碼,可以關注後,在後臺私信我,回覆:python錄屏。 我把源碼發你。持續關注"IT可達鴨" ,每天分享有趣Python源碼。最後,感謝大家的閱讀,祝大家工作生活愉快!