directshow 的filter 一般是 xxx.ax,实际上是一个 active x 组件,你可以用 LoadLibrary 把它读入 我这有段代码你可以参考 前提是,你开发时还是要注册一下你的解码器的,这样取得解码器的 class id 比较容易,然后带上这个解码器.ax, 运行时用下面这段代码载入后 ,FitlerGraph.AddFilter 进去,然后再用 FilterGraph.RenderFile 或 Render(Pin) ,FilterGraph 会首选你已加入的 Filter, 或者,你自已全部搞定 Connectfunction TFilterProp.CreateFilterFromFile: IBaseFilter; var SaveCurrDir: string; DllGetClassObject: TDllGetClassObject; ClassFactory: IClassFactory; begin if Length(FFileName) = 0 then Exit; if IsEqualGUID(FClassGUID, GUID_NULL) then Exit; SaveCurrDir := GetCurrentDir; try SetCurrentDir(ExtractFilePath(FFileName)); FHLib := LoadLibrary(PChar(FFileName)); if FHLib = 0 then Exit; DllGetClassObject := GetProcAddress(FHLib, 'DllGetClassObject'); if not Assigned(DllGetClassObject) then begin FreeLibrary(FHlib); FHlib := 0; Exit; end; DllGetClassObject(FClassGUID, IClassFactory, ClassFactory); if not Assigned(ClassFactory) then begin FreeLibrary(FHlib); FHlib := 0; Exit; end; ClassFactory.CreateInstance(nil, IBaseFilter, Result); if not Assigned(Result) then begin FreeLibrary(FHlib); FHlib := 0; end; finally SetCurrentDir(SaveCurrDir); end; end;上面代码来至于 http://sourceforge.net/projects/ddshow/?source=directory
不知道你根据什么来说的
前提是,你开发时还是要注册一下你的解码器的,这样取得解码器的 class id 比较容易,然后带上这个解码器.ax, 运行时用下面这段代码载入后 ,FitlerGraph.AddFilter 进去,然后再用 FilterGraph.RenderFile 或 Render(Pin) ,FilterGraph 会首选你已加入的 Filter, 或者,你自已全部搞定 Connectfunction TFilterProp.CreateFilterFromFile: IBaseFilter;
var
SaveCurrDir: string;
DllGetClassObject: TDllGetClassObject;
ClassFactory: IClassFactory;
begin
if Length(FFileName) = 0 then Exit;
if IsEqualGUID(FClassGUID, GUID_NULL) then Exit; SaveCurrDir := GetCurrentDir;
try
SetCurrentDir(ExtractFilePath(FFileName)); FHLib := LoadLibrary(PChar(FFileName));
if FHLib = 0 then Exit; DllGetClassObject := GetProcAddress(FHLib, 'DllGetClassObject');
if not Assigned(DllGetClassObject) then
begin
FreeLibrary(FHlib);
FHlib := 0;
Exit;
end; DllGetClassObject(FClassGUID, IClassFactory, ClassFactory);
if not Assigned(ClassFactory) then
begin
FreeLibrary(FHlib);
FHlib := 0;
Exit;
end; ClassFactory.CreateInstance(nil, IBaseFilter, Result);
if not Assigned(Result) then
begin
FreeLibrary(FHlib);
FHlib := 0;
end;
finally
SetCurrentDir(SaveCurrDir);
end;
end;上面代码来至于 http://sourceforge.net/projects/ddshow/?source=directory