英文原文地址:https://msdn.microsoft.com/en-us/library/windows/desktop/dd390351(v=vs.85).aspx

Microsoft®DirectShow®是MicrosoftWindows®平台上的流媒体体系结构。 DirectShow提供了高质量的多媒体流的捕获和回放。它支持各种格式,包括高级系统格式(ASF),运动图像专家组(MPEG),音频视频交错(AVI),MPEG音频层-3(MP3)和WAV声音文件。它支持基于Windows驱动程序模型(WDM)或Windows视频的数字和模拟设备的捕捉。它可以自动检测并使用视频和音频加速硬件,但也支持没有加速硬件的系统。
DirectShow基于组件对象模型(COM)。要编写DirectShow应用程序或组件,您必须了解COM客户端编程。对于大多数应用程序,您不需要实现自己的COM对象。 DirectShow提供您需要的组件。如果要通过编写自己的组件来扩展DirectShow,则必须将它们实现为COM对象。
DirectShow是为C ++设计的。 Microsoft不提供DirectShow的托管API。
DirectShow简化了媒体播放,格式转换和捕捉任务。同时,它还为需要自定义解决方案的应用程序提供对底层流控制架构的访问。您也可以创建自己的DirectShow组件来支持新格式或自定义效果。
您可以使用DirectShow编写的应用程序类型的示例包括文件播放器,电视和DVD播放器,视频编辑应用程序,文件格式转换器,音频 - 视频捕捉应用程序,编码器和解码器,数字信号处理器等等。

下面来自百度百科:DirectShow

DirectShow是微软公司在ActiveMovie和Video for Windows的基础上推出的新一代基于COM(Component Object Model)的流媒体处理的开发包,与DirectX开发包一起发布。DirectShow使用一种叫Filter Graph的模型来管理整个数据流的处理过程,运用DirectShow,我们可以很方便地从支持WDM驱动模型的采集卡上捕获数据,并且进行相应的后期处理乃至存储到文件中。这样使在多媒体数据库管理系统(MDBMS)中多媒体数据的存取变得更加方便。它广泛地支持各种媒体格式,包括Asf、Mpeg、Avi、Dv、Mp3、Wave等,为多媒体流的捕捉和回放提供了强有力的支持。

简介

DirectShow是微软公司提供的一套在Windows平台上进行流媒体处理的开发包,9.0之前与DirectX开发包一起发布,之后包含在windows SDK中。
运用DirectShow,我们可以很方便地从支持WDM驱动模型的采集卡上捕获数据,并且进行相应的后期处理乃至存储到文件中。它广泛地支持各种媒体格式,包括Asf、Mpeg、Avi、Dv、Mp3、Wave等等,使得多媒体数据的回放变得轻而易举。另外,DirectShow还集成了DirectX其它部分(比如DirectDraw、DirectSound)的技术,直接支持DVD的播放,视频的非线性编辑,以及与数字摄像机的数据交换。

历史

ActiveMovie,开发代号 Quartz, 这个由 Geraint Davies 为微软公司设计的 DirectShow 的前身,在 Windows 3.0 时代,是作为一种对当时最流行的媒体平台 QuickTime 的回应而开发的。ActiveMovie 最早的出现是被附加在 Windows 95 上面的并且需要系统安装了 IE3.0 。它当时的使命是作为 IE 的附件播放在其窗口内的媒体文件,正如当时 QuickTime 为 Netscape 以及 IE 提供的服务那样,它的另一个功能是作为 Windows 视频技术(VFW,Video For Windows)的一个替换,特别地为在 VFW 架构中难于处理的 MPEG(移动图象专家组格式文件)文件提供辅助处理。
在 1998 年,大致在 DirectX 5 年代的时候,ActiveMovie 被重命名为 DirectShow(反映了微软公司在那时正在努力加强“直接地”在一个通常的取名系统之下与硬件合作的技术)并且被包含为 " DirectMedia SDK" 的一部份。在 DirectX 的 7 版中,DirectShow 变成了 DirectX SDK 主要组成部分而且如同 DirectInput 等其它 DirectX APIs 一样被给予了它自己的位置。甚至之后, DirectShow 被主要用来接收来自像一个手提摄像机这样的电视输入装置的数据,而且它从文件中显示数据的能力被广泛用在 Windows Media Player 上面。 从 2005 年四月起,DirectShow 被从 DirectX SDK 移除,必须单独下载Extra包才能得以支持,之后DirectShow的文档和示例被转移到Windows SDK,DirectShow也正式成为Windows的一个组件。然而,在编译某些 DirectShow 的示例时,DirectX SDK 仍然是必需的。

设计

DirectShow 运行的方式通常是一个开发者创建一个 Filter Graph,把一些 Filter - 可能订制 - 加入 Filter Graph,然后播放文件,或者播放来自互联网或照相机的数据。当播放进程运行时,Filter Graph 在 Windows 注册中寻找注册了的 Filters 并且为这些 Filter 创建本地提供的 Graph 。在这之后,它将所有的 Filter 连接在一起,并且在开发者的请求下,播放/中止创造的Graph。
为一个 mp3 文件创建的 Filter graph,由 DirectShow 自带的示例 GraphEdit 来播放。在这幅图中大的方块代表 Filter graph ,小的方块代表端口。 每个Filter表示数据处理过程的一个阶段,举例来说从一个文件或照相机读取数据,解码,转换以及绘制。filter 有若干的能被连接到其他 filter 上的连接点的Interface。Interface可能是输出或输入。根据 filter,数据被采用“拉模式”从输出端口输出,或者以“推模式”被推到另一个输入端口,并借此来传输数据。 大多数 filters 的创建使用了一组 DirectShow SDK 提供的 C++类,叫做 DirectShow BaseClass。这些为 filters 解决了许多创建,注册和连接的问题。如果要让 filter graph 能够自动的使用 filters,它们需要在一个分开的 DirectShow 项目中被登记并与 COM 一起登记。 这一个注册能被 DirectShow BaseClass处理。然而,如果应用程序手工增加 filters,他们不需要被全然登记。 不幸地,它难以修改一个正在运行中的 graph 。从头停止 graph 而产生一个新 graph 通常是比较容易的。

功能

在 DirectShow 中有许多抽象的播放源文件的方法,实现这些功能也是相当简单的而且不需要一个定制过的 filter 。下一步相对复杂的过程是程序开发员需要开发他(她)自己的 filter graph ,举个例子他们可能设计一个可以接受来自互联网或是硬盘文件数据的 source filter ,也许有些定制的 filter 就是开发者想要的,接下来他们需要让 DirectShow 为用户完成一个 filter Graph 并将所有 filter 连接起来,在最后开发者仅仅只用让 DirectShow 为他们生成一个可以获取文件数据的 source filter 就可以了。
DirectShow 预先设置支持许多通常的媒体格式,如 MP3,和 Windows 媒体视频和一些比较常见的格式,比如简单的静态图像。自从在 Windows 中这些技术被许可了,对 Fraunhofer 来说就没有为专利权而付出花费的必要了,比如 MP3 执照。扩充机制允许 DirectShow 在将来可以支持出现的任何格式,举例来说,已经有对 Ogg Vorbis 文件和 AC3 文件的支持 filters ,此外还有若干其它的支持 filters 。
不同于为了读取媒体文件必须在循环中需要调用 MoviesTask 的为 QuickTime 设计的 main C API ,DirectShow 以一种透明的方式处理这个问题。它在后台创建了一些线程来平缓的播放这些来自文件和互联网的数据与此同时不需要程序做很多任务作。还跟 QuickTime 正好相反的是,在读取一段来自互联网数据而不是读取硬盘文件的时候没有特别的需要——DirectShow 的 filter graph 摘录了来自程序的这些明细。然而,QuickTime(包括一个 ActiveX 控制)在这方面的发展相比之下逊色很多。

评价

播放一个文件是一项相对简单的任务,不过对于像是从视频窗口接收特定窗口信息到创建特定 filters,开发者会不断地遇到 DirectShow API 的黑暗面。 DirectShow 因其复杂性而声名狼藉与此同时很多人认为它是微软最复杂的libraries/APIs。在“Microsoft.public.win32.programmer.directx.video”新闻群组上存在一个长期的灰色笑话,讲的是每当某人想要为 DirectShow 开发一个新的 filter 时,那么“六个月后见吧”。
开发者很少直接创建 DirectShow filters - 他们通常使用被称为“ DirectShow 基础类”的一组像 MFC 一样的(不需要 MFC)类别而开发者通常将会使用这些类来处理大多数工作。 基本类的大小几乎是在代码中整个 MFC library类大小的一半。 即使有了基本类,DirectShow 中存在的 COM 对象的绝对数量也是巨大的,甚至可以颠覆那些开发者想要开发的那种本以为相当直接的东西。 DirectShow's 的 API 有时违反一些传统的 COM 规则,比如关于关于参数到方法,虽然那些通常被证明了的。因此,为了制止这些情形,开发者时常使用 DirectShow 本身中较高层次的 API,即 Windows Media Player SDK,它提供了一个有较少 COM 接口处理的 ActiveX 控制。 DirectShow 也因它对数据管理权限的支持而受到批评。然而当 DirectShow 本身有的 API 对 DRM 只有最小支持的时候,它在这情况只是一个名义上的领导者。在这个案例中真正的“坏人”事实上是被从 DirectShow 分开的 Windows Media Player SDK 因为它是对 DRM 有最多支持的地方。 在相同方面,DirectShow 也因对第三方媒体播放器功能的限制而受到指责,也就是说,在播放媒体文件方面,对Windows Media Player以外的媒体播放器存在不公。

DirectShow多媒体流捕获播放组件的更多相关文章

  1. [小程序开发] 微信小程序audio音频播放组件+api_wx.createAudioContext

    引言: audio是微信小程序中的音频组件,可以轻松实现小程序中播放/停止音频等自定义动作. 附上微信小程序audio组件的相关属性说明:https://mp.weixin.qq.com/debug/ ...

  2. RTMP流媒体播放过程:握手,建立连接,建立流,播放

    本文讲述从打开一个RTMP流媒体到视音频数据开始播放的整个过程. 播放一个流媒体有两个前提步骤: 第一步,建立一个网络连接(NetConnection): 第二步,建立一个网络流(NetStream) ...

  3. 使用VLC发送TS流与播放TS流

    使用VLC发送TS流与播放TS流 一.如何使用VLC发送TS流 1.添加一个文件至VLC 2.选择串流,继续 3.选择UDP,点击添加 4.输入地址及端口 5.选择h.264+mp3(TS) 6.ne ...

  4. Windows 11实现直播,VLC超简单实现捕获、串流、播放

    上一篇文章说了搭建Nginx的rtmp服务.实现直播功能 期间发现一个更便捷的工具 VLC media play,官方下载:https://www.videolan.org 1.傻瓜式安装,略过 2. ...

  5. 【官方文档】Nginx模块Nginx-Rtmp-Module学习笔记(三)流式播放Live HLS视频

    源码地址:https://github.com/Tinywan/PHP_Experience HTTP Live Streaming(HLS)是由Apple Inc.实施的非常强大的流视频协议.HLS ...

  6. [工具]利用EasyRTSPClient工具检查摄像机RTSP流不能播放原因以及排查音视频数据无法播放问题

    出现问题 我们在做流媒体开发的过程中,进程会出现摄像机RTSP流莫名其妙无法播放的问题,而我们常用的vlc经常是直接弹出一个无法播放的提示框就完事了,没有说明出错的原因,或者在vlc的消息里面能看到日 ...

  7. RTSP H264/HEVC 流 Wasm 播放

    本文将介绍 RTSP H264/HEVC 裸流如何于网页前端播放.涉及 WebSocket 代理发送流数据, Wasm 前端解码等. 代码: https://github.com/ikuokuo/rt ...

  8. 使HTML5支持RTSP流 微信直播RTSP流 微信播放RTSP直播流(HTML5播放rtsp,web播放rtsp,微信支持rtsp)

    一.大家都知道HTML5的VIDEO可以播放视频,但是H5不支持RTSP播放,所以需要中间件! 二.我们经理长年的努力,开发了HTML5支持RTSP的中间件,使HTML5支持RTSP直播! 三.不卡顿 ...

  9. Python -- 多媒体编程 -- 音乐播放

    使用win32库的WMPlayer.OCX开发一个简易的音乐播放器 import sys from PyQt4 import QtGui, QtCore from win32com.client im ...

随机推荐

  1. visual stuidio2010 在iis中调试。

    1 你的电脑装好IIS. 这是必须的. 2.更改.NET Framework 版本为你的项目所用的版本. 应用程序池对应的.NET Framework 版本也都要对应. 3将你电脑的默认网站目录定位到 ...

  2. 1036: [ZJOI2008]树的统计Count (树链剖分)

    1036: [ZJOI2008]树的统计Count Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 3401  Solved: 1418[Submit] ...

  3. 计蒜之道 初赛 第三场 题解 Manacher o(n)求最长公共回文串 线段树

    腾讯手机地图 腾讯手机地图的定位功能用到了用户手机的多种信号,这当中有的信号的作用范围近.有的信号作用的范围则远一些.有的信号相对于用户在不同的方位强度是不同的,有的则是在不论什么一个方向上信号强度都 ...

  4. 【ajax 提交表单】多种方式的注意事项 ,serialize()的使用

    在业务中,可能因为表单内容过于庞大,字段过于繁杂,如果人为去拼接的话 ,需要耗费大量的时间和精力,与此同时,代码看上去也是冗余不堪. 所以,提交表单的时候如果能整个表单数据整体提交,那是非常开心的事情 ...

  5. matlab strel

    >>se3 = strel('square',3)Neighborhood: 1 1 1 1 1 1 1 1 1 >> se3 = strel('line',3 , 45)Ne ...

  6. log4net 自定义Appender

    最近有个需求,使用log4net来记录日志,然后将数据保存到服务器端.一开始打算写一个windows service,定期上传日志. 后来又因为一些场景下不适应,因此直接改为保存内存中,到一定阀值之后 ...

  7. Hadoo生态中pHive HBase 项目的区别

    http://jenmhdn.iteye.com/blog/1678789 导读:Apache Hive是一个构建于Hadoop(分布式系统基础架构)顶层的数据仓库,Apache HBase是运行于H ...

  8. OpenERP|odoo Web开发

    在OpenERP 7 和 Odoo 8下测试均可. 1.相关库/框架 主要:jQuery(使用1.8.3,如果使用新版本,其他jQuery插件也要升级或修改).Underscore.Qweb 其他:都 ...

  9. css背景颜色渐变

    1.效果 2.代码 /* 基本色 */ background: #3FB0AC; /* chrome 2+, safari 4+; multiple color stops */ background ...

  10. C# 中如何将List<string>里的集合转换成字符串并按指定的字符进行分隔?

    代码: using System; using System.Collections.Generic; publicclassMyClass { publicstaticvoidMain() { Li ...