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

directshow 虚拟摄像头 实例 代码解读的更多相关文章

  1. asp.net中生成缩略图并添加版权实例代码

    这篇文章介绍了asp.net中生成缩略图并添加版权实例代码,有需要的朋友可以参考一下 复制代码代码如下: //定义image类的对象 Drawing.Image image,newimage; //图 ...

  2. Jsoup代码解读之四-parser

    Jsoup代码解读之四-parser 作为Java世界最好的HTML 解析库,Jsoup的parser实现非常具有代表性.这部分也是Jsoup最复杂的部分,需要一些数据结构.状态机乃至编译器的知识.好 ...

  3. macOS平台下虚拟摄像头的研发总结

    一.背景介绍 虚拟摄像头,顾名思义,就是利用软件技术虚拟出一个摄像头硬件设备供用户使用.当我们需要对视频图像进行处理再输出时,虚拟摄像头就具备非常大的价值了.关于如何在Windwos上实现一个虚拟设备 ...

  4. MXNet--DMLC-Core代码解读与宏

    MXNet--DMLC-Core代码解读与宏 dmlc-core是Distributed (Deep) Machine Learning Community的一个基础模块,这个模块用被应用到了mxne ...

  5. vivi虚拟摄像头驱动程序

    一.vivi虚拟摄像头驱动 基于V4L2(video for linux 2)摄像头驱动程序,我们减去不需要的ioctl_fops的函数,只增加ioctl函数增加的必要的摄像头流查询等函数: #inc ...

  6. (四) 虚拟摄像头vivi体验

    目录 虚拟摄像头vivi体验 源码下载 修改Makefile 安装xawtv 测试体验 title: 虚拟摄像头vivi体验 date: 2019/4/23 19:20:00 toc: true -- ...

  7. weex官方demo weex-hackernews代码解读(上)

    一.介绍 weex 是阿里出品的一个类似RN的框架,可以使用前端技术来开发移动应用,实现一份代码支持H5,IOS和Android.最新版本的weex已默认将vue.js作为前端框架,而weex-hac ...

  8. V4L2学习(五)VIVI虚拟摄像头驱动

    概述 前面简单分析了内核中虚拟摄像头驱动 vivi 的框架与实现,本文参考 vivi 来写一个虚拟摄像头驱动,查询.设置视频格式相对简单,难点在于 vb2_buf 的处理过程. 数据采集流程分析 在我 ...

  9. 13.Ext.extend用法以及代码解读

    转自:http://www.blogjava.net/dragonshrimp/archive/2008/03/01/183060.html Ext.extend用法以及代码解读 概述 Ext.ext ...

随机推荐

  1. apply函数应用

    (1)找到数组中最小或最大的数字 var v = [1,23,4,9]; console.log(Math.min.apply(Math,v));

  2. 卡诺模型(KANO Model)

    卡诺模型是一种研究影响顾客满意度因素的方法,在软件工程中可以用来辅助做需求分析和优化产品的质量. 作为一种方法,卡诺模型将某一种特性的存在程度作为横坐标,越大表示某个功能或特性做得越多,越小则表示做得 ...

  3. python mysql基本操作

    1.创建数据库.表添加数据. # -*- coding: utf-8 -*- import MySQLdb.cursors conn =MySQLdb.connect(',charset = 'utf ...

  4. 常用ES6语法

    <!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title>& ...

  5. 动态添加 items to PopupMenu

    引用自http://stackoverflow.com/questions/10175140/adding-items-to-popupmenu DevExpress.XtraBars.BarMana ...

  6. 引用 LPSTR、LPCSTR、LPTSTR、LPCTSTR、LPWSTR及LPCWSTR的意义及区别

    1.ANSI(即MBCS):为多字节字符集,它是不定长表示世界文字的编码方式.ANSI表示英文字母时就和ASCII一样,但表示其他文字时就需要用多字节.   2.Unicode:用两个字节表示一个字符 ...

  7. POJ2739(尺取法)

    Sum of Consecutive Prime Numbers Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 23931 ...

  8. StreamTool

    public class StreamTool { //从流中读取数据 public static byte[] read(InputStream inStream) throws Exception ...

  9. Java中的 super和this

    super关键字 在子类中用于表示父类对象的引用,可以在子类中调用父类中的方法的属性. super语句 --- 子类在继承父类之后,子类的构造方法中会含有一个super语句. 如果没有手动指定supe ...

  10. ECMAScript有6种继承方式(实现继承)

    本人对于ECMAScript继承机制有些见解,如果说的不对,敬请赐教~~~~ 继承是OO语言(面向对象)挺好的概念,许多OO语言都支持两种继承方式(接口只继承方法签名.实际继承则继承实际的方法),但是 ...