windows驱动开发8:虚拟摄像头方案
一、摄像头框架
在业务场景中,有许多是需要应用能够通过摄像头的方式来访问相关的音视频数据,比如美颜、摄像头多路复用、IP摄像头接入视频会议等。这些功能通过虚拟摄像头的方式来实现,是一个比较通用的解决方案。那么如何及选用哪种技术方案来开发虚拟摄像头呢?本文从windows角度评估其相关技术可行性。
回到问题:应用操作虚拟摄像头,我们可以从Windows的应用是如何操作摄像头来评估。
Windows发展史上,主要使用了以下框架来操作摄像头:
- VFW(Video Of Windows)这个是Windows最先使用的框架,也是最古老的,好处是接口函数够简单,在有些兼容或者小型用层场所用用也没什么问题。
- DirectShow,这个是横跨 WINXP, WIN7,WIN8,WIN10都得到很好支持的框架,然而接口函数也挺复杂。
- Media Foundation, 这个是WIN7之后,开发的新框架,目的是为了替换DirectShow,从而达到更好的性能和适应流媒体发展的需求。
二、应用现状
应用程序可以通过VFW、DirectShow、Media Foundation等一个或多个方式来操作摄像头。那么实际情况是如何的呢?
大量的操作摄像头的程序都是使用DirectShow框架,有小部分还在使用VFW框架。新近开发的程序或者对老版本程序的更新中,相当数量的程序使用Media Foundation框架代替了DirectShow。更有甚者,UWP框架的程序(就是Windows10平台新出来的,为了 “大一统“ 目的,这个目前也是小众,能否发展做大谁知道),对驱动级别的摄像头限制更大,已经不再支持老内核流框架。
所以,摄像头应用框架选择现状为:
- VFW:较少,一些古老的应用
- DirectShow:大量,慢慢迁移到Media Foundation
- Media Foundation:大量
- UWP:Win10应用,如Camera、Skype等
三、虚拟摄像头
3.1 应用层方式
应用框架 | 方案 | 实现案例 |
---|---|---|
VFW | 无 | 无 |
DirectShow | ksproxy.ax | OBS-VirtualCam,C++ |
Media Foundation | MFCreateVirtualCamera(win11) | https://github.com/microsoft/Windows-Camera,C# |
Media Foundation | IMFMediaSource(Vista) | 无 |
3.2 驱动方式
1、VFW:Video for Windows,是一种趋于废弃的windows驱动模型。指Microsoft推出的关于数字视频的一个软件开发包,VFW的核心是AVI文件标准。围绕AVI文件,VFW推出了一整套完整的视频采集、压缩、解压缩、回放和编辑的应用程序接口。发展趋势:VFW(95) → WDM(98/2000/xp) → WDF(xp之后)。
2、UVC:USB Video Class,USB视频类,是一种为USB视频捕获设备定义的协议标准。是Microsoft与另外几家设备厂商联合推出的为USB视频捕获设备定义的协议标准,已成为USB org标准之一。事实上最新版本windows中,UVC自动加载usbvideo.sys,器内部也是使用ks.sys,即也是使用下面的Kernel Stream流驱动框架。参考:USB 视频类 (UVC) 相机实现指南
3、Kernel Streaming:内核流式传输 (KS) 指的是 Microsoft 提供的服务,支持对流式数据进行内核模式处理。Microsoft 提供了三种多媒体类驱动程序模型: port class、stream class和 AVStream。这些类驱动程序在系统文件 portcls.sys、 stream.sys和 ks.sys中 (内核模式 dll) 的导出驱动程序实现。 在 Windows XP 和更高版本中, ks.sys称为 AVStream。
4、AVStream:是Kernel Streaming三种多媒体驱动模型之一,也是最新版本模型,包含了音视频的部分。在 AVStream 驱动程序模型中,供应商提供与 Microsoft 提供的类驱动程序交互的微型驱动程序,如下图所示。
5、Windows USB摄像头驱动程序栈架构
从上面的图可以看到,厂商只提供硬件和固件,并且这个固件应该满足UVC规范,而其余的由Windows系统包圆了。其中ks.sys与AVStream、portclass.sys之间的关系如下:
- AVStream是ks.sys中的一部分,而ks.sys是其上层驱动。
- ks.sys的下层可以是portclass.sys实现的音频类,也可以是USB实现的音视频类。
- ks.sys文件中包含了全部的ks功能和AVStream功能
6、方案对比
驱动框架 | 说明 | 实现案例 |
---|---|---|
VFW | 过时的技术,不推荐 | 无 |
UVC | 实现USB摄像头驱动 | e2esoft的VCam |
Kernel Stream:Port Class | 主要是音频 | 无 |
Kernel Stream:Stream Class | 主要是视频,参考:Stream Class | |
Kernel Stream:AVStream | 音视频最新驱动框架,参考:AVStream | avshws、avscamera |
3.3 方案对比
类别 | 方案 | 平台兼容 | 应用兼容 | 实现难度 | 是否可以开关 | 是否需要管理员权限 |
---|---|---|---|---|---|---|
应用层 | direct show | >=98 | 一般 | 中 | 是 | 否 |
mfd- MFCreateVirtualCamera | >=win11 | 一般 | 中 | 是 | 创建、销毁需要 | |
mfd - IMFMediaSource | >=vista | 一般 | 较难 | 是 | 否 | |
驱动层 | VFW | >=95 | 一般 | 难 | 否 | 安装需要 |
UVC | >= xp sp2 | 最好 | 最难 | 否 | 安装需要 | |
KS - Stream Class | >= xp | 一般 | 较难 | 是 | 安装需要 | |
KS - AVSteam | >= xp | 较好 | 较难 | 是 | 安装需要 |
四、总结
如上图所示,无论应用层以哪种方式操作摄像头,最终都会汇聚于Kernel Streaming驱动层,而Kernel Streaming对于USB摄像头又依赖于UVC驱动。所以总结如下:
- 目前市面大部分应用操作摄像头使用DirectShow、Media Foundation框架,win10微软应用只支持UWP。从兼容层面看只有UVC、AVSteam两类驱动框架开发的虚拟摄像头才可以完全兼容。
- UVC由于在更底层,可以适配未来windows的版本变化,但开发难度极高;AVSteam在没有新的流媒体驱动框架出现前,是可以满足所有应用兼容,开发难度相对较好。
综上,建议选择AVSteam驱动框架开发虚拟摄像头。
windows驱动开发8:虚拟摄像头方案相关推荐
- c语言windows驱动编程入门,Windows驱动开发技术详解 PDF扫描版[175MB]
Windows驱动开发技术详解由浅入深.循序渐进地介绍了windows驱动程序的开发方法与调试技巧.本书共分23章,内容涵盖了windows操作系统的基本原理.nt驱动程序与wdm驱动程序的构造.驱动 ...
- 转:Windows驱动开发(中间层)
Windows驱动开发(中间层) - 慧由心生 - 博客园Windows驱动开发一.前言依据<Windows内核安全与驱动开发>及MSDN等网络质料进行学习开发.二.初步环境1.下载安装W ...
- 9、Windows驱动开发技术详解笔记(5) 基本语法回顾
5.在驱动中获取系统时间 1)获取启动毫秒数 在ring3 我们可以通过一个GetTickCount 函数来获得自系统启动开始的毫秒数,在ring0也有一个与之对应的KeQueryTickCount ...
- 15、Windows驱动开发技术详解笔记(11) 基本概念
9.Windows驱动程序的入口函数规定为_DriverEntry@8,所以用C++编写时要用extern. 驱动程序中,不能使用编译器运行时函数,甚至C语言中的malloc,C++的new函数都不能 ...
- 《Windows驱动开发技术详解》学习笔记
Abstract 如果推荐 Windows 驱动开发的入门书,我强烈推荐<Windows驱动开发技术详解>.但是由于成书的时间较早,该书中提到的很多工具和环境都已不可用或找不到,而本文 ...
- C++开发方向之windows驱动开发
1.为什么要写这篇文章? 最近浏览招聘网站看到关于windows驱动开发的岗位,前几天一个C++客户端工作岗位,猎头也问我是否有了解windows内核. 所以,调研了一下C++的开发方向:window ...
- Windows驱动开发环境搭建:VS2013+WDK8.1
你的Windows驱动开发环境之所以搭建不成功,是因为你没有看这篇博客 1.安装包准备 Visio Studio2013: https://pan.baidu.com/s/1P77yeSKuE7mWl ...
- Windows驱动开发基础(五)驱动程序的数据结构
Windows驱动开发基础:驱动程序的数据结构.转载请标明出处:http://blog.csdn.net/ikerpeng/article/details/38794405 I/O管理器定义了一些数据 ...
- Windows驱动开发学习笔记(七)—— 多核同步内核重载
Windows驱动开发学习笔记(七)-- 多核同步 基础知识 并发与同步 分析 InterlockedIncrement 原子操作相关API 内核文件 多核同步 临界区 示例一:错误的临界区 示例二: ...
- Windows驱动开发学习笔记(六)—— Inline HOOK
Windows驱动开发学习笔记(六)-- Inline HOOK SSDT HOOK Inline Hook 挂钩 执行流程 脱钩 实验一:3环 Inline Hook 实验二:0环 Inline H ...
最新文章
- 阿里巴巴5月5日综合算法题详解
- (UVA)1586 --Molar Mass(分子量)
- C语言:输入两个数,输出最大公约数,最小公倍数
- python生成器yield_python 生成器yield的总结
- pl/sql developer 安装svn插件 64位
- python两数相加有进退位_Leetcode_两数相加_python
- (16)VHDL实现半加器与全加器
- 车模型一般多少钱_婚车租赁一般多少钱?最新婚车出租价格表!
- Qt 该文件不能在当前页码(936)中表示字符
- jq向php文件传json,jQuery向后台传入json格式数据的方法
- java远程获取linux文件_Java远程连接操作linux服务器,scp获取文件
- Java中的DES加密与解密工具类
- ps 抠图 修改背景颜色
- 2021年“上海区块链周”参会随感(二)2021-04-12
- Hadoop集群性能测试
- Failed to transform file 'xxx' to match attributes 的解决办法
- Web必备性能压力测试工具WebBench与ApcheBench(ab)详解
- 阿里大鱼短信功能使用
- vue 实现强制类型转换 ,将数字变为字符串,字符串变为数字,数组数字变为字符串、js对象转数组
- python代码宠物_和孩子一起做一只电子宠物吧!
热门文章
- 剑指offer——44.翻转单词顺序序列
- Pandas数据分析教程(2)-数据读取之普通索引、loc/iloc索引
- smartbi和第三方集成策略
- APM芯片 写flash问题
- 违反充足理由律的诡辩术
- android平板电脑手写笔应用,三星旗舰Android平板电脑将配备手写笔 小米5C使用自家松果处理器...
- Unity TextMesh Pro 不显示中文 ???
- Tourists【广义圆方树+树链剖分+方点的特别优化】
- 安装redhat 8.0红帽系统
- Java笔记009-数组、排序、查找、多维数组(二维数组)