錄製項目終於作完,不用老是提醒本身抓緊時間這樣來想問題了。
在完成以後帶着一些知足感,回頭看看哪些地方是須要改進的,哪些地方又是有更好的替代方案,本身又有哪些不足。java
客戶但願用視頻+音頻的方式錄製下會議的內容。除了錄製會議室狀況以外,會議中還有可能須要錄製電腦屏幕內容,好比在作PPT講解等,因此須要一個在兩種錄製方式之間快捷切換的軟件。除此以外,須要一個防止複製運行的機制和完整的安裝包。python
由應用來看,關鍵是錄製屏幕和錄製攝像頭,以及用快捷鍵控制在這二者之間切換。
個人實現是經過python3調用ffmpeg,ffmpeg實現錄製,python來完成切換。
從開發角度來講,並不算難,拋去錄製這個功能,這個軟件實際上應該這樣描述:python徹底控制ffmpeg.exe進程的應用。
進一步地說,ffmpeg能作到的,軟件大部分均可以作到,不一樣的是能夠添加快捷鍵控制等,能夠用python對除了ffmpeg功能以外作一些必要的補充。好比,客戶在需求實現以前測試發現win10系統下自買的攝像頭運行時間長了以後會隨機的中斷錄製,賣家也無辦法解決,由於是win10系統兼容性問題。因此客戶提出在錄製異常中斷的狀況下,可以自動從新開始錄製。這個需求的知足就依賴python對ffmpeg的補充。
另外,徹底控制ffmpeg進程關鍵在於如何天然退出。ffmpeg在cmd運行按下q鍵是退出,利用這一點往子進程輸入流寫入'q'實現了天然退出,保證了數據的正常寫入和保存,而且不會引起異常狀況。若是不得益於這一點,用os.kill(process_id)等方式都很難去控制進程的正常退出。
下面是代碼結構簡化版思惟導圖:
c++
界面至關的簡單,主界面是一個按鈕+錄製時間顯示。
git
功能性的右鍵菜單:
github
設置界面:數據庫
軟件爲了客戶方便定製化使用,提供了必要的參數設置。實現時用到了configparser。快捷鍵部分還有待完善。c#
程序主要的錄製狀態變化經過托盤圖標的來展現。三種錄製狀態的托盤圖標以下:
爲了儘量少的讓主界面出如今錄製內容中,當失去焦點時,窗口就會隱藏,這大概也就是客戶可以容忍的緣由:)。
界面實現用的是pyqt5,由於之前本身作過c#的winform和java的swing開發,界面的處理邏輯又大同小異,因此參照着qt的文檔這塊可以比較順手的處理。
pyqt源自qt,而qt的文檔很是全面,參照着文檔在寫pyqt代碼時注意一點與c++語法的區別就行了。
若是可以更深刻的用pyqt開發,有想過寫一篇《qt大局觀》的總結,就是整理一下圖形界面開發的模型以及與qt相比的相同點不一樣點,一來是本身以爲若是有這樣一篇大局觀的介紹文章可以幫助本身節省大量的時間;二來可以幫助從其餘語言切換到qt或者新學習qt的開發人員在查詢qt文檔以前有更清晰的思路,那就更好了。
若是要寫這篇文章大體從如下幾個方面入手:windows
共同性,好比都是基於事件驅動
一般有哪些經常使用或特別的控件?
每一個或某類控件都有哪些通用的事件?
窗體加載機制有何不一樣?
在qt開發時又是怎麼樣的?
具體一點,好比quitOnLastWindowClosed()的效果是怎樣的?會帶來什麼問題?
qt的信號槽機制相比winform事件機制有何不一樣?等等。
這個機制的目的是限制不是經過安裝包安裝的,運行都要受到限制。限制條件是超過三個月快捷鍵失效。實現分兩步:app
1.安裝時在註冊表特定位置,假如是A,寫入目錄相關信息。
2.在程序運行時,檢測當前目錄是否存在於註冊表A下。
具體實現時,A位置下保存兩類信息,一類是正常安裝的目錄,好比以'INSTALL+時間'爲鍵名稱,值爲安裝目錄,時間用以區分屢次安裝;另外一類是在非安裝目錄第一次運行的時間,實際就一個並且不可改變,這樣保證了全部非安裝目錄都有同一個時間限制基礎。
更完善的實現應該對全部的鍵值加密處理。框架
這是第一個有本身署名的軟件,也是第一次從無到有完整的作出一個有安裝包的軟件。
軟件打包分紅了兩步:
用inno setup定製軟件安裝包。按照inno setup默認的生成安裝包嚮導實驗一遍後,發現這東西太強了太好用了,前面花在cx_Freeze上折騰的時間簡直是浪費。
inno setup使用相似配置文件的結構來定製安裝包所須要的功能。
最經常使用的應該是[Tasks]即任務節點,在該節點下面定義安裝包須要執行的任務。任務屬性有名稱、描述、觸發條件、可選屬性等,其餘節點可經過任務的名稱來關聯任務。
好比給用戶添加是否開機啓動的選擇項,首先定義任務:
[Tasks] Name: "startupicon"; Description: "開機啓動"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked
而後,當這個任務startupicon被選中須要執行時,在用戶電腦的啓動目錄添加快捷方式:
[Icons] Name: "{userstartup}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; Tasks: startupicon
這裏[Icons]節點和[Tasks]關聯起來的屬性就是[Icons]的Tasks: startupicon。其餘的Files等節點也能夠用一樣的方式關聯任務。
一個完整的inno配置文件在保證邏輯性的同時還很是簡潔,這一點很是強大。本項目的打包文件參見目錄中的setup.iss文件。
不過它的強大還不止於這一點,另外一個緣由是inno自帶一個叫Pascal的腳本語言,這可就讓可定製性直接上升一個臺階。Pascal不只內置經常使用的函數,還能夠本身寫Pascal代碼。看過示例腳本事後,也就不難想象如今的下載網站下載下來的安裝包有各類各樣的廣告是怎麼實現的了。
版本管理軟件對開發人員來講就像一個保險櫃同樣,重要性不言而喻。之前本身老是零零碎碎的接觸到git,始終沒有用git真正的來管理一個項目,此次利用這個軟件正好好好的學習git,不能再忘了。
如下本身按照使用邏輯再手敲一遍經常使用git(version:2.16.2.windows)管理命令及註釋:
git init 夢開始的地方 git status 查看項目狀態,使用率最高 git add <file>/. 將文件修改讓git管理 git reset HEAD <file> 撤銷git管理 git checkout -- <file> 撤銷修改(未add以前) git rm [-r] <file> 刪除git已管理的文件,文件被刪除 git rm [-r] --cached <file> 撤銷git已管理的文件,文件仍存在 撤銷刪除跟撤銷修改同樣. git commit -m '註釋' 提交修改並備註修改原因 git log 提交記錄 git reflog 命令歷史記錄 git reset --hard HEAD^^/HEAD~2/commit_id 回退到上上個版本或者回到指定commit_id版本 git pull origin master 與遠程倉庫origin下的master分支同步 git push origin master 將本地的修改推送到遠程倉庫origin下的master分支 git remote -v 查看遠程倉庫信息 git branch 查看所有分支 git branch <branch_name> 建立分支 git checkout <branch_name> 切換到分支 git checkout -b <branch_name> 建立分支並切換到該分支 git branch -d/-D <branch_name> 刪除分支 git merge [--no-ff保留分支信息] <branch_name> 合併分支 git stash [list] [apply恢復] [drop刪除] [pop恢復並刪除] 將修改臨時保存
暫時熟練的就這些,之後再更新。
軟件代碼發佈在record-camera-and-screen。
建立了兩個分支gutin和dev。gutin是給客戶的版本,dev是本身想在這個軟件上進一步的完善。
軟件運行效果:在分辨率爲1024x76八、幀率30/s、h264編碼、i5 cpu threads=4的狀況下錄製,cpu佔有率保持在30%~40%之間(這是ffmpeg的功勞)。
開發分兩次提出,客戶第一次的需求主要是錄製,第二次是調整和增長附加功能。兩次合做及時完成了客戶的需求,都獲得了用戶滿意的反饋。
第一次實驗是Popen.terminate()和kill(),實際發現ffmpeg根本無動於衷。[緣由待確認]
而後用Popen.send_signal(CTRL_C_EVENT)確實是能夠控制ffmpeg進程退出了,結果看錄製的視頻,最後一部分錄制內容丟失了,很顯然是ffmpeg不正常退出致使的。由此也明白了,光退出還不行,還得天然的退出。雖然知道凡強制的方式一定不是天然的,期間抱着試試的態度也用到了os.kill(),結果果真不如人願。
而後回頭覆盤,想着CTRL_C_EVENT是模擬按鍵進行退出,那麼模擬q鍵退出是否是可行呢?CTRL_C_EVENT是python提供的,那麼怎麼模擬自定義按鍵呢?接着就嘗試了stdin.write('q')方式,結果使人振奮,不只錄製內容完整,並且沒有強制退出時偶爾引發的程序異常。事實證實這樣的處理方式是最天然的。還記得當時解決這個難題是多麼的開心和知足,這種知足感也正是本身的開發樂趣所在。不過解決舊問題的同時,經常也許會引起新的問題。與輸入流交互的write('q')方式也就必須讓Popen(universal_newlines=True),而這後面也凸顯了ffmpeg對中文支持不太友好的問題,不過都獲得瞭解決。
完善快捷鍵
錄製狀態切換音效和添加動畫【學習pyqt的繪製】
視頻輸出優化:添加水印和標籤等
界面美化:用圓形框取代方形按鈕
添加支付接口
添加實時錄製預覽窗口
改爲我的的演講練習錄製工具
github: www.github.com/ilinxiao