zoukankan      html  css  js  c++  java
  • 学习写DSHOW框架下的FILTER之三

    时间:8:24 2011-1-7

    总结与计划
    8:30 --- 9:00

    TRANSFORM FILTER的编写

    其是使用两个特点:
    1. DSHOW框架+ COM框架
        DSHOW框架:其是包括FILTER与PIN
        COM框架:    其主要是业务逻辑的编写.
    2. 编写FILTER的两种方式
        1. 继承基类( FILTER,PIN)
        2. 继承source, translate , render 性质的FILTER.

    [ 使用编写FILTER的业务流程来看待FILTER的编写]

    [ DSHOW,FILTER的创建向导,连接向导]
        其所说明的问题.
    1. DSHOW其是可以流程化的. 所以我们要去掌握其的流程
        1. FILTER创建流程
            1. 各种FILTER其的流程,与创建方式
        2. FILTER 使用流程

    2. 向导,模块其的最终目标: 让用户直接地编写业务逻辑就可以了.
        1. 哪些是流程
        2. 哪些是业务逻辑
        3. 流程与业务逻辑之间是怎么样结合的

    [ FILTER 的初始业务流程]
    准备:
        创建一个DLL性质的工程.因为DSHOW其是管理FILTER的,以FILTER为单位的.在编写实现的时候,FILTER其是以DLL的形式实现的, 因为DSHOW其只是一个工具,其    是APP的来调用使用.其以DLL的形式加载到APP的进程空间当中.

    中间:
        0. 确定功能,
        1.确定此FILTER的性质:( source filter, translate filter, render filter)
        2.确定用户对于此FILTER的操作接口
        3.对于DSHOW流程实现方式的确定: 标准的( 继承FILTER,PIN的基类),简化( 继承SOURCE, TRANSLATE,RENDER 类)
        4.对于子类当中的有关方法进行重载    [ 这一点的要求很好的掌握]
        重载方法当中的核心业务逻辑其是由COM类完成
    实现:
        在COM类当中编写业务逻辑

    后期:
        使用工具将此FILTER的信息注册到注册表当中.

    实施:
        用户的APP其通过DSHOW的FILTER GRAPHER MANAGER来管理,对于用户而言其只是知道 有这样一个功能的FILTER,与此FILTER的接口与接口的IID_IXXX,FILTER 的CLSID.

    流程的优化:
        准备,中间过程,其是可以自动生成的.
        让FILTER的编写人员其可以直接地面向业务逻辑的编写
    DSHOW其对于用户而言是使用了统一的方式.
        1. 这样我们也是可以自动生成代码的.
        2. PC机与WINCE上所使用的代码其是可以相同的.
            1. DSHOW 创建FILTER GRAPH ,控制FILTER GRAPH
            2. FILTER的编写其也是可以相同的

    ==>
        我所希望的直接地编写业务逻辑, 或许 FILTER其的简化版本其就是这样的目标

    看来关键还是一点半

    一点:
        核心业务逻辑的编写
    半点:
         流程当中的第四点, 需要花点时间
            解法:
                1. 对于三种FILTER的DEMO要进行分析:
                    1. 其是使用哪一种方式:标准还是简化( 附思考:如果是标准,那简化怎么要样写,反之)
                    2. 在各种方式下其重载了哪些方法

    解法:
        首先全局地掌握其的业务流程
        然后:了解半点的知识
        最后: 尽情地编写最后一点

    在FILTER 编写当中,其有
    SOURCE ,TRANSLATE , RENDER,
    Stream
    baseFilter
    PIN

    其各自之间的关系是什么呢

    [  分析EZRGB24 FILTER SAMPLE ]
        其是包括: 简化的方式来进行的编写的.
    个人觉得标准的写法只是适合初始学者, 或者说: 简化的方式其是只是合适一些特殊场合.

    如:
        我们使用标准的写法完成了一个FILTER, 那么其已经满足了DSHOW框架的流程,其可以变化的方面,就是业务逻辑方法.所以我们可以去继承此FILTER的COM类,然后重载其的一些业务逻辑的方式.

    [ 问题]
    1>ezrgb24.def : error LNK2001: 无法解析的外部符号 DllCanUnloadNow
    1>ezrgb24.def : error LNK2001: 无法解析的外部符号 DllGetClassObject

    其要添加:
    #pragma comment( lib,"strmbase.lib")
    #pragma comment( lib,"strmiids.lib")

    [ FILTER当中的COM部分]
        1. 创建COM对象
        2. 查找接口
    其是创建FILTER的载体类, COM类,查找接口( DSHOW接口,用户自定义接口)

        所以其是要求重载的

    [FILTER 属性包]
        FILTER的属性包其也是 DSHOW框架当中一部分,其对于用户而言,其只是响应事件就可以了,

    [ FILTER其必须实现的三个接口]
    1.IBaseFilter
    2.IMediaFilter
    3.IPersist
    这三个接口

    [ PIN 必然实现基本接口]
    IPin
    IQualityControl

    发送PIN其还要实现
    IMediaPosition
    IMediaSeeking

    接收PIN其还要实现
    IMemInputPin

    属于SOURCE 性质的FILTE的PIN其还要实现
    IAsyncReader

    属于RENDER性质的FILTER的PIN其还要实现
    IPinConnection

    [ FILTER其必须实现的三个接口 的分析]
    1.IBaseFilter
    2.IMediaFilter
    3.IPersist   

    其类其实现这三个接口其说明了什么.
        我们要从DSHOW框架的设计说起.
    DSHOW其是以为FILTER GRAPH来实现 多媒体文件的操作的.
    操作的多媒体文件其不同的.其的FILTER GRAPH也是不同的.
    但其对于 APP用户而言是一样的.如,想播放文件,其还是使用RUN, 暂停还是PAUSE, 停止STOP.
    DSHOW其封装几个接口,来让方便用户操作,使用用户不会因为FILTER GRAPH不同,而发生不同的操作.

    DSHOW 其对于FILTER GRAPH 管理,也是相当的方便,灵活.
    针对于不同的多媒体场合其是使用不同的 FILTER GRAPH ,
    也就是采用不同的策略, 想到了策略模式.

    策略模式其的本质特点:
        统一接口,对于接口的不同实现
    如:
        如人都有脑袋,但每一个人的脑袋里面所装的东西是不同的.

    我们要写FILTER要想被DSHOW所认识,控制,其就必须实现 DSHOW所规定的接口.
    那DSHOW其哪些接口,其为什么会有这些接口呢.

    我们以播放一个视频文件为例来说明.
        需要了解的知识:
            1. DSHOW做任何一件其均是以FILTER GRAPH为操作对象的,而FILTER GRAPH 其是由FILTER所组合的.
            2. 播放视频其本质是播放一张张图片,
            3. 在播放文件的时候,我们可以暂停,停止,快进,后退.

        根据 第一点所产生的需求:   
            创建FILTER, 得到FILTER的信息(版本),FILTER有几个PIN, 将FILTER添加到FILTER GRAPH当中.
                可以归结为FILTER的基本信息管理包括:
                FindPin
                EnumPins
                QueryFilterInfo
                JionFilterGraph
                ==>这些信息其是放置在IBaseFilter 当中
            ( 而创建FILTER, 其是属于COM 框架的部分.)
            ==> DSHOW其使用上面的方式就可以将FILTER连接起来.

        根据 第二,三点所产生的需求:
            用户点击 播放,DSHOW其就要控制FILTER GRAPH 从静止到运动的状态改变.
                数据其就开始在FILTER GRAPH当中开始流动了,就像打开自来水龙头一样.
            我们要以流(stream)的角度来看DSHOW通过FILTER GRAPH来操作数据.
            水管当中的称为水流.
            FILTER GRAPH当中称为数据流( dshow当中专称为 sample)
            水流的状态表现为 水龙头的状态,水龙头的打开,关闭,
            同样数据流的状态也是通过FILITER的状态表示的.
            FILTER其会有哪些状态呢.用户的状态操作无非是: RUN,PAUSE,STOP,所以FILTER其的状态也只有这三种,
            既然有状态,就要方法来操作这些状态.
                Stop
                Pause
                Run
                GetState
                SetState 等
                ==> 其是在IMediaFilter当中.   
            FILTER其是一些对象,其就涉及到对象的 序列化, 保存与创建.
                此过程当中所涉及到的操作
                保存对象的信息:CLSID, 这是很基本的也是很关键的.
                GetClassID // 看来CLSID其只能得到,不能修改
                IPersist.

                其它信息: FILTER的状态,其是在其它接口当中实现
                FILTER其当中数据: stream,也是要保存的.

        ==> FILTER的信息访问,状态控制, 保存与创建,其均是由DSHOW来管理,DSHOW然后其封装一个接口,用户通过此接口就可以很方            便地完成对于整个FILTER GRAPH的管理.       

    ===>
    小结:
        FILTER其必须要实现的三个接口: IBaseFilter, IMediaFilter ,IPersist
    每写一个FILTER其是必须实现的三个接口, 但MS为了方便FILTER开发,其提供了CBaseFilter ,
    CBaseFilter 其实现了这三个接口,

            一个问题:
            用户在播放的时候,其快进了一下,其的一般逻辑:
            1. FILTER PAUSE
            2. FILTER GRAPH当中的数据 清空 []
            3. 得到快进之处的数据
            4. FILTER RUN

            ==>  2,3 当中的作用其不是由FILTER来管理的,而是由PIN管理,PIN其的管理对象是 STREAM. stream 与SAMPLE之间有什么关联呢.

  • 相关阅读:
    django:开发一个下载图片的接口
    django:cbv模式和fbv模式的区别
    java生成二维码/java解析二维码
    java如何台生成二维码详解
    html5 WebSocket的Js实例教程
    vue 组件传参
    Vue路由注意事项
    Vue全家桶
    浅谈vue对seo的影响
    vue打包详情
  • 原文地址:https://www.cnblogs.com/pengxinglove/p/1931611.html
Copyright © 2011-2022 走看看