国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Python和FFmpeg強(qiáng)強(qiáng)聯(lián)合

ThreeWords / 2149人閱讀

摘要:核心子進(jìn)程運(yùn)行控制。由應(yīng)用來看,關(guān)鍵是錄制屏幕和錄制攝像頭,以及用快捷鍵控制在這兩者之間切換。限制條件是超過三個(gè)月快捷鍵失效。實(shí)現(xiàn)分兩步安裝時(shí)在注冊(cè)表特定位置,假如是,寫入目錄相關(guān)信息。在程序運(yùn)行時(shí),檢測(cè)當(dāng)前目錄是否存在于注冊(cè)表下。

錄制項(xiàng)目終于做完,不用總是提醒自己抓緊時(shí)間這樣來想問題了。
在完成之后帶著一些滿足感,回頭看看哪些地方是需要改進(jìn)的,哪些地方又是有更好的替代方案,自己又有哪些不足。

下面按照軟件的各部分分別作總結(jié)記錄: 0. 軟件應(yīng)用場(chǎng)景:

??客戶希望用視頻+音頻的方式錄制下會(huì)議的內(nèi)容。除了錄制會(huì)議室情況之外,會(huì)議中還有可能需要錄制電腦屏幕內(nèi)容,比如在做PPT講解等,所以需要一個(gè)在兩種錄制方式之間快捷切換的軟件。除此之外,需要一個(gè)防止復(fù)制運(yùn)行的機(jī)制和完整的安裝包。

1. 核心:subprocess子進(jìn)程運(yùn)行控制。

??由應(yīng)用來看,關(guān)鍵是錄制屏幕和錄制攝像頭,以及用快捷鍵控制在這兩者之間切換。
??我的實(shí)現(xiàn)是通過python3調(diào)用ffmpeg,ffmpeg實(shí)現(xiàn)錄制,python來完成切換。
??從開發(fā)角度來說,并不算難,拋去錄制這個(gè)功能,這個(gè)軟件實(shí)際上應(yīng)該這樣描述:python完全控制ffmpeg.exe進(jìn)程的應(yīng)用。
??進(jìn)一步地說,ffmpeg能做到的,軟件大部分都可以做到,不同的是可以添加快捷鍵控制等,可以用python對(duì)除了ffmpeg功能之外做一些必要的補(bǔ)充。比如,客戶在需求實(shí)現(xiàn)之前測(cè)試發(fā)現(xiàn)win10系統(tǒng)下自買的攝像頭運(yùn)行時(shí)間長(zhǎng)了之后會(huì)隨機(jī)的中斷錄制,賣家也無辦法解決,因?yàn)槭莣in10系統(tǒng)兼容性問題。所以客戶提出在錄制異常中斷的情況下,能夠自動(dòng)重新開始錄制。這個(gè)需求的滿足就依賴python對(duì)ffmpeg的補(bǔ)充。
??另外,完全控制ffmpeg進(jìn)程關(guān)鍵在于如何自然退出。ffmpeg在cmd運(yùn)行按下q鍵是退出,利用這一點(diǎn)往子進(jìn)程輸入流寫入"q"實(shí)現(xiàn)了自然退出,保證了數(shù)據(jù)的正常寫入和保存,并且不會(huì)引發(fā)異常情況。如果不得益于這一點(diǎn),用os.kill(process_id)等方式都很難去控制進(jìn)程的正常退出。
??下面是代碼結(jié)構(gòu)簡(jiǎn)化版思維導(dǎo)圖:

2. 界面和pyqt5:

??界面相當(dāng)?shù)暮?jiǎn)單,主界面是一個(gè)按鈕+錄制時(shí)間顯示。
??

??功能性的右鍵菜單:
??

??設(shè)置界面:

??軟件為了客戶方便定制化使用,提供了必要的參數(shù)設(shè)置。實(shí)現(xiàn)時(shí)用到了configparser。快捷鍵部分還有待完善。

??

??程序主要的錄制狀態(tài)變化通過托盤圖標(biāo)的來展示。三種錄制狀態(tài)的托盤圖標(biāo)如下:

??為了盡可能少的讓主界面出現(xiàn)在錄制內(nèi)容中,當(dāng)失去焦點(diǎn)時(shí),窗口就會(huì)隱藏,這大概也就是客戶能夠容忍的原因:)。
??界面實(shí)現(xiàn)用的是pyqt5,因?yàn)橐郧白约鹤鲞^c#的winform和java的swing開發(fā),界面的處理邏輯又大同小異,所以參照著qt的文檔這塊能夠比較順手的處理。
??pyqt源自qt,而qt的文檔非常全面,參照著文檔在寫pyqt代碼時(shí)注意一點(diǎn)與c++語法的區(qū)別就好了。
??如果能夠更深入的用pyqt開發(fā),有想過寫一篇《qt大局觀》的總結(jié),就是整理一下圖形界面開發(fā)的模型以及與qt相比的相同點(diǎn)不同點(diǎn),一來是自己覺得如果有這樣一篇大局觀的介紹文章能夠幫助自己節(jié)省大量的時(shí)間;二來能夠幫助從其他語言切換到qt或者新學(xué)習(xí)qt的開發(fā)人員在查詢qt文檔之前有更清晰的思路,那就更好了。
??如果要寫這篇文章大致從以下幾個(gè)方面入手:

共同性,比如都是基于事件驅(qū)動(dòng)
通常有哪些常用或特別的控件?
每個(gè)或某類控件都有哪些通用的事件?
窗體加載機(jī)制有何不同?
在qt開發(fā)時(shí)又是怎么樣的?
具體一點(diǎn),比如quitOnLastWindowClosed()的效果是怎樣的?會(huì)帶來什么問題?
qt的信號(hào)槽機(jī)制相比winform事件機(jī)制有何不同?等等。
3. 簡(jiǎn)易的防復(fù)制運(yùn)行機(jī)制

??這個(gè)機(jī)制的目的是限制不是通過安裝包安裝的,運(yùn)行都要受到限制。限制條件是超過三個(gè)月快捷鍵失效。實(shí)現(xiàn)分兩步:

1.安裝時(shí)在注冊(cè)表特定位置,假如是A,寫入目錄相關(guān)信息。
2.在程序運(yùn)行時(shí),檢測(cè)當(dāng)前目錄是否存在于注冊(cè)表A下。

??具體實(shí)現(xiàn)時(shí),A位置下保存兩類信息,一類是正常安裝的目錄,比如以"INSTALL+時(shí)間"為鍵名稱,值為安裝目錄,時(shí)間用以區(qū)分多次安裝;另一類是在非安裝目錄第一次運(yùn)行的時(shí)間,實(shí)際就一個(gè)而且不可改變,這樣保證了所有非安裝目錄都有同一個(gè)時(shí)間限制基礎(chǔ)。
??更完善的實(shí)現(xiàn)應(yīng)該對(duì)所有的鍵值加密處理。

4. 軟件打包,包括cx_Freeze編譯和inno setup打包安裝文件。

??這是第一個(gè)有自己署名的軟件,也是第一次從無到有完整的做出一個(gè)有安裝包的軟件。
??軟件打包分成了兩步:

用cx_Freeze將python代碼編譯為exe文件。編譯python代碼為exe一般常見的工具有py2exe、pyinstaller、cx_Freeze等,因?yàn)檫@次開發(fā)用的python3.6,而只有cx_Freeze對(duì)3.6支持最好,所以自然也就用了cx_Freeze。原本網(wǎng)上的教程看到cx_Freeze也是可以定制打包復(fù)雜安裝文件的,但是在自己的實(shí)驗(yàn)過程中始終在access數(shù)據(jù)庫相關(guān)的模塊報(bào)錯(cuò)。使用bdist_msi生成的簡(jiǎn)單安裝包不夠用,而且中文支持不好。然后仔細(xì)看過一篇文檔,發(fā)現(xiàn)cx_Freeze推薦的inno setup。

用inno setup定制軟件安裝包。按照inno setup默認(rèn)的生成安裝包向?qū)?shí)驗(yàn)一遍后,發(fā)現(xiàn)這東西太強(qiáng)了太好用了,前面花在cx_Freeze上折騰的時(shí)間簡(jiǎn)直是浪費(fèi)。
inno setup使用類似配置文件的結(jié)構(gòu)來定制安裝包所需要的功能。
最常用的應(yīng)該是[Tasks]即任務(wù)節(jié)點(diǎn),在該節(jié)點(diǎn)下面定義安裝包需要執(zhí)行的任務(wù)。任務(wù)屬性有名稱、描述、觸發(fā)條件、可選屬性等,其他節(jié)點(diǎn)可通過任務(wù)的名稱來關(guān)聯(lián)任務(wù)。
比如給用戶添加是否開機(jī)啟動(dòng)的選擇項(xiàng),首先定義任務(wù):

[Tasks]
Name: "startupicon"; Description: "開機(jī)啟動(dòng)"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked 

然后,當(dāng)這個(gè)任務(wù)startupicon被選中需要執(zhí)行時(shí),在用戶電腦的啟動(dòng)目錄添加快捷方式:

[Icons]
Name: "{userstartup}{#MyAppName}"; Filename: "{app}{#MyAppExeName}"; Tasks: startupicon

這里[Icons]節(jié)點(diǎn)和[Tasks]關(guān)聯(lián)起來的屬性就是[Icons]的Tasks: startupicon。其他的Files等節(jié)點(diǎn)也可以用同樣的方式關(guān)聯(lián)任務(wù)。
一個(gè)完整的inno配置文件在保證邏輯性的同時(shí)還非常簡(jiǎn)潔,這一點(diǎn)非常強(qiáng)大。本項(xiàng)目的打包文件參見目錄中的setup.iss文件。
不過它的強(qiáng)大還不止于這一點(diǎn),另一個(gè)原因是inno自帶一個(gè)叫Pascal的腳本語言,這可就讓可定制性直接上升一個(gè)臺(tái)階。Pascal不僅內(nèi)置常用的函數(shù),還可以自己寫Pascal代碼。看過示例腳本過后,也就不難想象現(xiàn)在的下載網(wǎng)站下載下來的安裝包有各種各樣的廣告是怎么實(shí)現(xiàn)的了。

5. 不能再忘的git

??版本管理軟件對(duì)開發(fā)人員來說就像一個(gè)保險(xiǎn)柜一樣,重要性不言而喻。以前自己總是零零碎碎的接觸到git,始終沒有用git真正的來管理一個(gè)項(xiàng)目,這次利用這個(gè)軟件正好好好的學(xué)習(xí)git,不能再忘了。
??以下自己按照使用邏輯再手敲一遍常用git(version:2.16.2.windows)管理命令及注釋:

    git init 夢(mèng)開始的地方
    git status 查看項(xiàng)目狀態(tài),使用率最高
    git add /. 將文件修改讓git管理
    git reset HEAD  撤銷git管理
    git checkout --  撤銷修改(未add之前)
    
    git rm [-r]  刪除git已管理的文件,文件被刪除
    git rm [-r] --cached  撤銷git已管理的文件,文件仍存在
    撤銷刪除跟撤銷修改一樣.
    
    git commit -m "注釋" 提交修改并備注修改緣由
    git log 提交記錄
    git reflog 命令歷史記錄
    git reset --hard HEAD^^/HEAD~2/commit_id 回退到上上個(gè)版本或者回到指定commit_id版本
    
    git pull origin master  與遠(yuǎn)程倉(cāng)庫origin下的master分支同步 
    git push origin master 將本地的修改推送到遠(yuǎn)程倉(cāng)庫origin下的master分支
    
    git remote -v 查看遠(yuǎn)程倉(cāng)庫信息
    git branch 查看全部分支
    git branch  創(chuàng)建分支
    git checkout  切換到分支
    git checkout -b  創(chuàng)建分支并切換到該分支
    git branch -d/-D  刪除分支
    
    git merge [--no-ff保留分支信息]  合并分支
    
    git stash [list] [apply恢復(fù)] [drop刪除] [pop恢復(fù)并刪除] 將修改臨時(shí)保存

暫時(shí)熟練的就這些,以后再更新。
軟件代碼發(fā)布在record-camera-and-screen。
創(chuàng)建了兩個(gè)分支gutin和dev。gutin是給客戶的版本,dev是自己想在這個(gè)軟件上進(jìn)一步的完善。

6. 交付效果:

??軟件運(yùn)行效果:在分辨率為1024x768、幀率30/s、h264編碼、i5 cpu threads=4的情況下錄制,cpu占有率保持在30%~40%之間(這是ffmpeg的功勞)。
??開發(fā)分兩次提出,客戶第一次的需求主要是錄制,第二次是調(diào)整和增加附加功能。兩次合作及時(shí)完成了客戶的需求,都得到了用戶滿意的反饋。

7. 項(xiàng)目收獲:

加深了對(duì)python的了解,更熟練的編寫python代碼。

在開發(fā)過程中,練習(xí)使用git管理自己的代碼。并且利用版本回退幫助自己查找bug引發(fā)的原因,相信以后git會(huì)成為我開發(fā)工作中必不可少的幫手。這次不同的是,是在自己一手寫出來的代碼基礎(chǔ)上進(jìn)行管理,所以得心應(yīng)手很多。以往總是試著去github上clone別人的項(xiàng)目別人的代碼,作為一個(gè)新手,自己首先就面對(duì)的是不熟悉的項(xiàng)目和代碼,如果說在這個(gè)基礎(chǔ)上再學(xué)習(xí)git的操作和概念,其實(shí)是很難的。所以以前總是沒能好好的掌握git。

開發(fā)這個(gè)軟件第一目的是再學(xué)習(xí)如何解決在開發(fā)過程中遇到的問題。
這次開發(fā)遇到最大的難題是write(q),為什么這么說?確定是不是采用python+ffmpeg.exe的形式來實(shí)現(xiàn)的關(guān)鍵點(diǎn)在于對(duì)ffmpeg.exe進(jìn)程的完全控制。首先,查看了subprocess的文檔,確定了完全控制一個(gè)子進(jìn)程不成問題;然后在cmd下實(shí)驗(yàn)了攝像頭錄制和屏幕錄制,就是ffmpeg在多帶帶運(yùn)行的情況下,實(shí)現(xiàn)錄制功能。這兩點(diǎn)實(shí)驗(yàn)過后都沒有問題,然后自以為兩者的結(jié)合會(huì)順其自然的順利。結(jié)果就卡在了停止錄制時(shí),怎么處理ffmpeg進(jìn)程的退出方式。

第一次實(shí)驗(yàn)是Popen.terminate()和kill(),實(shí)際發(fā)現(xiàn)ffmpeg根本無動(dòng)于衷。[原因待確認(rèn)]
然后用Popen.send_signal(CTRL_C_EVENT)確實(shí)是可以控制ffmpeg進(jìn)程退出了,結(jié)果看錄制的視頻,最后一部分錄制內(nèi)容丟失了,很顯然是ffmpeg不正常退出導(dǎo)致的。由此也明白了,光退出還不行,還得自然的退出。雖然知道凡強(qiáng)制的方式必定不是自然的,期間抱著試試的態(tài)度也用到了os.kill(),結(jié)果果然不如人愿。
然后回頭復(fù)盤,想著CTRL_C_EVENT是模擬按鍵進(jìn)行退出,那么模擬q鍵退出是不是可行呢?CTRL_C_EVENT是python提供的,那么怎么模擬自定義按鍵呢?接著就嘗試了stdin.write("q")方式,結(jié)果令人振奮,不僅錄制內(nèi)容完整,而且沒有強(qiáng)制退出時(shí)偶爾引起的程序異常。事實(shí)證明這樣的處理方式是最自然的。還記得當(dāng)時(shí)解決這個(gè)難題是多么的開心和滿足,這種滿足感也正是自己的開發(fā)樂趣所在。不過解決舊問題的同時(shí),常常也許會(huì)引發(fā)新的問題。與輸入流交互的write("q")方式也就必須讓Popen(universal_newlines=True),而這后面也凸顯了ffmpeg對(duì)中文支持不太友好的問題,不過都得到了解決。

最后經(jīng)過這個(gè)軟件的開發(fā),讓自己從整體上對(duì)軟件有了一個(gè)新的認(rèn)識(shí)。
任何一個(gè)軟件簡(jiǎn)潔到可以用一句話說清楚。知道最終的目的是什么,從一個(gè)模型框架開始,我們所做的工作無非就是在這個(gè)模型之上添磚加瓦。軟件的不同之處在于,包含的磚瓦種類數(shù)目,每種磚每個(gè)瓦的開發(fā)難度,以及它們用什么樣的方式合在一起。最終構(gòu)建成一座高樓大廈。收獲了完成一件作品時(shí)的喜悅,同時(shí),也看到了自己能力的局限性。
想構(gòu)建更強(qiáng)更大的軟件不光是要提升自己的能力,找到一個(gè)好的團(tuán)隊(duì),并一起合作創(chuàng)造才是最佳途徑。

8. 未來改進(jìn)和擴(kuò)展:
完善快捷鍵
錄制狀態(tài)切換音效和添加動(dòng)畫【學(xué)習(xí)pyqt的繪制】
視頻輸出優(yōu)化:添加水印和標(biāo)簽等
界面美化:用圓形框取代方形按鈕
添加支付接口
添加實(shí)時(shí)錄制預(yù)覽窗口
改成個(gè)人的演講練習(xí)錄制工具
9. 個(gè)人其他開發(fā)項(xiàng)目

github: www.github.com/ilinxiao

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/41903.html

相關(guān)文章

  • 很好的東西

    摘要:接著想使用播放視頻,按照官方教程只要將的變量修改為視頻文件名即可,程序如下在上查看代碼片派生到我的代碼片但是始終無法獲取視頻圖像,貌似這個(gè)問題很普遍,以至在官方教程的程序下面都提示說請(qǐng)確認(rèn)或者已經(jīng)正確安裝。 博主一開始使用python2.7和Opencv2.4.10來獲取攝像頭圖像,程序如下: [plain] view plain copy 在CODE上查看代碼片派生到我的代碼片 ...

    caozhijian 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<