DirectShow学习
+ -

DirectShow 过滤链

2021-02-26 44 0
欢迎加入官方QQ群:952873936或联系站长进行技术交流。

过滤器链是满足以下条件的过滤器序列:

  • 链中的每个过滤器最多有一个连接的输入引脚和一个连接的输出引脚。
  • 可以遍历链中的每个过滤器,而不遍历链外的过滤器。

例如,在下图中,过滤器A–B、C–D和F–G–H是过滤器链。F–G–H(F–G和G–H)中的每个子链也是一个过滤链。滤波器链可以由单个滤波器组成,因此滤波器A、B、C、D、F、G和H也是不同的滤波器链。过滤器E有两个输入连接,因此任何包含过滤器E的过滤器序列都不是过滤器链。
过滤链

IFilterChain接口提供了以下控制过滤器链的方法:

  • IFilterChain::StartChain启动一个链。
  • IFilterChain::StopChain停止链。
  • IFilterChain::PauseChain暂停链。
  • IFilterChain::RemoveChain从图中删除链。

没有添加链的特定方法。要添加链,请使用IFilterGraph::AddFilter方法插入新筛选器。然后通过调用IGraphBuilder::connect、IGraphBuilder::Render或类似方法连接过滤器。

当图形运行时,过滤器链可以在运行和停止之间切换。当图形暂停时,它可以在暂停和停止之间切换。这些是过滤器链中唯一可能的状态转换。

过滤链指南

使用IFilterChain方法时,确保图中的筛选器可以支持筛选器链接操作非常重要。否则,可能会导致死锁或图形错误。连接到链的筛选器必须在链更改状态后正常工作。

使用IFilterChain的最佳方法是使用一组专门为链接设计的过滤器。使用以下指导原则,以确保您的过滤器对过滤器链操作是安全的。这些点参考下图。
过滤链操作

  • 在筛选器链的状态更改之前,必须完成筛选器链边界处的所有数据处理调用。此规则适用于IMemInputPin::Receive、IPin::NewSegment和IPin::EndOfStream方法。链中的筛选器必须从链外的筛选器对这些方法的调用返回;链外的筛选器必须从链内的筛选器对这些方法的调用返回。

例如,在上一个图中,筛选器B必须完成来自筛选器A的所有数据处理调用,筛选器E必须完成来自筛选器D的所有调用。如果管脚公开了IPinFlowControl和IPinConnection接口,则可以通过调用IPinFlowControl::Block和IGraphConfig::PushThroughData方法将数据推送到图中,如动态重连中所述。过滤器还可能支持用于推送数据的私有方法。

  • 上游过滤器必须期望链的状态改变。例如,在上一个图中,假设链已停止,但filter A调用IMemInputPin::Receive。调用失败,过滤器A的响应是停止流式传输。当应用程序重新启动链时,它没有效果,因为过滤器A不再流式传输数据。

  • 下游过滤器还必须期望链的状态发生变化。否则,下游过滤器可能会在等待永远不会到达的样本时阻塞。例如,多路复用器(MUX)滤波器通常需要来自其所有输入管脚的数据。停止来自一个输入管脚的数据流可能会阻止其他流的处理。这可能导致图形死锁。

  • 从链外的筛选器到链内的筛选器的每个pin连接都应该有自己的分配器,而不是由其他连接共享。当链改变状态或从图中移除时,分配器可能会被解除委托。如果其他连接正在使用同一分配器,则它们将无法再处理样本。

  • 除非连接到链条的过滤器支持动态断开,否则不要拆下链条。通常,连接的过滤器将支持IPinConnection或IPinFlowControl接口,但可能支持专用接口。

0 篇笔记 写笔记

Directshow获取颜色空间分辨率
void GetColorSpaceResolution(){ HRESULT hr; AM_MEDIA_TYPE *pmt = NULL; VIDEOINFOHEADER *pvi = NULL; VIDEO_STREAM_CONFIG_CAPS scc; IAMSt......
DirectShow时钟时间
DirectShow定义了两个相关的时钟时间:参考时间和流时间。参考时间是参考时钟返回的绝对时间。(见参考时钟。)流时间是相对于图形上次开始运行的时间定义的。图形运行时,流时间等于参考时间减去开始时间。图形暂停时,流时间保持在暂停时的流时间。寻道操作后,流时间重置为零。图形停止时,流时间未定义。当媒......
DirectShow 事件产生
要处理DirectShow事件,应用程序需要一种方法来确定事件何时在队列中等待。过滤器图形管理器提供了两种方法:窗口通知:每当出现新事件时,过滤器图形管理器就会向应用程序窗口发送用户定义的窗口消息。事件信号:如果队列中有DirectShow事件,Filter Graph Manager将向Windo......
DirectShow 图形过滤(Filter)管理器介绍
Filter Graph Manager也是一个COM组件,它是DirectShow的控制中心,它控制Filter的运行。它有以下几个功能:协调各个Filter的状态。Filter有运行,暂停,停止三种状态,在Filter Graph中,各个Filter的状态必须协调一到,否则会引起冲突。Filte......
DirectShow播放UVC设备第二路码流方法
双码流播放Graphi图如上。双码流视频设备有两路捕获输出pin, RenderStream函数只会连接第一路pin,要播放第二路码流需要手动获取第二路pin,然后去连接解码器,再手动连接render,就可以显示了。示例代码// m_pGB 是 IGraphBuilder对象// m_pBF......
DirectShow 体系结构
DirectShow技术是建立在DirectDraw和DirectSound组件基础之上的,它通过DirectDraw对显卡进行控制以显示视频,通过DirectSound对声卡进行控制以播放声音。DirectShow的体系结构如下图所示:DirectShow 位于应用层中。它使用一种叫 Filter......
DirectShow实现视频的实时显示并抓图,可以设置视频参数
DirectShow抓图其实是使用IBasicVideo(IID_IBasicVideo)接口获取数据源,进行存储即可。IGraphBuilder* m_pGraphBuild = NULL;hr = CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_......
DirectShow 过滤器之间数据交互
过滤器通过pin连接,连接的两个PIN在在上游过滤器叫做输出pin,下游过滤器的叫做输入pin。数据从上游过滤器传递给下游过滤器通过这两个上游过滤器的输出pin到下游过滤器的输出pin实现。通常,下游过滤器通过IMemInputPin::Receive来接收来自上游过滤器输出pin发送的数据。上下游......
DirectShow数据流
本节介绍DirectShow的数据的工作方式进行介绍。通过滤器之间数据交互一节可知,数据是存在buffer中的。而每个buffer都由一个名为media sample的COM对象包装,该对象实现了IMediaSample接口。Sample由另一种类型的对象(称为分配器)创建的,它由IMemAlloc......
DirectShow 简介
DirectShow是微软Windows操作系统平台关于多媒体架构的一套API接口。使用DirectShow,应用程序可以执行高质量的视频和音频播放或采集。DirectShow提供高质量的多媒体流捕获和播放。它支持多种格式,包括Advanced Systems Format(ASF)、Motion ......
DirectShow Samples和Allocators
在看本节前,我们首先明确2个概念。通过前面的章节可知:Samples是DirectShow各过滤器之间传输的数据的封包。Allocators是用于创建Samples的分配器。本节将详细介绍Allocators和Sample的原理。当一个过滤器通过其输出管脚将多媒体数据传输给另一个过滤器(通过其输入管......
DirectShow 接收事件
过滤器图形管理器公开了三个支持事件通知的接口。IMediaEventSink包含筛选器发布事件的方法。IMediaEvent包含应用程序检索事件的方法。IMediaEventEx继承并扩展IMediaEvent接口。过滤器通过调用Filter Graph Manager上的IMediaEventSi......
DirectShow数据传输协议
DirectShow数据传输协议定义为了进行数据交换,DirectShow的过滤器(filter)必须支持相关的数据传输协议,这个传输的协议叫做transports。当2个图形过滤器的pin相连接后,它们必须支持相同的transports,除非它们进行数据交换。通常,传输要求其中一个管脚支持特定接口......
DirectShow实时源
实时源(也称为推送push源)实时接收数据。示例包括视频捕获和网络广播。通常,活动源无法控制数据到达的速率。如果满足以下任一条件,则筛选器被视为实时源:过滤器从IAMFilterMiscFlags::GetMiscFlags方法返回AM_FILTER_MISC_FLAGS_IS_SOURCE标志,并......
DirectShow 过滤器的状态
过滤器有三种可能的状态:停止、暂停和运行。暂停状态的目的是提示图形中的数据,以便run命令立即响应。过滤器图形管理器控制所有状态转换。当应用程序调用IMediaControl::Run、IMediaControl::Pause或IMediaControl::Stop时,图形过滤管理器会在所有过滤器上......
作者信息
USB中文网
B站搜索 站长漫谈 看视频。
pnpon内核开网,USB中文网,
busrom硬核技术网站长
取消
感谢您的支持,我会继续努力的!
扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

您的支持,是我们前进的动力!