• 5. DirectShow基本概念


    到这里,我基本用DSPack做了一点东西,了解了DSPack中的3个基本类及其一些方法。但要理解它们,还要了解一下DirectShow中Filter Graph、Filter、Pin的基本概念。

    在网上找了一些资料,比较好资料的地址为 http://www.yesky.com/259/1854259.shtml ,大部分资料都来自于陆其明写的《DirectShow开发指南》和《DirectShow实务精选》两本书。
    总结如下:

    1) DirectShow的系统结构

    DirectShow的体系结构如图1所示。


    图1 DirectShow系统


    DirectShow位于应用层中。它使用一种叫Filter Graph的模型来管理整个数据流的处理过程;参与数据处理的各个功能模块叫Filter;各个Filter 在Filter Graph中按一定的顺序连接成一条“流水线”协同工作。

    ( 可以看出TFilterGraph是个Filter的容器 )

    按照功能来分,Filter大致分为三类:Source Filters、Transform Filters和Rendering Filters。
    Source Filters主要负责取得数据,数据源可以是文件、因特网、或者计算机里的采集卡、数字摄像机等,然后将数据往下传输;
    Transform Fitlers主要负责数据的格式转换、传输;
    Rendering Filtes主要负责数据的最终去向,我们可以将数据送给声卡、显卡进行多媒体的演示,也可以输出到文件进行存储。

    在DirectShow系统之上,我们看到的,即是我们的应用程序(Application)。应用程序要按照一定的意图建立起相应的Filter Graph,然后通过Filter Graph Manager来控制整个的数据处理过程。DirectShow能在Filter Graph运行的时候接收到各种事件,并通过消息的方式发送到我们的应用程序。这样,就实现了应用程序与DirectShow系统之间的交互。

    2) Filter概述以及连接

    过滤器(Filter)是DirectShow中最基本的概念。DirectShow是通过Filter Graph来管理Filter的。Filter Graph是Filter的“容器”,而Filter是Filter Graph中的最小功能模块

          Filter是一种COM组件,对于每个Filter,都有其自己的Pin,它是由Filter创建的COM对象。 Filter通过Pin来进行他们之间的连接。

          Pin分为两种:输出Pin和输入Pin。输出的Pin把Filter处理后的数据传送到Filter的外 部,而输入Pin则是把Filter外部的数据接收到Filter中,以便Filter对这些数据进行处理。

         对于三种类型的Filter(Source Filter,Transform Filter,Rendering Filter)的连接图如下:

    图2 Filter的连接

    可以根据Filter所包含的输入Pin和输出Pin的熟练来判断Filter的类型:
    只有输出Pin,没有输入pin,为Source Filter
    既有输出Pin,又有输入pin,为Transform Filter
    没有输出Pin,只有输入pin,为Rendering Filter


    3)DirectShow 的重要接口

    DirectShow采用了COM标准,所以很多重要的功能都是通过COM接口来完成。下面就列举一些重要的DirectShow的接口。

    (1) IGraphBuilder接口

    用于构造Filter Graph的接口,建立和管理一系列的Filter,过滤和处理源媒体流。

    (2) IMediaControl接口

    用于控制多媒体流在Filter Graph中的流动,如流的启动和停止。

    (3) IMediaEvent接口

    用于捕获播放过程中发生的事件,并通知应用程序,如EC_COMPLETE等。

    (4) IVideoWindow接口

    用于控制视频窗口的属性。

    (5) IMeadiaSeeking接口

    用于查找媒体的接口,定位流媒体,控制多媒体数据播放提供精确控制。

    (6) IBaseFilter接口

    从ImediaFilter接口继承,用来定义一个具体的过滤器指针,并对多媒体数据进行处理。

    (7) IPin接口

    用于管理两个过滤器之间的Pin,从而连接过滤器。

    (8) IsampleGrabberCB接口

    是Sample Grabber过滤器的一个接口,用于当流媒体数据通过过滤器时进行采样以获得帧图象。


    还有一个可以参考的介绍,地址为:http://www.yesky.com/259/1854259.shtml

    Filter是一种COM组件。为了实现在Filter Graph中的统一操作,每个Filter上都至少实现了一个IBaseFilter接口。实现Filter的文件一般是一个DLL,扩展名可以是.dll,但更多的时候是.ax。

    Filter必须加入到Filter Graph并接入到工作链路中才能发挥作用。如果想绕过Filter Graph而直接使用Filter实现的功能模块,那就要将Filter功能移植成DirectX媒体对象(DMO)。

    在使用Filter之前,必须注册。 命令格式为
    regsvr32 c:\yourdirectory\yourfilter.ax

    Filter Chain是相互连接着的一条Filter链路,并且链路中的每个Filter全都有一个处于“已连接”状态的输入Pin,至多有一个处于“已连接”状态的输出Pin,这条Filter链路中的数据流不依赖链路外的其他Filter。Filter Chain通过IFilterChain接口来进行相关操作。

    当Filter Graph处于运行状态下,Filter Chain可以在运行和停止状态之间切换;
    当Filter Graph处于暂停状态下,Filter Chain可以在暂停和停止状态之间切换。这是Filter Chain仅有的两种状态转换。

    Filter的数据传送
    Filter之间以Sample的形式传送数据。Sample是一个封装了一定大小数据内存的COM组件。用于数据传输的一般是输入pin上实现的IMemInputPin接口。

    Filter有3种状态:停止、暂停和运行。

  • 相关阅读:
    mysql CREATE USER
    ConvertHelper 通用类
    自定义属性
    为什么建议使用你LocalDateTime,而不是Date?
    使用IDEA插件Alibaba Cloud Toolkit工具一键部署本地应用到ECS服务器
    IDEA-SpringBoot项目设置热部署
    CentOS7中MySQL跨机器数据迁移
    Centos7 使用YUM安装Mariadb
    Linux下svn服务器迁移
    java dateutil工具类Date.add()
  • 原文地址:https://www.cnblogs.com/zhusd/p/1760139.html
Copyright © 2020-2023  润新知