一種視頻錄制裝置及方法
【專利摘要】本發(fā)明提供一種視頻錄制裝置及方法,應(yīng)用于用戶主機(jī)上,該裝置包括:DLL注入單元,用于向目標(biāo)進(jìn)程中注入DLL,所述DLL包括視頻捕獲DLL;接口創(chuàng)建單元,用于創(chuàng)建Direct設(shè)備接口;函數(shù)替換單元,用于通過所述Direct設(shè)備接口將所述目標(biāo)進(jìn)程中的繪圖函數(shù)地址替換為所述視頻捕獲DLL中圖像捕獲函數(shù)的地址;函數(shù)調(diào)用單元,用于在所述目標(biāo)進(jìn)程每次調(diào)用所述繪圖函數(shù)前,調(diào)用所述圖像捕獲函數(shù)獲取后臺緩沖中待繪制的圖像像素數(shù)據(jù)。與現(xiàn)有技術(shù)相比,本發(fā)明可以通過對各Direct版本的繪圖函數(shù)進(jìn)行API?HOOK,從而得到顯卡上的圖像數(shù)據(jù),實現(xiàn)錄制全屏幕游戲視頻的同時,達(dá)到降低CPU、內(nèi)存等資源消耗的目的,提供更佳的服務(wù)體驗。
【專利說明】一種視頻錄制裝置及方法
【技術(shù)領(lǐng)域】
[0001]本發(fā)明涉及視頻【技術(shù)領(lǐng)域】,尤其涉及一種視頻錄制裝置及方法。
【背景技術(shù)】
[0002]隨著電子游戲產(chǎn)業(yè)的發(fā)展以及游戲玩家數(shù)量激增,玩家對于游戲體驗也有各種各樣的需求,其中之一就是將游戲畫面錄制成視頻,保存在本地或是上傳視頻到服務(wù)器進(jìn)行直播,供玩家間交流使用。目前一些可以提供游戲視頻錄制功能的軟件主要有11游戲直播插件,F(xiàn)raps, XSplit 等。
[0003]由于游戲直播時,要在游戲運(yùn)行時進(jìn)行同步視頻錄制,上述的幾款軟件在游戲開始后進(jìn)行視頻錄制時會占用大量CPU及內(nèi)存,降低系統(tǒng)運(yùn)行速度,從而導(dǎo)致游戲的卡頓、跳幀等問題。這樣非但不能正常的錄制視頻,還可能導(dǎo)致正在運(yùn)行的游戲進(jìn)程卡滯。由此可見,現(xiàn)有技術(shù)沒有充分考慮用戶對于服務(wù)體驗的要求,這在網(wǎng)絡(luò)游戲等應(yīng)用中,響應(yīng)延遲、畫面質(zhì)量等服務(wù)體驗對于用戶而言恰恰是非常重要的。
【發(fā)明內(nèi)容】
[0004]有鑒于此,本發(fā)明提供一種視頻錄制裝置,應(yīng)用于用戶主機(jī)上,該裝置包括:
[0005]DLL注入單元,用于向目標(biāo)進(jìn)程中注入DLL,所述DLL包括視頻捕獲DLL ;
[0006]接口創(chuàng)建單元,用于創(chuàng)建Direct設(shè)備接口 ;
[0007]函數(shù)替換單元,用于通過所述Direct設(shè)備接口將所述目標(biāo)進(jìn)程中的繪圖函數(shù)地址替換為所述視頻捕獲DLL中圖像捕獲函數(shù)的地址;
[0008]函數(shù)調(diào)用單元,用于在所述目標(biāo)進(jìn)程每次調(diào)用所述繪圖函數(shù)前,調(diào)用所述圖像捕獲函數(shù)獲取后臺緩沖中待繪制的圖像像素數(shù)據(jù)。
[0009]基于同樣的思想,本發(fā)明還提供一種視頻錄制方法,應(yīng)用于用戶主機(jī)上,其特征在于,該方法包括步驟:
[0010]向目標(biāo)進(jìn)程中注入DLL,所述DLL包括視頻捕獲DLL ;
[0011]創(chuàng)建Direct設(shè)備接口;
[0012]通過所述Direct設(shè)備接口將所述目標(biāo)進(jìn)程中的繪圖函數(shù)地址替換為所述視頻捕獲DLL中圖像捕獲函數(shù)的地址;
[0013]在所述目標(biāo)進(jìn)程每次調(diào)用所述繪圖函數(shù)前,調(diào)用所述圖像捕獲函數(shù)獲取后臺緩沖中待繪制的圖像像素數(shù)據(jù)。
[0014]與現(xiàn)有技術(shù)相比,本發(fā)明可以通過對各Direct版本的繪圖函數(shù)進(jìn)行ΑΡΙΗ00Κ (—種改變應(yīng)用程序編程接口執(zhí)行結(jié)果的技術(shù)),從而得到顯卡上的圖像數(shù)據(jù),實現(xiàn)錄制全屏幕游戲視頻的同時,達(dá)到降低CPU、內(nèi)存等資源消耗的目的,提供更佳的服務(wù)體驗。
【專利附圖】
【附圖說明】
[0015]圖1-1是本發(fā)明提供的一種視頻錄制裝置的結(jié)構(gòu)示意圖;[0016]圖1-2是本發(fā)明提供的一種視頻錄制方法的處理流程圖;
[0017]圖2是本發(fā)明實施例中版本判斷DLL的處理流程圖;
[0018]圖3是本發(fā)明實施例中一種注入DLL的處理流程圖;
[0019]圖4是本發(fā)明實施例中另一種注入DLL的處理流程圖;
[0020]圖5是本發(fā)明實施例中又一種注入DLL的處理流程圖;
[0021]圖6是本發(fā)明實施例中一種視頻錄制方法的處理流程圖。
【具體實施方式】
[0022]為解決上述問題,本發(fā)明提供一種視頻錄制裝置及方法,通過對各Direct版本的繪圖函數(shù)進(jìn)行API HOOK來實現(xiàn)錄制全屏幕游戲視頻的同時,達(dá)到降低CPU、內(nèi)存等資源消耗的目的,提供更佳的服務(wù)體驗。
[0023]請參見圖1-1,是本發(fā)明提供的一種視頻錄制裝置的結(jié)構(gòu)示意圖。所述視頻錄制裝置,應(yīng)用于用戶主機(jī)上,所述用戶主機(jī)包含CPU、非易失性存儲器、內(nèi)存以及其他硬件,所述裝置包括:
[0024]DLL注入單元,用于向目標(biāo)進(jìn)程中注入DLL,其中所述注入DLL包括視頻捕獲DLL ;
[0025]接口創(chuàng)建單元,用于創(chuàng)建Direct設(shè)備接口 ;
[0026]函數(shù)替換單元,用于通過所述Direct設(shè)備接口將所述目標(biāo)進(jìn)程中的繪圖函數(shù)地址替換為所述視頻捕獲DLL中圖像捕獲函數(shù)的地址;
[0027]函數(shù)調(diào)用單元,用于在所述目標(biāo)進(jìn)程每次調(diào)用所述繪圖函數(shù)前,調(diào)用所述圖像捕獲函數(shù)獲取后臺緩沖中待繪制的圖像像素數(shù)據(jù)。
[0028]所述視頻錄制裝置的處理流程如1-2所示,其中包括步驟:
[0029]101、向目標(biāo)進(jìn)程中注入DLL,所述DLL包括視頻捕獲DLL ;
[0030]102、創(chuàng)建 Direct 設(shè)備接 口 ;
[0031]103、通過所述Direct設(shè)備接口將所述目標(biāo)進(jìn)程中的繪圖函數(shù)地址替換為所述視頻捕獲DLL中圖像捕獲函數(shù)的地址;
[0032]104、在所述目標(biāo)進(jìn)程每次調(diào)用所述繪圖函數(shù)前,調(diào)用所述圖像捕獲函數(shù)獲取后臺緩沖中待繪制的圖像像素數(shù)據(jù)。
[0033]當(dāng)用戶需要錄制視頻時,內(nèi)存中的DLL注入單元就會向目標(biāo)進(jìn)程中注入DLL,其中,所述目標(biāo)進(jìn)程就是用戶要錄制視頻所在的進(jìn)程;所述DLL注入單元注入的DLL中又包含了多種DLL文件,其中之一就是所述視頻捕獲DLL。一旦所述視頻捕獲DLL被注入到目標(biāo)進(jìn)程后,就會由接口創(chuàng)建單元來創(chuàng)建一個Direct設(shè)備接口(又稱DirectX), DirectX是一組COM組件,COM是一種二進(jìn)制標(biāo)準(zhǔn),每一個COM里面提供了至少一個接口,而接口就是一組相關(guān)的函數(shù),這里使用DirectX,其實就是使用接口中的那些函數(shù)。
[0034]有了 Direct設(shè)備接口后,就可以獲取所述目標(biāo)進(jìn)程中的函數(shù),其中就包括繪圖函數(shù)。然后根據(jù)所述繪圖函數(shù)的指針查找到所述繪圖函數(shù)的地址;于是再將所述繪圖函數(shù)的地址替換為所述視頻捕獲DLL中圖像捕獲函數(shù)的地址;這樣就可以用所述圖像捕獲函數(shù)獲取所述目標(biāo)進(jìn)程中的視頻中的圖像像素數(shù)據(jù)。由于目標(biāo)進(jìn)程中的繪圖函數(shù)的地址已經(jīng)被替代,則所述目標(biāo)進(jìn)程每次調(diào)用所述繪圖函數(shù)時,其根據(jù)所述繪圖函數(shù)的地址指針獲取到的實際卻是所述圖像捕獲函數(shù)的地址。于是目標(biāo)進(jìn)程每利用繪圖函數(shù)繪制一幀圖像前,都會先調(diào)用所述圖像捕獲函數(shù),當(dāng)所述圖像捕獲函數(shù)獲取完目標(biāo)進(jìn)程后臺緩沖中待繪制的圖像像素數(shù)據(jù)后,將所述數(shù)據(jù)拷貝到新建的緩沖中;然后再調(diào)用所述繪圖函數(shù)根據(jù)目標(biāo)進(jìn)程后臺緩沖中待繪制的圖像像素數(shù)據(jù)進(jìn)程圖像繪制。由于所述后臺緩沖中的圖像像素數(shù)據(jù)都是可以是全屏或是非全屏狀態(tài)下下的圖像數(shù)據(jù),因此將所述圖像捕獲函數(shù)拷貝到新建緩沖中,就可以獲得的數(shù)據(jù)就是需要錄制的全屏或是非全屏狀態(tài)下的視頻的全屏視頻數(shù)據(jù)。
[0035]需要說明的是,所述圖像像素數(shù)據(jù)為RGB格式的數(shù)據(jù),可以作為圖像來顯示,無需附加其它函數(shù)。當(dāng)所述視頻錄制裝置獲取到所述圖像像素數(shù)據(jù)后,會根據(jù)用戶要求進(jìn)行相應(yīng)處理。若是用戶需要對該視頻進(jìn)行直播,則將所述新建緩沖中的圖像像素數(shù)據(jù)經(jīng)過H264編碼后,上傳到服務(wù)器,再由服務(wù)器對編碼后的數(shù)據(jù)進(jìn)行轉(zhuǎn)發(fā),接收端的用戶只需將所述數(shù)據(jù)進(jìn)行對應(yīng)的解碼,就可以獲取到該視頻其中一幀的圖像畫面,由于所述視頻錄制過程是實時進(jìn)行的,實現(xiàn)了視頻直播的效果;若用戶需要保存所述視頻而非直播時,則所述圖像像素數(shù)據(jù)就被從新建緩沖中保存到用戶指定或是默認(rèn)的存儲地址。
[0036]上述的調(diào)用圖像捕獲函數(shù)獲取圖像像素數(shù)據(jù)的過程就是API HOOK(—種改變應(yīng)用程序編程接口執(zhí)行結(jié)果的技術(shù))的過程,由于所述圖像像素數(shù)據(jù)處理過程都相對簡單,不需要進(jìn)行復(fù)雜的圖像處理。因此本發(fā)明可以通過ΑΡΙΗ00Κ調(diào)用圖像捕獲函數(shù)獲取圖像像素數(shù)據(jù),從而可以大大提高CPU的處理速度,減小對系統(tǒng)內(nèi)存資源的占用,從而有效的避免了卡頓、跳幀等現(xiàn)象,使用戶享受到更加順暢的視覺體驗。
[0037]上述API HOOK過程是本發(fā)明提供的視頻錄制裝置的主要工作過程,但是事實上在進(jìn)行API HOOK時,還可以通過更多的準(zhǔn)備工作來對其完善,以下的實施例中,會對所述APIHOOK的過程進(jìn)行進(jìn)一步的說明。
[0038]由于視頻捕獲DLL在創(chuàng)建Direct設(shè)備接口前需要知道主程序分配的相關(guān)句柄,所述句柄是一種指向指針的指針。眾所周知,Windows是一個以虛擬內(nèi)存為基礎(chǔ)的操作系統(tǒng)。在這種系統(tǒng)環(huán)境下,Windows內(nèi)存管理器經(jīng)常在內(nèi)存中來回移動對象,以此來滿足各種應(yīng)用程序的內(nèi)存需要。對象被移動意味著它的地址變化了。為了解決這個問題,Windows操作系統(tǒng)為全體應(yīng)用程序騰出一些內(nèi)存單元,用來專門登記各應(yīng)用程序的對象在內(nèi)存中的地址的變化,而前者的物理地址在系統(tǒng)運(yùn)行期間是始終保持不變的。Windows內(nèi)存管理器移動了對象在內(nèi)存中的位置后,會把該對象新的地址及時地告知給對應(yīng)的句柄進(jìn)行更新。這樣只要知道這個句柄,就可以間接地知道對象在內(nèi)存中的具體位置了。因此所述接口創(chuàng)建單元需要通過所述句柄來獲取目標(biāo)進(jìn)程中的函數(shù)在內(nèi)存中的具體位置,也就是函數(shù)指針。對于如何獲取句柄,下面進(jìn)行了進(jìn)一步的說明。
[0039]在本發(fā)明優(yōu)選的實施例中,所述裝置還包括指針獲取單元,所述指針獲取單元用于根據(jù)所述目標(biāo)進(jìn)程創(chuàng)建與其關(guān)聯(lián)的臨時窗口,所述句柄就是所述臨時窗口的標(biāo)識,于是將所述臨時窗口的句柄信息提供給主程序后,所述接口創(chuàng)建單元就可以通過所述臨時窗口獲取所述目標(biāo)進(jìn)程中的Direct函數(shù)指針;根據(jù)所述Direct函數(shù)指針來創(chuàng)建所述Direct設(shè)備接口。
[0040]值得注意的是,所述視頻捕獲DLL并不是唯一的,其根據(jù)目標(biāo)進(jìn)程所加載的最高Direct版本來確定。由于目前存在的Direct版本較多,在進(jìn)行DLL注入前,可能無法判斷所述目標(biāo)進(jìn)程加載的最高Direct版本,從而無法準(zhǔn)確的進(jìn)行視頻捕獲DLL的注入。因此,在優(yōu)選的實施例中,上述DLL注入單元向目標(biāo)進(jìn)程中注入DLL中,不僅包括上述視頻捕獲DLL,還包括版本判斷DLL。本發(fā)明所述DLL注入單元在注入所述視頻捕獲DLL前,先向所述目標(biāo)進(jìn)程中注入版本判斷DLL。請參見圖2,所述版本判斷DLL獲取目標(biāo)進(jìn)程加載的最高Direct版本具體步驟如下:
[0041]201、所述版本判斷DLL中的程序通過枚舉法獲取目標(biāo)進(jìn)程中加載的一個DLL句柄,如果獲取失敗,則說明已經(jīng)遍歷了所有加載的DLL,從而結(jié)束;如果成功,則轉(zhuǎn)步驟202 ;
[0042]202、根據(jù)所述DLL句柄獲取目標(biāo)進(jìn)程中DLL可執(zhí)行文件名稱;
[0043]203、根據(jù)所述DLL可執(zhí)行文件名稱判斷是否為Direct繪圖DLL,如果是則轉(zhuǎn)步驟204 ;如果不是則循環(huán)枚舉下一個DLL句柄;
[0044]204、記錄當(dāng)前最高Direct版本號。
[0045]通過遍歷游戲進(jìn)程中加載的所有DLL模塊,根據(jù)游戲進(jìn)程加載的DLL名稱進(jìn)行判斷。例如加載了名為d3dll.dll的游戲Direct版本為Directll。若是該游戲同時加載幾個版本的DLL則取最高版本號。如同時加載了 d3dll.dll、d3dl0.dll和d3d9.dll的游戲Direct版本為Directll。得到目標(biāo)進(jìn)程所加載的最高Direct版本后,所述DLL注入單元根據(jù)所述Direct最高版本號向目標(biāo)進(jìn)程注入對應(yīng)的視頻捕獲DLL。這樣一來,就能夠保證注入視頻捕獲DLL的準(zhǔn)確性。
[0046]為了保證DLL注入單元順利進(jìn)行版本判斷DLL的注入,因此本發(fā)明提供了三種DLL注入方案,用戶可以依次嘗試進(jìn)行DLL注入。
[0047]請參見圖3,本發(fā)明實施例中一種DLL注入方法的處理流程圖;其中該方法包括步驟:
[0048]301、獲取目標(biāo)進(jìn)程的遠(yuǎn)程進(jìn)程分配內(nèi)存函數(shù)指針和寫內(nèi)存函數(shù)指針;若成功則轉(zhuǎn)步驟302,若否則結(jié)束;
[0049]302、根據(jù)所述函數(shù)指針在目標(biāo)進(jìn)程中進(jìn)行內(nèi)存分配,并向分配的內(nèi)存中寫入所述DLL路徑;若成功則轉(zhuǎn)步驟303,若否則結(jié)束;
[0050]303、通過目標(biāo)進(jìn)程中的Load Library函數(shù)將所述DLL注入到目標(biāo)進(jìn)程,然后結(jié)束。
[0051]其中,本發(fā)明首先通過調(diào)用系統(tǒng)函數(shù)獲取目標(biāo)進(jìn)程號,根據(jù)獲取到的進(jìn)程號打開指定進(jìn)程,若打開失敗則結(jié)束。打開成功后獲取遠(yuǎn)程進(jìn)程分配內(nèi)存和寫內(nèi)存函數(shù)指針,調(diào)用該函數(shù)在目標(biāo)進(jìn)程中進(jìn)行內(nèi)存分配,分配大小為要注入的DLL路徑的長度。如果分配失敗則結(jié)束,分配成功則向剛分配的內(nèi)存中寫入DLL路徑。如果寫入成功則在目標(biāo)進(jìn)程中通過Load Library函數(shù)創(chuàng)建遠(yuǎn)程線程,實現(xiàn)版本判斷DLL向目標(biāo)進(jìn)程注入。
[0052]當(dāng)上述注入方法失敗后,可以采用其他方法進(jìn)行注入。請參見圖4,本發(fā)明實施例中另一種DLL注入方法的處理流程圖;其中該方法包括步驟:
[0053]401、復(fù)制指定輸入法文件到目標(biāo)進(jìn)程的系統(tǒng)目錄,所述輸入法文件中包含所述DLL ;若成功則轉(zhuǎn)步驟402,若否則結(jié)束;
[0054]402、在目標(biāo)進(jìn)程中,運(yùn)行所述指定輸入法文件,將所述DLL注入到目標(biāo)進(jìn)程。
[0055]本方法中,要為系統(tǒng)安裝一個新的輸入法,首先將輸入法文件復(fù)制到系統(tǒng)目錄,安裝完成后,當(dāng)在目標(biāo)進(jìn)程中切換到新的輸入法,上述輸入法會自動加載所述版本判斷DLL文件到游戲進(jìn)程空間。之后程序自動卸載此輸入法,使該輸入法對目標(biāo)進(jìn)程的運(yùn)行不產(chǎn)生影響。[0056]當(dāng)上述兩種注入方法都失敗后,還可以采用其他方法進(jìn)行注入。請參見圖5,本發(fā)明實施例中又一種DLL注入方法的處理流程圖;其中該方法包括步驟:
[0057]501、加載所述DLL到主進(jìn)程空間,獲取所述DLL內(nèi)部的函數(shù)指針;
[0058]502、通過所述函數(shù)指針調(diào)用所述DLL內(nèi)部函數(shù)來設(shè)置所述目標(biāo)進(jìn)程名稱,并對指定系統(tǒng)消息處理函數(shù)進(jìn)行替換;
[0059]503、目標(biāo)進(jìn)程收到所述指定系統(tǒng)消息后,將所述DLL注入到目標(biāo)進(jìn)程。
[0060]本方法中,首先加載所述DLL到主進(jìn)程控件,之后獲取DLL內(nèi)部函數(shù)指針;通過指針調(diào)用函數(shù)設(shè)置DLL中目標(biāo)進(jìn)程名稱;最后調(diào)用DLL內(nèi)部函數(shù)對系統(tǒng)消息處理函數(shù)進(jìn)行替換。替換特定的系統(tǒng)消息處理函數(shù),當(dāng)發(fā)生指定消息時,先判斷是否為目標(biāo)進(jìn)程,如果是則加載指定DLL到目標(biāo)進(jìn)程空間。所述DLL內(nèi)部根據(jù)之前設(shè)置的目標(biāo)進(jìn)程名稱進(jìn)行判斷,在收到指定的系統(tǒng)消息后,則將所述DLL加載到目標(biāo)進(jìn)程空間中。
[0061]由此可見,通過上述的三種注入方法,可以保證所述版本判斷DLL能夠順利地注入到目標(biāo)進(jìn)程中。
[0062]下面以一具體的實施例來對本發(fā)明的實施方案進(jìn)行詳細(xì)的說明,請參見圖6,是本發(fā)明實施例中一種視頻錄制方法的處理流程圖,該方法包括步驟:
[0063]601、向目標(biāo)進(jìn)程中注入DLL ;
[0064]602、所述DLL中的版本判斷DLL根據(jù)目標(biāo)進(jìn)程當(dāng)前加載的DLL名稱判斷出目標(biāo)進(jìn)程中Direct最高版本號;
[0065]603、根據(jù)所述Direct最高版本號向目標(biāo)進(jìn)程注入對應(yīng)的視頻捕獲DLL ;
[0066]604、創(chuàng)建臨時窗口,通過所述臨時窗口獲取所述目標(biāo)進(jìn)程中的Direct函數(shù)指針;
[0067]605、根據(jù)所述Direct函數(shù)指針創(chuàng)建所述Direct設(shè)備接口 ;
[0068]606、通過所述Direct設(shè)備接口將所述目標(biāo)進(jìn)程中的繪圖函數(shù)地址替換為所述視頻捕獲DLL中圖像捕獲函數(shù)的地址;
[0069]607、嘗試將所述后臺緩沖中待繪制的圖像像素數(shù)據(jù)拷貝到新建緩沖中,若成功,則轉(zhuǎn)步驟608 ;若失敗,則轉(zhuǎn)步驟609 ;
[0070]608、在所述目標(biāo)進(jìn)程每次調(diào)用所述繪圖函數(shù)前,調(diào)用所述圖像捕獲函數(shù)獲取后臺緩沖中待繪制的圖像像素數(shù)據(jù);
[0071]609、調(diào)用所述繪圖函數(shù)進(jìn)行圖像繪制。
[0072]由上可見,目標(biāo)進(jìn)程每利用繪圖函數(shù)繪制一幀圖像前,都會先調(diào)用所述圖像捕獲函數(shù),當(dāng)所述圖像捕獲函數(shù)獲取完目標(biāo)進(jìn)程后臺緩沖中待繪制的圖像像素數(shù)據(jù)后,將所述數(shù)據(jù)拷貝到新建的緩沖中;然后再調(diào)用所述繪圖函數(shù)根據(jù)目標(biāo)進(jìn)程后臺緩沖中待繪制的圖像像素數(shù)據(jù)進(jìn)程圖像繪制。由于所述后臺緩沖中的圖像像素數(shù)據(jù)都是全屏下的圖像數(shù)據(jù),因此所述圖像捕獲函數(shù)拷貝到新建緩沖中的數(shù)據(jù)就是需要錄制的視頻的全屏視頻數(shù)據(jù)。
[0073]相對于現(xiàn)有技術(shù),本發(fā)明通過調(diào)用圖像捕獲函數(shù)來獲取圖像像素數(shù)據(jù),并且所述圖像像素數(shù)據(jù)處理過程都相對簡單,不需要進(jìn)行復(fù)雜的圖像處理,因此可以大大提高CPU的處理速度,減小對系統(tǒng)內(nèi)存資源的占用,從而有效的避免了卡頓、跳幀等現(xiàn)象,使用戶享受到更加順暢的視覺體驗。
[0074]以上所述僅為本發(fā)明的較佳實施例而已,并不用以限制本發(fā)明,凡在本發(fā)明的精神和原則之內(nèi),所做的任何修改、等同替換、改進(jìn)等,均應(yīng)包含在本發(fā)明保護(hù)的范圍之內(nèi)。
【權(quán)利要求】
1.一種視頻錄制裝置,應(yīng)用于用戶主機(jī)上,其特征在于,該裝置包括: DLL注入單元,用于向目標(biāo)進(jìn)程中注入DLL,所述DLL包括視頻捕獲DLL ; 接口創(chuàng)建單元,用于創(chuàng)建Direct設(shè)備接口 ; 函數(shù)替換單元,用于通過所述Direct設(shè)備接口將所述目標(biāo)進(jìn)程中的繪圖函數(shù)地址替換為所述視頻捕獲DLL中圖像捕獲函數(shù)的地址; 函數(shù)調(diào)用單元,用于在所述目標(biāo)進(jìn)程每次調(diào)用所述繪圖函數(shù)前,調(diào)用所述圖像捕獲函數(shù)獲取后臺緩沖中待繪制的圖像像素數(shù)據(jù)。
2.如權(quán)利要求1所述的裝置,其特征在于,所述裝置還包括: 指針獲取單元,用于創(chuàng)建臨時窗口,通過所述臨時窗口獲取所述目標(biāo)進(jìn)程中的Direct函數(shù)指針; 所述接口創(chuàng)建單元,用于根據(jù)所述Direct函數(shù)指針創(chuàng)建Direct設(shè)備接口。
3.如權(quán)利要求1所述的裝置,其特征在于,所述DLL還包括版本判斷DLL,所述DLL注入單元進(jìn)一步用于: 向所述目標(biāo)進(jìn)程中注入版本判斷DLL ; 所述版本判斷DLL根據(jù)目標(biāo)進(jìn)程當(dāng)前加載的DLL名稱判斷出目標(biāo)進(jìn)程中Direct最高版本號; 所述DLL注入單元根據(jù)所述Direct最高版本號向目標(biāo)進(jìn)程注入對應(yīng)的視頻捕獲DLL。
4.如權(quán)利要求1所述的裝置,其特征在于,所述向目標(biāo)進(jìn)程中注入DLL包括: 獲取目標(biāo)進(jìn)程的遠(yuǎn)程進(jìn)程分配內(nèi)存函數(shù)指針和寫內(nèi)存函數(shù)指針; 根據(jù)所述函數(shù)指針在目標(biāo)進(jìn)程中進(jìn)行內(nèi)存分配,并向分配的內(nèi)存中寫入所述DLL路徑; 通過目標(biāo)進(jìn)程中的Load Library函數(shù)將所述DLL注入到目標(biāo)進(jìn)程。
5.如權(quán)利要求1所述的裝置,其特征在于,所述向目標(biāo)進(jìn)程中注入DLL還包括: 復(fù)制指定輸入法文件到目標(biāo)進(jìn)程的系統(tǒng)目錄,所述輸入法文件中包含所述DLL ; 在目標(biāo)進(jìn)程中,運(yùn)行所述指定輸入法文件,將所述DLL注入到目標(biāo)進(jìn)程。
6.如權(quán)利要求1所述的裝置,其特征在于,所述向目標(biāo)進(jìn)程中注入DLL還包括: 加載所述DLL到主進(jìn)程空間,獲取所述DLL內(nèi)部的函數(shù)指針; 通過所述函數(shù)指針調(diào)用所述DLL內(nèi)部函數(shù)來設(shè)置所述目標(biāo)進(jìn)程名稱,并對指定系統(tǒng)消息處理函數(shù)進(jìn)行替換; 目標(biāo)進(jìn)程收到所述指定系統(tǒng)消息后,將所述DLL注入到目標(biāo)進(jìn)程。
7.一種視頻錄制方法,應(yīng)用于用戶主機(jī)上,其特征在于,該方法包括步驟: 向目標(biāo)進(jìn)程中注入DLL,所述DLL包括視頻捕獲DLL ; 創(chuàng)建Direct設(shè)備接口 ; 通過所述Direct設(shè)備接口將所述目標(biāo)進(jìn)程中的繪圖函數(shù)地址替換為所述視頻捕獲DLL中圖像捕獲函數(shù)的地址; 在所述目標(biāo)進(jìn)程每次調(diào)用所述繪圖函數(shù)前,調(diào)用所述圖像捕獲函數(shù)獲取后臺緩沖中待繪制的圖像像素數(shù)據(jù)。
8.如權(quán)利要求7所述的方法,其特征在于,所述方法還包括步驟: 創(chuàng)建臨時窗口,通過所述臨時窗口 獲取所述目標(biāo)進(jìn)程中的Direct函數(shù)指針;根據(jù)所述Direct函數(shù)指針創(chuàng)建所述Direct設(shè)備接口。
9.如權(quán)利要求7所述的方法,其特征在于,所述DLL還包括版本判斷DLL,所述方法還包括步驟: 向所述目標(biāo)進(jìn)程中注入版本判斷DLL ; 所述版本判斷DLL根據(jù)目標(biāo)進(jìn)程當(dāng)前加載的DLL名稱判斷出目標(biāo)進(jìn)程中Direct最高版本號; 根據(jù)所述Direct最高版本號向目標(biāo)進(jìn)程注入對應(yīng)的視頻捕獲DLL。
10.如權(quán)利要求7所述的方法,其特征在于,所述向目標(biāo)進(jìn)程中注入DLL包括: 獲取目標(biāo)進(jìn)程的遠(yuǎn)程進(jìn)程分配內(nèi)存函數(shù)指針和寫內(nèi)存函數(shù)指針; 根據(jù)所述函數(shù)指針在目標(biāo)進(jìn)程中進(jìn)行內(nèi)存分配,并向分配的內(nèi)存中寫入所述DLL路徑; 通過目標(biāo)進(jìn)程中的Load Library函數(shù)將所述DLL注入到目標(biāo)進(jìn)程。
11.如權(quán)利要求7所述的方法,其特征在于,所述向目標(biāo)進(jìn)程中注入DLL還包括: 復(fù)制指定輸入法文件到目標(biāo)進(jìn)程的系統(tǒng)目錄,所述輸入法文件中包含所述DLL; 在目標(biāo)進(jìn)程中,運(yùn)行所述指定輸入法文件,將所述DLL注入到目標(biāo)進(jìn)程。
12.如權(quán)利要求7所述的方法,其特征在于,所述向目標(biāo)進(jìn)程中注入DLL還包括: 加載所述DLL到主進(jìn)程空間,獲取所述DLL內(nèi)部的函數(shù)指針; 通過所述函數(shù)指針調(diào) 用所述DLL內(nèi)部函數(shù)來設(shè)置所述目標(biāo)進(jìn)程名稱,并對指定系統(tǒng)消息處理函數(shù)進(jìn)行替換; 目標(biāo)進(jìn)程收到所述指定系統(tǒng)消息后,將所述DLL注入到目標(biāo)進(jìn)程。
【文檔編號】G06F9/44GK103823683SQ201410069031
【公開日】2014年5月28日 申請日期:2014年2月27日 優(yōu)先權(quán)日:2014年2月27日
【發(fā)明者】劉涵, 宋曉朦, 李紹義 申請人:北京六間房科技有限公司