zoukankan      html  css  js  c++  java
  • 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种状态:停止、暂停和运行。

  • 相关阅读:
    svn cleanup failed–previous operation has not finished 解决方法
    开源SNS社区系统推荐
    从网络获取图片本地保存
    MS SQL Server 数据库连接字符串
    KeepAlive
    Configure Git in debian
    sqlserver query time
    RPi Text to Speech (Speech Synthesis)
    SQL Joins with C# LINQ
    search or reseed identity columns in sqlserver 2008
  • 原文地址:https://www.cnblogs.com/zhusd/p/1760139.html
Copyright © 2011-2022 走看看