一、摄像头框架

在业务场景中,有许多是需要应用能够通过摄像头的方式来访问相关的音视频数据,比如美颜、摄像头多路复用、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:虚拟摄像头方案相关推荐

  1. c语言windows驱动编程入门,Windows驱动开发技术详解 PDF扫描版[175MB]

    Windows驱动开发技术详解由浅入深.循序渐进地介绍了windows驱动程序的开发方法与调试技巧.本书共分23章,内容涵盖了windows操作系统的基本原理.nt驱动程序与wdm驱动程序的构造.驱动 ...

  2. 转:Windows驱动开发(中间层)

    Windows驱动开发(中间层) - 慧由心生 - 博客园Windows驱动开发一.前言依据<Windows内核安全与驱动开发>及MSDN等网络质料进行学习开发.二.初步环境1.下载安装W ...

  3. 9、Windows驱动开发技术详解笔记(5) 基本语法回顾

    5.在驱动中获取系统时间 1)获取启动毫秒数 在ring3 我们可以通过一个GetTickCount 函数来获得自系统启动开始的毫秒数,在ring0也有一个与之对应的KeQueryTickCount ...

  4. 15、Windows驱动开发技术详解笔记(11) 基本概念

    9.Windows驱动程序的入口函数规定为_DriverEntry@8,所以用C++编写时要用extern. 驱动程序中,不能使用编译器运行时函数,甚至C语言中的malloc,C++的new函数都不能 ...

  5. 《Windows驱动开发技术详解》学习笔记

    Abstract   如果推荐 Windows 驱动开发的入门书,我强烈推荐<Windows驱动开发技术详解>.但是由于成书的时间较早,该书中提到的很多工具和环境都已不可用或找不到,而本文 ...

  6. C++开发方向之windows驱动开发

    1.为什么要写这篇文章? 最近浏览招聘网站看到关于windows驱动开发的岗位,前几天一个C++客户端工作岗位,猎头也问我是否有了解windows内核. 所以,调研了一下C++的开发方向:window ...

  7. Windows驱动开发环境搭建:VS2013+WDK8.1

    你的Windows驱动开发环境之所以搭建不成功,是因为你没有看这篇博客 1.安装包准备 Visio Studio2013: https://pan.baidu.com/s/1P77yeSKuE7mWl ...

  8. Windows驱动开发基础(五)驱动程序的数据结构

    Windows驱动开发基础:驱动程序的数据结构.转载请标明出处:http://blog.csdn.net/ikerpeng/article/details/38794405 I/O管理器定义了一些数据 ...

  9. Windows驱动开发学习笔记(七)—— 多核同步内核重载

    Windows驱动开发学习笔记(七)-- 多核同步 基础知识 并发与同步 分析 InterlockedIncrement 原子操作相关API 内核文件 多核同步 临界区 示例一:错误的临界区 示例二: ...

  10. Windows驱动开发学习笔记(六)—— Inline HOOK

    Windows驱动开发学习笔记(六)-- Inline HOOK SSDT HOOK Inline Hook 挂钩 执行流程 脱钩 实验一:3环 Inline Hook 实验二:0环 Inline H ...

最新文章

  1. 阿里巴巴5月5日综合算法题详解
  2. (UVA)1586 --Molar Mass(分子量)
  3. C语言:输入两个数,输出最大公约数,最小公倍数
  4. python生成器yield_python 生成器yield的总结
  5. pl/sql developer 安装svn插件 64位
  6. python两数相加有进退位_Leetcode_两数相加_python
  7. (16)VHDL实现半加器与全加器
  8. 车模型一般多少钱_婚车租赁一般多少钱?最新婚车出租价格表!
  9. Qt 该文件不能在当前页码(936)中表示字符
  10. jq向php文件传json,jQuery向后台传入json格式数据的方法
  11. java远程获取linux文件_Java远程连接操作linux服务器,scp获取文件
  12. Java中的DES加密与解密工具类
  13. ps 抠图 修改背景颜色
  14. 2021年“上海区块链周”参会随感(二)2021-04-12
  15. Hadoop集群性能测试
  16. Failed to transform file 'xxx' to match attributes 的解决办法
  17. Web必备性能压力测试工具WebBench与ApcheBench(ab)详解
  18. 阿里大鱼短信功能使用
  19. vue 实现强制类型转换 ,将数字变为字符串,字符串变为数字,数组数字变为字符串、js对象转数组
  20. python代码宠物_和孩子一起做一只电子宠物吧!

热门文章

  1. 剑指offer——44.翻转单词顺序序列
  2. Pandas数据分析教程(2)-数据读取之普通索引、loc/iloc索引
  3. smartbi和第三方集成策略
  4. APM芯片 写flash问题
  5. 违反充足理由律的诡辩术
  6. android平板电脑手写笔应用,三星旗舰Android平板电脑将配备手写笔 小米5C使用自家松果处理器...
  7. Unity TextMesh Pro 不显示中文 ???
  8. Tourists【广义圆方树+树链剖分+方点的特别优化】
  9. 安装redhat 8.0红帽系统
  10. Java笔记009-数组、排序、查找、多维数组(二维数组)