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. JPA级联(一对一 一对多 多对多)注解【实际项目中摘取的】并非自己实际应用

    下面把项目中的用户类中有个:一对一  一对多  多对多的注解对应关系列取出来用于学习      说明:项目运行正常 问题类:一对多.一对一.多对多 ============一对多 一方的设置 @One ...

  2. linux自学(九)之开始centos学习,安装数据库MariaDB

    上一篇:linux自学(八)之开始centos学习,安装tomcat 数据库我们不安装mysql,我网上看了好多资料发现mysql安装比较麻烦,我们这里安装同一个父亲的产品MariaDB.驱动,端口等 ...

  3. sql语句中charindex的用法

    假如你写过很多程序,你可能偶尔会碰到要确定字符或字符窜串否包含在一段文字中,在这篇文章中,我将讨论使用CHARINDEX和PATINDEX函数来 搜索文字列和字符串.我将告诉你这两个函数是如何运转的, ...

  4. CF1109B Sasha and One More Name

    CF1109B Sasha and One More Name 构造类题目.仔细看样例解释能发现点东西? 结论:答案只可能是 \(Impossible,1,2\) . \(Impossible:\) ...

  5. [BZOJ3197][SDOI2013]刺客信条assassin

    bzoj luogu Description 故事发生在1486 年的意大利,Ezio原本只是一个文艺复兴时期的贵族,后来因为家族成员受到圣殿骑士的杀害,决心成为一名刺客.最终,凭借着他的努力和出众的 ...

  6. LeetCode String Compression

    原题链接在这里:https://leetcode.com/problems/string-compression/description/ 题目: Given an array of characte ...

  7. [LeetCode系列]N皇后问题递归解法 -- 位操作方式

    N皇后问题: 给定8*8棋盘, 放置n个皇后, 使其互相不能攻击(即2个皇后不能放在同一行/列/正反对角线上), 求解共有多少种放置方式? 这个问题的解答网上有不少, 但是位操作解法的我看到的不多. ...

  8. Nginx.PHP配置Smarty

    下载http://smarty.net: 解压 -> 将 libs 文件夹重命名 smartyLibs -> 放置在自己服务器的 usr/local/lib/ 中 (/usr/local/ ...

  9. idea maven 打包 引用本地jar

    1将本地jar包导入到mvn本地库 mvn install:install-file -Dfile=/Users/liuqiang/Documents/gmpl/gmpl-server/lib/ali ...

  10. Java-Runoob:Java 方法

    ylbtech-Java-Runoob:Java 方法 1.返回顶部 1. Java 方法 在前面几个章节中我们经常使用到 System.out.println(),那么它是什么呢? println( ...