DirectX是什么东东?
:directx是一种API接口,什么是API呢?它称之为应用程序接口,操作系统可以给应用程序提供很多服务,比如说弹出窗体,绘制图形等,每一种服务就是一个函数,称之为应用程序接口函数,应用程序可以调用它。
那么directx 跟一般的API 有什么区别呢?主要是提供的服务和服务对象不同,它是用来为游戏和多媒体程序提供服务的。
DirectX有什么用?
刚才已经说了,它可以为游戏和多媒体程序提供服务,它可以让这些程序获得更高的的执行效率,它是一种公共的API。以前在DOS下玩游戏时,可不像我们现在,安装上就可以玩了,他们往往首先要先设置声卡的品牌和型号。对游戏开发者来说就更麻烦了,因为为了让游戏能够在众多电脑中正确运行,开发者必须在游戏制作之初,便需要把市面上所有声卡硬件数据都收集过来,然后根据不同的 API(应用编程接口)来写不同的驱动程序。简单说就是以前各个厂家各自为政,没有统一号令,这样就很混乱。微软为了解决这个问题,为众厂家
推出了一个共同的应用程序接口——DirectX,只要这个游戏是依照Directx来开发的,不管你是什么显卡、声卡、统统都能玩,而且还能发挥更佳的效果。
Directshow是什么东东?
directshow是微软提供的进行流媒体处理的开发包。它里面其实也是一套api,这些api为应用程序进行流媒体处理提供服务。
Directshow可以干什么?
具体地说,为多媒体流的捕捉和回放提供了强有力的支持,捕捉就是采集的意思,回放相当于重播。运用DirectShow,我们可以很方便地从显卡和声卡上捕获数据,并且进行相应的后期处理乃至存储到文件中。
COM组件是什么东东?
Com是微软提供的一种软件开发技术。组件可以理解为软件的小的组成单元,组件实际上是一些小的二进制可执行程序,它们可以给应用程序,操作系统以及其他组件提供服务。COM就是开发软件组件的一种方法。
打个比方,com组件就好像是积木,积木有圆柱型的,三角锥型的,长方体的,我们可以把这些积木堆积成一所火车,火车头是方形的。那如果火车要升级,改成的,那怎么办呢,只要把第一块积木升级一下,也就是把它升级成椎体。这样对于软件来说,升级和更新模块就很方便了。
第一个程序快定义了一个接口,下面一个就是我们所说的组件。它是从接口继承过来的,COM规范规定,任何组件或接口都必须从IUnknown接口中继承而来IUnknown定义了三个重要函数,分别是QueryInterfaceAddRefRelease。其中QueryInterface负责组件对象上的接口查询,AddRef用于增加引用计数,Release用于减少引用计数。引用计数是COM中的一个非常重要的概念,它很好的解决了组件对象的生命周期的问题。COM组件一般采用自销毁的策略,一般IUnknownRelease的实现:当引用计数器的值为0时,组件对象就会调用delect this 指令。
什么是filter
Filter 是一个COM组件,它的com特性的实现其实在其基类中实现的,比如IUnknown接口,我们直接从基类派生出我们的Filter后,它就支持com接口了,它就是一个COM组件。
Filter由一个或多个Pin组成。Pin也是一个COM组件。Filter文件的扩展名为.ax,但也可以是.Dll
Filter graph
一个filter 链表我们称为filter Graph。
Filter的分类?
source filter - filter graph的数据源,这些数据可以来自文件、网络、摄像头或任何其它 东西。每一个source filter操纵不同类型的数据源。
    transform filter - 接收数据,处理数据并将它送入下一个filter。编码filter和解码filter都属于这个种类。
    Renderer filter - 处于filter链的未端,接受数据并将其展现给用户。比如,一个视频renderer在显示器上绘制视频图像;一个音频renderer将音频数据送入声卡;一个写文件filter(file-writer filter)将数据存盘。
Pin
Pin也是com组件,filter间的数据传输是通过pin来完成的。具体地说Pin就是一个c++类,实现了IPin接口,也就是从IPin继承过来的,它里面定义了一些函数,用于数据的传输。
Media type
    用来描述数据格式。
    pin相互连接进行数据传输的时候,需要进行媒体类型的协商,如果都支持某一种媒体类型,那就可以传输数据,如果媒体类型不兼容,那就传不了。
Media type一般可以有两种表示:AM_MEDIA_TYPECMediaType。前者是一个Struct,后者是从这个Struct继承过来的类。
Media type有三部分组成:Major typeSubtypeFormat type。这三个部分都使用GUID来唯一标示。Major type主要定性描述一种Media type,比如指定这是一个Video,或Audio等;Subtype进一步细化Media type,如果Video的话可以进一步指定是UYVYYUY2RGB24RGB32等;Format type用一个Struct更进一步细化Media type
Filter Graph Manager
也是一个com对象,用来控制Filter graph中的所有的filter,主要有以下的功能:
1 用来协调filter之间的状态改变,从而使graph 中的所有的filter的状态的改变应该一致。
2 建立一个参考时钟。
3 将filter 的消息返回给应用程序
4 提供方法用来建立 filter graph。
这里只是简单的描述一下,详细地可以参考文档。
状态改变,Graph中的filter的状态改变应该一致,因此,应用程序并不是将状态改变的命令直接发给filter,而是将相应的状态改变的命令发送给Filter graph  Manager,由manager将命令分发给graph中每一个filter。Seeking也是同样的方式工作,首先由应用程序将seek命令发送到filter graph 管理器,然后由其分发给每个filter。
参考时钟,graph中的filter都采用的同一个时钟,称为参考时钟(reference clock),参考时钟可以确保所有的数据流同步,视频桢或者音频桢应该被提交的时间称为presentation ti
me.presentation time 是相对于参考时钟来确定的。Filter graph Manager应该选择一个参考时钟,可以选择声卡上的时钟,也可以选择系统时钟
Graph事件手机unknown是什么意思, Graph 管理器采用事件机制将graph中发生的事件通知给应用程序,这个机制类似于windows的消息循环机制。
Graph构建的方法,graph管理器给应用程序提供了将filter添加进graph的方法,连接filter的方法,断开filter连接的方法。
  但是,graph 管理器没有提供如何将数据从一个filter发送到另一个filter的方法,这个工作是由filter在内部通过pin来独立完成的。
数据传输协议
数据在filter graph中按一定的规范来进行传输,一般directshow filter在主存中保存媒体数据,并且通过pin连接向另一个filter递交数据,这种类型的传输协议被称作本地内存传输协议(local memory transport)
DirectShow为本地内存传输协议定义了两种机制:(push)模式(pull)模式。在推模式中,source filter产生数据,并且一般在它的Output pin上有独立的子线程负责将数据发送出去将其递交给下游的filter,下游的filter被动地接收数据并处理它们,再将数据传递给它的下游filter,常见的情况如WDM模型的采集卡的Live Source Filter在拉模式中,Source filter不具有把自己的数据送出去的能力,一般Source filter后紧跟着接一个Parser FilterSplitter Filter,这种Filter一般在Input pin上有个独立的子线程,负责不断地从Source filter索取数据,然后经过处理后将数据传送下去,常见的情况如File source。推模式使用IMemInputPin接口,而拉模式使用IAsyncReader接口。推模式比拉模式应用更广泛。
Pin的连接
Pin连接的大致过程如下:
Filter Graph Manager首先调用输出pin上的IPin::Connect(带输入Pin的指针作为参数),然后传递一个指针给输入pin
如果输出pin接受连接的邀请,它就调用输入pin上的IPin::ReceiveConnection
如果输入pin也接受连接邀请,那么连接成功,pin之间的连接ok
枚举过程?
如果没有指定或不完全指定了Media type,则进入枚举过程。枚举欲连接的Input pin上所有的Media type,逐一用这些Media typeOutput pin进行连接(如果连接函数提供了不完全Media type,则要先将每个枚举出来的Media type与它进行匹配检查),如果Output pin也接受这种Media type,则Pin之间的连接宣告成功;如果所有Input pin上枚举的Media typeOutput pin都不支持,则枚举Output pin上的所有Media type,并逐一用这些Media typeInput pin进行连接。如果Input pin接受其中的一种Media type,则Pin之间的连接到此也宣告成功;如果Output pin上的所有Media typeInput pin都不支持,则这两个Pin之间的连接过程宣告失败。
每个Pin都可以实现GetMediaType函数来提供该Pin上支持的所有 Preferred Media type(但一般只在Output pin上实现,Input pin主要实现CheckMediaType看是否支持当前提供的Media type就行了)。连接过程中,Pin上枚举得到的所有Media type就是这里提供的。
媒体样本(media sample)和分配器(allocator) ?

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。