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. ROS多个master消息互通

    需求 有时候我们需要有几个不同的master, 他们之间要交换topic的内容,这时候就不能使用ros自带的设置同一个master的方法. 我们的处理方法是,构造一个client和一个server,他 ...

  2. Oracle Study Note : Tablespace and Data Files

    1.how to create a tablespace that employs the most common features create tablespace tb_name #create ...

  3. 界面控件 - 滚动条ScrollBar

    界面是人机交互的门户,对产品至关重要.在界面开发中只有想不到没有做不到的,有好的想法,当然要尝试着做出来.对滚动条的扩展,现在有很多类是的例子. VS2015的代码编辑是非常强大的,其中有一个功能可以 ...

  4. 学习KMP算法

    int kmp(char * t,int lenT,char * pat,int lenPat){ ,posT=; int[] f=partialMatch(pat,lenPat)//获取pat字符串 ...

  5. 编写可维护的JavaScript之简易模版

    /* * 正则替换%s * @para arg1(text) 需要替换的模版 * @para arg2 替换第一处%s * @para arg3 替换第二处%s * 返回替换后的字符串 */ var ...

  6. IOS之表视图添加搜索栏

    下面是我们要实现的效果.本效果是在上一篇自定义表视图的基础上进行更改的.     1.将Search bar and search display拖动到ViewController中.不要添加Sear ...

  7. discuz分类信息地区联动菜单字段

    1 = 河南省 1.1 = 郑州市 1.1.1 = 中原区 1.1.2 = 二七区 1.1.3 = 管城区 1.1.4 = 金水区 1.1.5 = 上街区 1.1.6 = 惠济区 1.1.7 = 巩义 ...

  8. c/c++常用代码 -- 共享内存

    #pragma once #include <stdio.h> #include <tchar.h> #include <string.h> #include &l ...

  9. LoadRunner - 当DiscuzNT遇上了Loadrunner(下) (转发)

    当DiscuzNT遇上了Loadrunner(下) 在之前的两篇文章中,基本上介绍了如何录制脚本和生成并发用户,同时还对测试报告中的几个图表做了简单的说明.今天这篇文章做为这个系列的最后一篇,将会介绍 ...

  10. jta.properties transactions.properties Log already in use 解决方法

    当在resin里跑多个含有atomikos控制事物的项目时,会报错,Log already in use. 解决方法: 加jta.properties或者transactions.properties ...