directshow 虛擬攝像頭 實例 代碼解讀


 

directshow 虛擬攝像頭 實例 代碼解讀

本文只介紹這個源碼的大致構成以及怎么修改,因為其他的我也不會啊哈哈哈,我就是用QQ調用虛擬攝像頭讀取我自己的視頻或者圖片播放給別人讓別人以為這就是實時的而已。
1,示例代碼QQ可用 Directshow實現的虛擬攝像頭(win10+vs2013,c++代碼)    沒有積分的又需要代碼可以郵件找我huqiaoping23@qq.com
 
2,源碼說明
此源碼包含了directshow的庫文件,相關配置文件也保存在工程中,可以直接運行,不需要額外安裝DirectShow或者DirectX的SDK。
此源碼是注冊注銷虛擬攝像頭的源碼,跑起來可以讓QQ視頻顯示每個像素為隨機數的圖片(需要其他功能可以自行設計寫代碼修改)。如下圖
3、代碼解讀
 
結構說明:
文件Filter.cpp和Filter.h是虛擬攝像頭具體的配置信息,比如提供給虛擬攝像頭什么數據,要改代碼改數據讀取不一樣的東西就看這倆文件;
文件Dll.cpp、Dll.def是虛擬攝像頭的注冊、注銷等函數,要看directshow怎么工作就看這里;
文件DibHelper.h和DibHelper.cpp是獲取電腦屏幕像素點的函數,如果你想讓QQ視頻的另一方看到的是你的電腦實時的畫面,就會用到這里面的函數,因為最初的代碼功能是讓QQ視頻對方看到自己的電腦屏幕所以用到了它們,但是現在的代碼沒有讀取電腦屏幕,直接賦值,寫隨機數進去,所以不要這倆文件一樣可以跑通。
 
讀代碼
從Dll.def開始讀起
該工程生成的是庫文件VCam.ax,類似我們平常用的.dll文件,不是.exe這種可執行文件,所以無法像我們以前一樣調試,我不知道對庫文件有什么調試方法,所以一旦出錯只好通過人眼檢查來查看排查錯誤。
試着在工程中搜索DllMain、DllRegisterServer、DllUnregisterServer能有關虛擬攝像頭的函數,具體函數功能可以查看官網上的介紹,這里給出鏈接,我就不翻譯了
 
Dll.def和Dll.cpp對應着看,就是directshow怎么用的。(其中g_wszFilterName這個是虛擬攝像頭的名字,你可以試着改成你自己的名字)
具體的虛擬攝像頭配置信息(也就是Filter.cpp和Filter.h)是怎么和配置進去的,也就是怎么和Dll.cpp和Dll.def聯系起來的,請自行搜索CLSID_VirtualCamera
Filter.cpp和Filter.h重點要注意的函數是FillBuffer,這個函數是具體填寫數據的函數,此實例上是直接填寫隨機數,所以QQ視頻時調用看上去就是一堆灰度不斷變化的東東。
如果要看Filter具體怎么配置怎么寫的,從CVCam這個類開始看起。
 
4,嘗試着用虛擬攝像頭播放你自己的一張圖片(試着自己修改示例代碼)
說明:
上圖中框着的部分就是寫數據的部分,cbData是大小,pData是具體的數據,這里都是隨機數。也就是現在要讀一張自己的圖片,把數據填進去,僅此而已。
我之前只用過opencv讀圖片讀視頻,我也不知道其他方式應該怎么讀,所以我就直接用opencv了。
我的環境是opencv3.0,環境配置我就不說了,其他opencv的版本也一樣。
為了方便以后改成視頻,我寫了一個Mat類圖片讀取到buffer中的函數,如下
 
把上一張圖片中的紅框部分注釋掉,用opencv讀取圖片后,直接調用這個函數就可以了。當然這個函數是針對彩色圖片的,如果你是灰度圖,就又不一樣了。
可以注意到復制數據時是倒着復制的,這個是因為bitmap和Mat在存儲數據時的不同,另外我貌似沒有管左右的問題,反正看着還行。
代碼修改及其測試結果:
可以看到當我用電腦登陸QQ進行視頻時,左右看上去是正常的,但是對方收到的圖片,左右卻是相反的,所以說我這個讀Mat類數據的函數還有一點問題,即,左右反了,讀者自行修改,或者我晚點修改好了再上傳。
如果會傳照片了,后面傳視頻什么的都順其自然了。此文不再贅述
 
 
http://blog.csdn.net/u011668104/article/details/53335117


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM