DirectShow, as you might have guessed, is a COM based multimedia framework that makes the task of capturing, playing back, and manipulating media streams easier(DirectShow是一个基于组件对象模块(COM)的多媒体框架,可以让捕捉、播放以及操作媒体流变的更容易). It was formerly known as ActiveMovie, until it became known as DirectShow. DirectShow might internally use DirectSound and DirectDraw when playing a media, provided there is support from the hardware; otherwise, it might use the traditional Wave APIs and GDI APIs(DirectShow在硬件支持的情况下,可能内部会使用DirectSound以及DirectDraw来播放媒体。否则的话,它就可能会使用传统的Wave  APIs和GDI APIs).
 
Filters: Technically, Filters are just C++ classes complying(遵从) with the COM interface, which take input in some form, process the data, and produce some output in the same/or different form(Filters是遵循COM接口的C++类,以一些方式获取输入,处理数据,并且以同样/或不同的方式产生输出). A Filter represents each stage in the processing of a media type.
 
Pins: A Pin is an interface in itself, and every Filter must implement at least one Pin(Pin自身是一个接口,并且每个Filter必须实现至少一个Pin). Pins are a way for Filters to talk to other Filters(Pins是Filters之间互相联系的一种方式). Typically, a Filter might have an input pin and an output pin(典型地,一个Filter可能有一个输入pin和一个输出pin). During the processing of the media, a Filter takes input through its input pin, processes the data, and passes the output to another filter through its output pin(在处理媒体时,Filter从输入pin获取输入,处理数据,并且通过输出pin将输出传递给另一个Filter). The other filter, as is obvious, receives the processed data through its input pin. So, basically, the output pin of one filter is connected with the input pin of another filter, and that is how they talk(所以,本质上,一个Filter的输出pin是与另一个Filter的输入pin相连接的,这就是它们之间互相联系的方式).
 
Filter Graph and Filter Graph Manager: A Filter Graph is a sequence of connected filters(Filter Graph是一系列相连接的Filters). The processing of any type of media involves a Filter Graph with a specific set of filters most suitable for that media type(处理任何类型的媒体都涉及到一个Filter Graph,它由一组特定的最适合该媒体类型的Filters组成). The Filter Graph Manager is the divine power that lets you create these Filter Graphs, add Filters to a Filter Graph, connect the Pins of the appropriate Filters, and finally, run the graph which accomplishes our objective, which is, if you remember, playing the media(Filter Graph Manager允许你创建Filter Graphs,添加Filters到Filter Graph,将合适的Filters的Pins相连接,并且最终运行Graph来播放媒体).
 
Source Filter takes the input from a file or a URL or a capture device, and processes the data in a form which can be consumed by other filters(Source Filter从一个文件或URL或捕获设备中获取输入,并且处理生成可供其他Filters使用的数据). A characteristic of a source filter is that it has no input pins and only one output pin(Source Filter的一个特性是它没有输入pins,只有一个输出pin). Note: Pins are a secret between filters only. A Renderer Filter takes the input from the previous filter, and renders it to a sound device or a display device or a file, in case of capture(Renderer Filter从先前的Filter获取输入,并且将数据以捕获的方式渲染到一个音频设备,或一个显示设备,或一个文件). Remember, this might use DirectSound or DirectDraw internally. A characteristic of a renderer filter is that it has one input pin and no output pins(Render Filter的一个特性是它由一个输入pin,却没有输出pins). Everything in between a source filter and a renderer filter is called a Transform Filter. A transform filter might have one or more input pins and one or more output pins.
 
Any application that wants to use DirectShow must follow these steps:
1. Create the Filter Graph Manager
2. Create the Filter Graph using the Filter Graph Manager
3. Run the Filter Graph (to play the media)
4. Release the resources
 
There are three ways in which you can create a filter graph: Automatic Graph Creation, Manual Graph Creation, and Semi-Automatic Graph Creation.
Automatic Graph Creation: This is the easiest of all methods, but doesn't give your application much flexibility in choosing filters. Here, you just call the RenderFile method on the IGraphBuilder interface, passing in the filename or any other source(你只需要调用IGraphBuilder接口的RenderFile函数,传入文件名或任何其他源). The graph manager will take all the pains(麻烦的事) to create an appropriate graph for you. The graph builder has its own algorithm to select various filters and then connect their pins to complete the graph(Graph Builder有它自己的算法来选择不同的Filters,并且把它们的pins连接起来以完成Graph). For example, if you pass the filename "love.mp3", the graph builder will identify the file format and then choose the appropriate filters to build a graph suitable for MP3 media.
Manual Graph Creation: This method is the most painful, but provides you with super flexibility in choosing the filters. I won't go into the details of this, but in the most abstract terms, first, you have to create the instances of the individual filters that you need(首先,你必须创建你所需要的独立的Filter实例). Then, you add each of these filters to the graph(接着,你将这些Filters添加到Graph中). At this point, the filters just lie in the graph like beans on a table(此时,这些Filters就像散落在桌子上的豆). The next step is to connect the pins of these filters(接着要做的就是将这些Filters的pins连接起来); this is again painful as it involves enumerating the pins of the filters and selecting the output pin of one and the input pin of another and then connecting the two together(这又是一件麻烦事儿,因为需要枚举Filters的pins,然后选定一个Filter的输出pin以及另一个Filter的输入pin,并将它们连接起来). Once you have connected all the pins, the graph is complete and ready to be run, assuming you haven't messed up the pins.
Semi-Automatic Graph Creation: This method provides you the flexibility while also trying to reduce the amount of pain. Here, you just choose a few priority filters (that you most surely want present in the graph) and then add them to the graph(你只需要选择一些主要的Filters(那些你肯定想要它们出现在Graph中的),然后把它们添加到Graph中). These filters lie in the graph just like beans on a table. Then, you ask the graph manager to complete the graph(你请求Graph Manager来完成Graph). The graph manager will add the missing pieces (filters) and build a graph for you(Graph Manager会添加缺漏的Filters,并且为你构建Graph). One thing to note here is that the graph manager will try its ever best to include your priority filters in the final graph, so this way, you have the control to override some of the default filters which the graph manager would have otherwise chosen(要注意的是Graph Manager会尽最大可能在最终的Graph中包含你选择的重要的Filters,这样的话,你就能够有权替换一些Graph Manager本来会选用的默认的Filters).

DirectShow学习笔记的更多相关文章

  1. DirectShow学习笔记总结

    DirectShow是微软公司在ActiveMovie和Video for Windows的基础上推出的新一代基于COM(Component Object Model)的流媒体处理的开发包,9.0之前 ...

  2. 我的Android进阶之旅------>Android中编解码学习笔记

    编解码学习笔记(一):基本概念 媒体业务是网络的主要业务之间.尤其移动互联网业务的兴起,在运营商和应用开发商中,媒体业务份量极重,其中媒体的编解码服务涉及需求分析.应用开发.释放license收费等等 ...

  3. js学习笔记:webpack基础入门(一)

    之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...

  4. PHP-自定义模板-学习笔记

    1.  开始 这几天,看了李炎恢老师的<PHP第二季度视频>中的“章节7:创建TPL自定义模板”,做一个学习笔记,通过绘制架构图.UML类图和思维导图,来对加深理解. 2.  整体架构图 ...

  5. PHP-会员登录与注册例子解析-学习笔记

    1.开始 最近开始学习李炎恢老师的<PHP第二季度视频>中的“章节5:使用OOP注册会员”,做一个学习笔记,通过绘制基本页面流程和UML类图,来对加深理解. 2.基本页面流程 3.通过UM ...

  6. 2014年暑假c#学习笔记目录

    2014年暑假c#学习笔记 一.C#编程基础 1. c#编程基础之枚举 2. c#编程基础之函数可变参数 3. c#编程基础之字符串基础 4. c#编程基础之字符串函数 5.c#编程基础之ref.ou ...

  7. JAVA GUI编程学习笔记目录

    2014年暑假JAVA GUI编程学习笔记目录 1.JAVA之GUI编程概述 2.JAVA之GUI编程布局 3.JAVA之GUI编程Frame窗口 4.JAVA之GUI编程事件监听机制 5.JAVA之 ...

  8. seaJs学习笔记2 – seaJs组建库的使用

    原文地址:seaJs学习笔记2 – seaJs组建库的使用 我觉得学习新东西并不是会使用它就够了的,会使用仅仅代表你看懂了,理解了,二不代表你深入了,彻悟了它的精髓. 所以不断的学习将是源源不断. 最 ...

  9. CSS学习笔记

    CSS学习笔记 2016年12月15日整理 CSS基础 Chapter1 在console输入escape("宋体") ENTER 就会出现unicode编码 显示"%u ...

随机推荐

  1. SSD1306驱动的OLED实验

    [转]http://bbs.21ic.com/icview-434543-1-1.html 前面几章的实例,均没涉及到液晶显示,这一章,我们将向大家介绍OLED的使用.在本章中,我们将使用战舰STM3 ...

  2. ios中怎么样判断路径最后的后缀名称

    使用hasSuffix属性即可 例如 [photo.thumbnail_pic.lowercaseString hasSuffix:@"gif"]

  3. 各设备如何清理dns缓存

    Windows 按下 Windows+R 键,运行 cmd ,在命令提示符运行命令 ipconfig /flushdns OS X 10.10 在[应用程序][实用工具][终端]运行命令 sudo d ...

  4. 29.DDR2问题1仿真模型文件

    在使用modelsim仿真DDR2时,一般我们会用美光网站上下载的DDR2仿真模型.仿真模型文件一般有ddr2_module.v,ddr2.v,ddr2_mcp.v,ddr2_parameters.v ...

  5. JAVA类与对象(五)----对象的生成、使用

    对象的生成 创建一个对象包括对象的声明.实例化.初始化三部分. 1.声明-----类名对象名 声明并不是为对象分配内存空间,而只是分配一个引用空间.对象的引用类似于指针,是32位的地址空间,它的值指向 ...

  6. My mac cannot run 类相关的操作 , which is lower than 类相关的操作。

     首先你选择的项目是mac项目,    其次,你MAC的系统版本小于你当前项目部署环境的最低支持版本    要么升级你的MAC系统,要么再project—>target设置developerme ...

  7. P1230: [Usaco2008 Nov]lites 开关灯

    嗯嗯,这是一道线段树的题,询问区间内亮着的灯的个数,我们可以把区间修改的线段树改一下,原本的求和改成若有奇数次更改则取反(总长度-亮着的灯个数),而判断是否奇数次只要数组加一个delta的值,upda ...

  8. python的urllib2库详细使用说明

    一直以来技术群里会有新入行的同学提问关于urllib和urllib2以及cookielib相关的问题.所以我打算在这里总结一下,避免大家反复回答同样的问题浪费资源. 这篇属于教程类的文字,如果你已经非 ...

  9. opencv颜色识别代码分享

    android 平台 opencv 实现颜色识别代码:http://www.eyesourcecode.com/thread-40682-1-1.htmlopencv的颜色识别简单实现的代码:http ...

  10. React + Reflux

    React + Reflux 渲染性能优化原理   作者:ManfredHu 链接:http://www.manfredhu.com/2016/11/08/23-reactRenderingPrinc ...