Overview of the Filter Connection Process
原文地址:http://msdn.microsoft.com/en-us/library/ms899482.aspx
在两个过滤器连接之前,他们必须增加到过滤器图表中。当使用智能连接(例如,调用IMediaControl::RenderFile)的方式创建一个过滤器图表,过滤器图表管理器基于通过render传入文件了的媒体类型增加相应过滤器到图表中。Graph
Builder对象通过预先选择的过滤器种类创建特定的图标。应用程序也可以通过指导过滤器图标管理器增加特定的过滤器来手动创建图标。在任何一种情况下,过滤器都是通过IFilterGraph::AddFilter方法增加的,并且通过调用IBaseFilter::JoinFilterGraph方法通知一个过滤器已经增加到图表中。增加的过滤器后面就可以连接到上游或者下游的过滤器。为了开始连接过程,过滤器图表管理器对每一个要连接的过滤器要求枚举自己的引脚,通过调用IPin::Connect方法请求一个输出引脚连接到输入引脚。所有的细节都由两个引脚在连接的范围内协商。
就两个过滤器已经连接的意思是它们就它们交互数据的媒体类型共享数据的大小和位置达成一致。连接的类型和传输的类型紧密相关。传输类型有好几种,这决定于数据是以”推”还是“拉”的形式传输,或者数据的缓冲区在主存还是在硬件设备上。
连接/传输类型有一个IMemInputPin连接,这连接的缓冲区在主存中,并且数据是从上游的引脚以“推”的方式传输的。基类能够处理很多这样连接机制。然而,当自己写一个过滤器时理解连接的过程非常重要,以便你可以确定哪些方法需要重写和滤器能够实现什么。在两个连接的过滤器准备传输媒体数据之前,必须按顺序实现下面的连接和协商过程。
1. 初始化连接引脚
2. 输出引脚的一个过滤器需要获取已连接的输入引脚的接口
3. 两个引脚协商一个共同的媒体类型
4. 两个引脚协商一个适合的传输来传递媒体。
第一步,Filter Graph Manger 通知上游过滤器的输出引脚去连接指定的下游过滤器的输入引脚。这样就相互交换IPin接口指针。过滤器就不能再次连接其他过滤器了。Filter Graph Manger 必须一致是它们的代理,开始一个连接,否则就肯能会产生死锁。一个过滤器或者应用程序可以指导Filter Graph Manger去连接两个引脚,或者当通过使用IGraphBuilder::Render或者IGraphBuilder::RenderFile方法去渲染一个过滤器时决定去连接过滤器。
第二步,输出引脚可能从输入引脚请求IMemInputPin接口。这为第四步做准备,那步输出引脚会使用IMemInputPin从输入引脚获取一个内存分频器。如果输出引脚已经有一个内存分配器(或者一起其他的传输在硬件过滤器),将会跳过这步,或者在专有的设计中请求其他一些接口。
第三步,尝试媒体类型,直到找到一个两个引脚都适合或者全部尝试完(这导致连接失败)。首先,输出引脚向输入引脚建议它自己支持的媒体类型。如果没有一个媒体类型适合输出引脚,输出引脚就建议自己的类型。
第四步,输入引脚向输入引脚所要内存分配器对象的接口。在基类中,这些对象继承于CBaseAllocator和CMemAllocator.。这些对象创建媒体采样和它们关联的两个引脚都可以访问的用来传输多媒体数据的数据缓冲区。如果输出引脚不能访问输入引脚的分配器(由下面讨论的原因),它会建议使用自己的分配器。无论哪种情况都需要告诉输入引脚选择的方式。
分享到:
相关推荐
基于directshow的视频捕获.pdf,视频捕获,过滤器
视频捕获源程序,详细介绍了SDK中的一个好列子,可以慢慢研究以方便些directSHow视频捕捉程序
利用VC++实现基于DirectShow的视频捕获.pdf
基于DirectShow的视频捕获
基于DirectShow视频及图片捕获软件的开发 有详细的说明文档及源代码,对于刚用Directshow有很好的帮助,文档中有详细的开发过程以及注释。
一个简单的基于DirectShow的视频捕获程序
利用DirectShow开发视频捕获的一个小例子
本过滤器为视频渲染过滤器。 参见本过滤器的介绍文章:https://blog.csdn.net/h3974/article/details/134233245 过滤器名称:视频渲染 过滤器GUID:{F783F06D-3E50-4E3F-B5FD-8F279619C836} DLL注册函数名:Dll...
学习directshow 开发的好例子,大家不容错过!!测试例子绝对可以跑!!!
文章介绍了如何在纯C#中创建虚拟视频捕获源DirectShow过滤器
本过滤器读取视频文件,将读取到的视频数据解码为未压缩的视频流RGB32,由视频引脚输出。将音频数据解码为未压缩的音频流PCM,由音频引脚输出。可以读取的视频文件格式有:3gp,asf,avi,mkv,mov,mp4,wmv。 参见...
基于DirectShow实现的VC 视频捕获程序,注意请准备好DirectShow的相关文件,比如dshow.h等文件
本过滤器获取系统播放的声音。可用于录制系统声音软件;制作系统声音频谱表;系统声音响度指示。也可用于屏幕录像软件的获取系统声音部分。 过滤器GUID:{881FA971-8B92-4778-8669-35DA2F941FA4} 输出引脚参数: ...
一个 F# + DirectShow.NET 开发的捕获摄像头视频的简单程序。
本过滤器抓取屏幕图像,生成RGB32视频流,由视频引脚输出。获取系统播放的声音,由音频引脚输出。供屏幕录像DirectShow应用程序使用。 参见本过滤器的介绍文章:...
本程序是基于DirectShow的视频采集可以实现预览,程序简单易懂,且操作方便,是初学者的较好范例。
这个directshow架构下AC3格式音频的解码过滤器,是学习directshow的好的资料,很好很强大.
采用C 的DirectShow技术编写的视频捕获源码示例,测试电脑没有摄像头,可能程序还有些小错误,不过对于了解视频捕获原理及编写方法应该有帮助,有这方面需要的朋友可以下载参考一下。
本过滤器解析MP4文件,读取视频流解码为RGB32,由视频输出引脚输出。读取音频流解码为16位PCM,由音频输出引脚输出。 参见本过滤器的介绍文章:https://blog.csdn.net/h3974/article/details/132838348 过滤器GUID...
DirectShow视频采集关闭activemovie window