一、DirectShow 简介

DirectShow(简称 DShow) 是一个 Windows 平台上的流媒体框架,提供了高质量的多媒体流采集和回放功能。它支持多种多样的媒体文件格式,包括 ASF、MPEG、AVI、MP3和WAV 文件,同时支持使用 WDM 驱动或早期的 VFW 驱动来进行多媒体流的采集。

  • DirectShow 大大简化了媒体回放、格式转换和采集工作。但与此同时,它也为用户自定义的解决方案提供了底层流控制框架,从而使用户可以自行创建支持新的文件格式或其他用户的 DirectShow 组件。

  • DirectShow 专为 C ++ 而设计。 Microsoft 不提供用于 DirectShow 的托管 API。

  • DirectShow 是基于组件对象模型(COM)的,因此当你编写 DirectShow 应用程序时,你必须具备 COM 客户端程序编写的知识。对于大部分的应用程序,你不需要实现自己的 COM 对象,DirectShow 提供了大部分你需要的 DirectShow 组件,但是假如你需要编写自己的 DirectShow 组件来进行扩充,那么你必须编写实现 COM 对象。

  • 使用 DirectShow 编写的典型应用程序包括:DVD 播放器、视频编辑程序、AVI 到 ASF 转换器、 MP3 播放器和数字视频采集应用

二、为什么需要 DirectShow

为什么需要 DirectShow?DirectShow 到底能够做什么?带着这两个问题,我们先一起来看多媒体应用开发所面临的挑战:

(1)多媒体数据量巨大,应如何保证数据处理的高效性;

(2)如何让音频和视频时刻保持同步;

(3)如何用简单的方法处理复杂的媒体源问题,包括本地文件、计算机网络、广播电视以及其他一些数码产品等;

(4)如何处理各种各样的媒体格式问题,包括 AVI、ASF、MPEG、DV、MOV 等;

(5)如何支持目标系统中不可预知的硬件。

DirectShow 的设计初衷就是尽量要让应用程序开发人员从复杂的数据传输、硬件差异、同步性等工作中解脱出来,总体应用框架和底层工作由 DirectShow 来完成,这样,基于 DirectShow 框架开发多媒体应用程序就会变得非常简单。

三、DirectShow 架构

DirectShow 的架构如下图所示:

DirectShow 位于应用层中。它使用一种叫 Filter Graph 的模型来管理整个数据流的处理过程;参与数据处理的各个功能模块叫 Filter;各个 Filter 在 Filter Graph 中按一定的顺序连接成一条 "流水线" 协同工作。( 可以看出 FilterGraph 是 Filter 的容器 )

按照功能来分,Filter 大致分为三类:Source Filters、Transform Filters 和 Rendering Filters。

  • Source Filters 主要负责取得数据,数据源可以是文件、因特网、或者计算机里的采集卡、数字摄像机等,然后将数据往下传输;
  • Transform Fitlers 主要负责数据的格式转换、传输;
  • Rendering Filtes 主要负责数据的最终去向,我们可以将数据送给声卡、显卡进行多媒体的演示,也可以输出到文件进行存储。

在 DirectShow 系统上,我们看到的,即是我们的应用程序(Application)。应用程序要按照一定的意图建立起相应的 Filter Graph,然后通过 Filter Graph Manager 来控制整个的数据处理过程。DirectShow 能在 Filter Graph 运行的时候接收到各种事件,并通过消息的方式发送到我们的应用程序。这样,就实现了应用程序与 DirectShow 系统之间的交互。

四、Directshow 的前世今生

下面介绍 Direct Show 的前身 - VFW,然后是 DirectShow 的发展历史,最后是微软准备用来替代 DirectShow 的 Media Foundation

1. VFW

VFW(Video for Windows)是微软于 1992 年推出的关于数字视频的一个 SDK,它能使应用程序通过数字化设备从传统的模拟视频源得到数字化的视频剪辑。VFW 的一个关键思想是播放时不需要专用硬件。为了解决数字视频数据量大的问题,需要对数据进行压缩。VFW 引进了一种叫 AVI 的文件标准,该标准未规定如何对视频进行捕获、压缩及播放,仅规定视频和音频该如何交错存储在硬盘上。VFW 给程序员提供 .VBX 和 AVICap 窗口类的高级编程工具,使程序员能通过发送消息或设置属性来捕获、播放和编辑视频剪辑。

VFW 技术受到的最多批评是它捕获的数据保存到磁盘上会占用大量磁盘空间,有人试验用 640x480 捕获 1s 大约需要10MB,另外 VFW 的体系结构缺乏为视频会议,在线电视等流媒体应用提供强而有效的支持。

2. DirectShow

Direct Show 的发展历史:

  • 孕育期(1995 ~ 1998)ActiveMovie,开发代号 Quartz,在 Windows 3.0 时代,是作为一种对当时最流行的媒体平台 QuickTime 的回应而开发的。它当时的使命是作为 IE 的插件播放在其窗口内的媒体文件,正如当时 QuickTime 为 Netscape 以及 IE 提供的服务那样,它的另一个功能是作为 VFW 的一个替换,特别地为在 VFW 架构中难于处理的 MPEG 文件提供辅助处理。
  • 诞生期(1998)在这一年,大致在 DirectX 5 的年代,ActiveMovie 被重命名为 DirectShow 并且被包含为 “DirectMedia SDK” 的一部分。
  • 成长期(1999 ~ 2005)在 DirectX 7 中,DirectShow 变成了 DirectX SDK 主要组成部分,而且如同 DirectInput 等其它 DirectX API 一样被赋予了它自己的位置。DirectShow 被主要用来做音视频捕捉和媒体文件的播放(Windows Media Player 就是基于 DShow 开发的)。
  • 动荡衰落期(2005 ~ 至今) 从 2005 年 4 月起,DirectShow 从 DirectX SDK 中移除了,必须单独下载 DirectShow 的 SDK 包才能得以支持,之后 DirectShow 的文档和示例被转移到 Windows SDK,DirectShow 也正式成为 Windows 的一个组件。然而,在编译某些 DirectShow 的 sample 时,DirectX SDK 仍然是必需的。

DirectShow 对数字高清媒体的应用程序确实是非常通用的、万能的,但是,DirectShow 作为一个 20 年的老技术而言已经力不从心了。比如:

  1. Graph 是静态的,要实现动态的 Graph 和 Major format change 是非常困难的。
  2. DirectShow filter 的线程模型是非常复杂的,要完全理解并永不出错是太困难了。
  3. DirectShow filter 只能用于DirectShow。
  4. DirectShow 不支持文件保护(DRM)。

于是便有了 Media Foundation。

3. Media Foundation

2005 年,微软推出 Windows Vista,与此同时在 Windows Vista 上推出了新一代多媒体应用库 Media Foundation(以下简称 MF)。目的是提供 Windows 平台一个统一的多媒体影音解决方案,开发者可以通过 MF 播放视频或声音文件、进行多媒体文件格式转码,或者将一连串图片编码为视频等等。MF 是 DirectShow 为主的旧式多媒体应用程序接口的替代者与继承者,在微软的计划下将逐步汰换 DirectShow 技术。MF 要求Windows Vista 或更高版本,不支持较早期的 Windows 版本,特别是 Windows XP。

看起来 MF 是完美的 DShow 替代者,但实际情况却是 MF 在推出十多年间鲜有人理会。一是 DShow 已经形成了成熟的社区,从硬件到软件到开发库都是非常完备的,而且 Windows 的兼容性也一直非常好,实在没有换代的动力。二是 MF 除了在 DRM 媒体保护(Protected Media Path)方面是天然支持的,其他功能并没有比 DShow 技高一筹,顶多是用着更简单一些。

另外,像最新的 UWP 框架里只支持 MFT,不能用 DShow 的 Filter,所以不确定什么时候会被完全取代。

参考:

DirectShow 简介

Windows多媒体开发框架介绍

《DirectShow开发指南》1.2节 - DirectShow 简介

音视频学习从如下学习中延伸出来的问题:

从开发小白到音视频专家_csdn研发技术的博客-CSDN博客_java音视频开发

微软流媒体框架DirectShow相关推荐

  1. 微软同步框架入门开篇(附SnapShot快照Demo)

    在Teched2008上听了一节关于MSF(Microsoft Sync Framework 微软同步框架),这一框架允许 开发者创建离线式的应用.设备和服务,可以与任何应用的任意类型数据进行集成. ...

  2. 微软同步框架入门之五--使用WCF同步远程数据

    在之前介绍的两个DEMO中,链接远程服务器所使用的方式都是通过数据库链接串.虽然可以简单的实现所期望的数据同步功能,但这样做有两个问题: 1.不适合进行分布式布署.          2.安全方面存在 ...

  3. 微软同步框架入门之四--冲突(Conflict)检测和处理

    检测和处理微软同步框架(MSF)入门之四--冲突(Conflict)检测和处理     在几篇文章当中,我介绍了 SnapShot(快照方式)和"只同步新更改和增量更改"这两种同步 ...

  4. 微软 web框架_Microsoft .NET Web编程:网站与Web应用程序

    微软 web框架 In .NET 2.0, Microsoft introduced the Web Site.  This was the default way to create a web P ...

  5. 微软驱动模块框架旨在简化Windows驱动开发

    使用微软最近新开源的微软驱动模块框架(DMF),Windows驱动开发者现在有一种更简单的方式创建简单的结构化驱动以及在驱动之间共享代码了. \\ 该框架诞生于Surface团队,微软DMF是传统Wi ...

  6. 微软ORM框架EF初探

    微软ORM框架EF初探 一.ORM 顾名思义,ORM(ObjectRelational Mapping)对象关系映射,广义上是指面对对象的对象模型和关系型数据库的数据结构之间的相互装换.通俗来讲,就是 ...

  7. 基于.NET的微软ORM框架视频教程(Entity Framework技术)

    基于.NET的微软ORM框架视频教程(Entity Framework技术) 第一讲  ORM映射 第二讲 初识EntifyFramework框架 第三讲 LINQ表达式查询 第四讲 LINQ方法查询 ...

  8. 通过NetMassDownloader批量下载和使用微软.NET框架源代码

    Visual Studio使用已下载的微软.NET源代码 http://www.cnblogs.com/winkingzhang/archive/2008/02/20/1074754.html .ne ...

  9. Microsoft Sync Framework 系列(三):微软同步框架出现背景及要解决的问题

    持续连接的C\S,B\S系统存在固有的缺陷,偶尔连接系统(OCA)在试图解决这些问题的同时又引入了新的问题.开发offline系统存在很多挑战,这些挑战都是 Microsoft Sync Framew ...

最新文章

  1. 向大家推荐一个C/C++通用Makefile
  2. hdu4467 graph
  3. show profile 分析SQL
  4. 不来这里买器件?亏大发了!
  5. C语言代码规范(八)使用const修饰值不允许改变的变量
  6. “约见”面试官系列之常见面试题第二十五篇之对vue-router的理解(建议收藏)
  7. Java 中的进程与线程的实现
  8. LeetCode 253. 会议室 II(贪心+优先队列)
  9. ORA-29807: specified operator does not exist
  10. 链接(跳转)router-link 和 路由实例Router
  11. SysTick_Handler cortex-m0 LPC1114
  12. springBoot整合Dubbo使用与采坑
  13. Spring Cloud config之一:分布式配置中心config server介绍
  14. 基于springboot的多人聊天系统
  15. Linux 复制文件
  16. java模板beetl引擎,Beetl java模板引擎
  17. 网站被黑(BUGKU)
  18. linux 报错:http://people.centos.org/tru/devtools-2/7/x86_64/RPMS/repodata/repomd.xml: [Errno 14]
  19. 数据预处理(四)——数据标准化
  20. java图书馆自习室找座占座位系统

热门文章

  1. 自制app(游戏)Please Go之上传头像篇----萌新成长之路
  2. spring boot2.X word在线预览 pdf.js
  3. activiti7没有自动生成表
  4. ubuntu18.04 安装 wechat (亲测可用)
  5. 使用Everest和ACPI Patcher轻松生成dsdt.aml
  6. C#ManualResetEvent的用法
  7. Milon.MorFIX,myie2查找wkipedia的plugin
  8. android 以太网(ethernet)获取静态信息和动态信息.IP.子网掩码.getaway(以太网 一)
  9. 搞搞Google谷歌新曲(一)插电源上网还打电话
  10. 指尖轻舞桌面:Slide On Desk - 更多功能与独特体验