如何让directshow 不使用系统的任何解码器? 系统解码器往往与自己调用的解码器不兼容?
像 迅雷看看 APlayer 控件 就没有使用 任何系统的解码器 这是怎么做到的呢? 还是重写了 DirectShow 的 Grahp???

解决方案 »

  1.   

    "像 迅雷看看 APlayer 控件 就没有使用 任何系统的解码器"
    不知道你根据什么来说的
      

  2.   

    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