# my_cam_py 我的桌面錄影 用 python 寫的桌面錄影工具
作了一套桌面錄影小工具
截 4k 60fps 馬蓋先的影片展示,相當的順暢,畫質也很清晰,影片與聲音也都對上(撒花)
比 power point 截的品質好多了,ppt 的幀數有點慘啊...
原始碼網址:
https://github.com/shadowjohn/my_cam_py
開發動機:
覺得人生是該寫一個桌面錄影,就開始寫了
雖然 ffmpeg 錄桌面很好用,或是 win+G 內鍵的錄桌面,或是 powerpoint 內鍵的桌面錄影
現在測試 python 的 mss 與 openai 處理影像的部份,可以作到截看youtube 4k 60fps 也相當順暢,下一步打算用 yolo 作點練習
版本:
V0.01
作者:
羽山秋人 (https://3wa.tw)
版權:
MIT
最初開發日期:
2024-07-12
使用方法:
- 1. 框選螢幕想錄的範圍
- 2. 設定好 fps,通常大概只會選 30 或 60 吧
- 3. 壓縮品質,與 png 壓縮品質有關 0 最清晰,建議設 1 或 2
- 4. 要錄滑鼠指標嗎 可勾選
- 5. 錄系統聲音嗎 可勾選
- 6. 要錄麥克風嗎 可勾選
- 7. 按下開始錄影即開始
- 8. 按下停止錄影,會稍卡一下,按下確定後,會開始進行影片、聲音合併轉檔
- 9. 打開資料夾,影片會存在執行程式的 output 目錄
程式執行畫面
相依套件:
python3.12 x64 位元,建議可安裝在 C:\python312_64
將系統路徑
PATH 加上 C:\python312_64
PATH 加上 C:\python312_64\Scripts
![//3wa.tw/photo/small.php?w_size=1280&compassion=95&file_name=users/shadow/1720975298_2.png&n](//3wa.tw/photo/small.php?w_size=1280&compassion=95&file_name=users/shadow/1720975298_2.png&n)
環境變數 PATH 設定
opencv-python==4.10.0.84
sounddevice==0.4.7 soundfile==0.12.1
scipy==1.14.0 moviepy==1.0.3
pydub==0.25.1
pywin32==306
pywin32-ctypes==0.2.2
pyinstaller==6.9.0 mss (此版羽山有微調 base.py 與 windows.py) 詳見 requirements.txt
安裝相關套件:
pip install -r requirements.txt
啟動:
run.bat
編譯成exe:
可詳見 build.bat 如果不想執行時有視窗,可以加上 -w 參數
成果範例:
https://github.com/shadowjohn/my_cam_py/tree/main/examples
更新歷程:
(2024-07-14) v0.01 版:
初版簽入
Todo:
開發心得:
之前同樣的程式也有用 C# 開發一次,這次用 python,python 寫 GUI 還是比較麻煩些~
不過現在有 chatgpt 可以問,會省很多事情,上次用 C# 寫沒有考慮影片與聲音合併時,
如果幀數不足指定幀數,會有影像與聲音不同步的問題,這次在 python 裡加了幾行,判斷
每一個影格間是否符合fps的時間 (1/fps) ,超過就要補影格,用上一個影隔即可,如果低於
代表過多影像,就要跳過,觀念很簡單,確實可以順利運作
另外就是處理系統聲音與麥克風聲音的合併比較麻煩,這個如果沒問 chatgpt 單靠查
Stack Overflow 或翻文件,可能也會花很多時間...
另外就是 mss 處理截圖時的每個影格,一截完就轉 BGRAtoRGB 給影片合併
如:
frame_rgb = cv2.cvtColor(np.array(current_frame), cv2.COLOR_RGBA2RGB)
GDATA["out"].write(frame_rgb)
這個步驟會花很多 cpu ,所以抓畫面讓他專心抓就好,再用另一個排程去消化已抓的圖
不過缺點是用 60fps 抓,ram 會飆高,來不及消化資料,也許要再考慮用更多的執行緒去消化
都轉完再進行輸出,有閒作下一次改版再調吧 XD
這個版本之後也許會改成可以拿來作點 yolo 的研究,一直想嘗試看看,有空就弄
同樣的東西如果要再開發一次,也許用 GUI 去呼叫 ffmpeg 就好,會省很多事
https://trac.ffmpeg.org/wiki/Capture/Desktop