一般用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的问题还是其他,反正我机子上是不能在多工
程文件下跟进去。怪)