directshow 虚拟摄像头 实例 代码解读

directshow 虚拟摄像头 实例 代码解读

本文只介绍这个源码的大致构成以及怎么修改,因为其他的我也不会啊哈哈哈,我就是用QQ调用虚拟摄像头读取我自己的视频或者图片播放给别人让别人以为这就是实时的而已。

1,示例代码QQ可用 Directshow实现的虚拟摄像头(win10+vs2013,c++代码)    没有积分的又需要代码可以邮件找我[email protected]

2,源码说明

此源码包含了directshow的库文件,相关配置文件也保存在工程中,可以直接运行,不需要额外安装DirectShow或者DirectX的SDK。

此源码是注册注销虚拟摄像头的源码,跑起来可以让QQ视频显示每个像素为随机数的图片(需要其他功能可以自行设计写代码修改)。如下图

测试方法见  win10 + VS2013下载directshow相关示例代码及directshow库文件调用 中3,运行测试与调整

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 Functions

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

时间: 2024-10-16 04:07:07

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

Jsoup代码解读之四-parser

Jsoup代码解读之四-parser 作为Java世界最好的HTML 解析库,Jsoup的parser实现非常具有代表性.这部分也是Jsoup最复杂的部分,需要一些数据结构.状态机乃至编译器的知识.好在HTML语法不复杂,解析只是到DOM树为止,所以作为编译器入门倒是挺合适的.这一块不要指望囫囵吞枣,我们还是泡一杯咖啡,细细品味其中的奥妙吧. 基础知识 编译器 将计算机语言转化为另一种计算机语言(通常是更底层的语言,例如机器码.汇编.或者JVM字节码)的过程就叫做编译(compile).编译器(

基于Linux 3.0.8 Samsung FIMC(S5PV210) 的摄像头驱动框架解读

作者:咕唧咕唧liukun321 来自:http://blog.csdn.net/liukun321 FIMC这个名字应该是从S5P100开始出现的,在s5pv210里面的定义是摄像头接口,但是它同样具有图像数据颜色空间转换的作用.而exynos4412对它的定义看起来更清晰些,摄像头接口被定义为FIMC-LITE .颜色空间转换的硬件结构被定义为FIMC-IS.不多说了,我们先来看看Linux3.0.8 三星的BSP包中与fimc驱动相关的文件. 上面的源码文件组成了整个fimc的驱动框架.通

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

一.背景介绍 虚拟摄像头,顾名思义,就是利用软件技术虚拟出一个摄像头硬件设备供用户使用.当我们需要对视频图像进行处理再输出时,虚拟摄像头就具备非常大的价值了.关于如何在Windwos上实现一个虚拟设备的资料已经非常丰富了,Windows Driver Kit里面也有非常多的帮助文档.这篇博文主要总结了在Mac下开发虚拟摄像头的一些经验.Mac下的虚拟摄像头产品其实也有不少,例如CamTwist, CamMask, CamWiz, ManyCam等.但是关于如何在Mac下开发虚拟摄像头设备的资料却

C#实现调用本机摄像头实例

本文实例源自一个项目,其中需要调用本机的摄像头进行拍照,分享给大家供大家参考之用.具体步骤如下: 硬件环境:联想C360一体机,自带摄像头 编写环境:vs2010 语言:C# WPF 实现步骤: 下载AForge类库,并添加引用: using AForge; using AForge.Controls; using AForge.Video; using AForge.Video.DirectShow; using Size = System.Drawing.Size; 在xaml界面中添加Vi

V4L2学习5--VIVI虚拟摄像头驱动

概述 前面简单分析了内核中虚拟摄像头驱动 vivi 的框架与实现,本文参考 vivi 来写一个虚拟摄像头驱动,查询.设置视频格式相对简单,难点在于 vb2_buf 的处理过程. 数据采集流程分析 在我的程序中,大概的数据采集流程如上图所示,启动视频采集之后,创建了一个内核线程,内核线程每30ms 唤醒一次,每一次唤醒都会尝试用 queue_list 中取出一个 buffer 填充数据之后挂入 done_list ,挂入 done_list 之后就会唤醒应用程序(poll 中休眠),应用程序唤醒之

(四) 虚拟摄像头vivi体验

目录 虚拟摄像头vivi体验 源码下载 修改Makefile 安装xawtv 测试体验 title: 虚拟摄像头vivi体验 date: 2019/4/23 19:20:00 toc: true --- 虚拟摄像头vivi体验 vivid是虚拟的摄像头驱动.可以理解等同于UVC,只是说不需要USB总线驱动控制等 源码下载 # 查看内核版本 $ uname -a Linux 100ask 4.13.0-36-generic #40~16.04.1-Ubuntu SMP Fri Feb 16 23:

java计划任务调度框架quartz结合spring实现调度的配置实例代码分享

点击链接加入群[JavaEE(SSH+IntelliJIDE+Maven)]:http://jq.qq.com/?_wv=1027&k=L2rbHv 一:quartz简介 OpenSymphony 的Quartz提供了一个比较完美的任务调度解决方案. Quartz 是个开源的作业调度框架,定时调度器,为在 Java 应用程序中进行作业调度提供了简单却强大的机制. Quartz中有两个基本概念:作业和触发器.作业是能够调度的可执行任务,触发器提供了对作业的调度 二:quartz spring配置详

Adaboost算法原理分析和实例+代码(简明易懂)

Adaboost算法原理分析和实例+代码(简明易懂) [尊重原创,转载请注明出处] http://blog.csdn.net/guyuealian/article/details/70995333     本人最初了解AdaBoost算法着实是花了几天时间,才明白他的基本原理.也许是自己能力有限吧,很多资料也是看得懵懵懂懂.网上找了一下关于Adaboost算法原理分析,大都是你复制我,我摘抄你,反正我也搞不清谁是原创.有些资料给出的Adaboost实例,要么是没有代码,要么省略很多步骤,让初学者

JavaScript 身份证号有效验证详解及实例代码

JavaScript 身份证号有效验证详解及实例代码 这篇文章主要介绍了JavaScript 身份证号有效验证详解及实例代码的相关资料,需要的朋友可以参考下 JavaScript验证身份证号 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 <%@ page language="jav