kenlistian

勤学多思

  IT博客 :: 首页 :: 新随笔 ::  :: 聚合  :: 管理 ::
  412 随笔 :: 0 文章 :: 23 评论 :: 0 Trackbacks

一般用dspack开发directshow

1.从工程文件以dll方式建立filter工程,在工程头加上如下

uses
  BaseClass,
  xxx.pas;   //编写filter单元的文件,套加

{$E ax}      //编译出.AX格式文件

exports      //导出Filter相关的函数,定义在BaseClass.Pas
  DllGetClassObject,
  DllCanUnloadNow,
  DllRegisterServer,
  DllUnregisterServer;

begin
end.

2.创建单元文件main.pas,下面基本可以照套.

unit main;
interface
uses BaseClass, ActiveX, DirectShow9, Windows;

{DirectShow9 定义了各种DirectShow基本接口和类型,
  BaseClass  实现了各种接口的基类}


const
  CLSID_MyClass : TGUID = '{90A70CF4-A445-4211-B962-308054E93023}';

  //定义Filter媒体类型和Pin的属性,这里是演示TransformFilter如下:
  MyPinTypes : TRegPinTypes =
              (clsMajorType: @MEDIATYPE_NULL;
               clsMinorType: @MEDIASUBTYPE_NULL);

  MyPins : array[0..1] of TRegFilterPins =
      ((strName: 'Input';  bRendered: FALSE; bOutput: FALSE; bZero: FALSE;
        bMany: FALSE;     oFilter: nil;              strConnectsToPin: nil;
       nMediaTypes: 1;    lpMediaType: @MyPinTypes),
       (strName: 'Output'; bRendered: FALSE; bOutput: TRUE;  bZero: FALSE;
        bMany: FALSE;      oFilter: nil;            strConnectsToPin: nil;
       nMediaTypes: 1;     lpMediaType: @MyPinTypes));

 

  //从基类TBCTransInPlaceFilter派生出一个TransformFilter,
  // TBCTransInPlaceFilter支持数据的"就地"处理,从这个基类派生出新的Filter,
  // 只要实现function Transform(Sample: IMediaSample): HRESULT;
  // function CheckInputType(mtin: PAMMediaType): HRESULT
  //这两个虚函数就可以使用了


type
  TMyClass = class(TBCTransInPlaceFilter)
     function Transform(Sample: IMediaSample): HRESULT; override;
     function CheckInputType(mtin: PAMMediaType): HRESULT; override;
  end;

implementation


function TMyClass.CheckInputType(mtin: PAMMediaType): HRESULT;
begin
 // 这里是检测mtin的媒体类型,如果跟我们所要的是一样,我们就返回S_OK,否则返回S_False,
  //if IsEqualGUID(mtin.majortype, MEDIATYPE_Video) and IsEqualGUID(mtin.subtype, MEDIASUBTYPE_RGB24) then    
  //   result := S_OK else result := S_False;
  result := S_OK;
end;

function TMyClass.Transform(Sample: IMediaSample): HRESULT;
begin
  //这里就是我们实现对Sample的数据进行处理的代码,可以是视频的处理,
  //可以是音频的处理,要看输入PIN(MyPinTypes)是什么样的媒体类型
  result := NOERROR;
end;

 


initialization

//类工厂注册Filter的一些信息,
//  第一个参数是Filter本身的实现对象TMyClass,
//  第二个参数是Filter的名字'MyFilter',
//  第三个参数是Filter的GUID CLSID_MyClass,
//  第四个参数是注册Filter的类型,
//  第五个参数是Filter的Merit值,这个值如果设得高的话,智能连接里被使用率就要高,
//  第六个参数是PIN的个数,这里一个输入PIN一个输出PIN,所以是2,
//  最后一个参数是PIN的类型属性,就是上面定义的MyPins数组

  TBCClassFactory.CreateFilter(TMyClass, 'MyFilter', CLSID_MyClass,
    CLSID_LegacyAmFilterCategory, MERIT_DO_NOT_USE, 2, @MyPins);
end.


调试FIlter
  1. 先注册.用regsvr32
  2. 在Run Parameters里的Host Application里设置Graphedt.exe的路径,
  3. Run
    如果跟不进去,则在工程文件编译开关中加入debug宏(或定义在工程文件中)
    还跟不进去的话,估计是在工程管理中有多个工程,在工程管理中只能有
    一个工程。(不知道是delphi7的问题还是其他,反正我机子上是不能在多工
   程文件下跟进去。怪)
 

posted on 2009-01-04 11:29 kenlistian 阅读(2301) 评论(0)  编辑 收藏 引用 所属分类: Base
只有注册用户登录后才能发表评论。