用InfInite pin tee filter,可以同时连接多个DSVideoWindowEx。 
InfInite pin tee filter怎样使用 有没有例子 小弟多谢了

解决方案 »

  1.   

    procedure SetMTVStudy(FilterGraph:TFilterGraph;Handle:hwnd);
    var
    FilterList:TFilterList;
    PinList:TPinList;
    ISRenderFilter:Boolean;
    i,j:integer;
    VideoWindow:IVideoWindow;
    VideoRender,AudioRender:IBaseFilter;
    EnumPin:IEnumPins;
    pin:Ipin;
    frompin,{SInputPin,SPPin,SCPin,}RenderPin,InfInPin,InfOutPin1,InfOutPin2,HQA,HQV:IPin;
    sPinName:string;
    Tee,ColorFilter:IBaseFilter;
    PinInfo:TPinInfo;
    MediaType:TAMMediaType;
    begin
    VideoRender:=nil;
    AudioRender:=nil;
    ISRenderFilter:=false;
    EnumPin:=nil;
    fromPin:=nil;
    Tee:=nil;
    ColorFilter:=nil;RenderPin:=nil;
    InfInPin:=nil;
    InfOutPin1:=nil;
    InfOutPin2:=nil;
    HQA:=nil;
    HQV:=nil;
    pin:=nil;
    ColorFilter:=nil;
    try  FilterList:=TFilterList.Create(FilterGraph as IFilterGraph);
      PinList:=TPinList.Create;
      if FilterList.Count=0 then exit;  for i:=0 to FilterList.Count-1  do
      begin
         try      ISRenderFilter:=true;
        
          PinList.Assign(FilterList.Items[i]);        if PinList.Count=0 then exit;        for j:=0 to PinList.Count-1 do
            begin
              if PinList.PinInfo[j].dir=PINDIR_OUTPUT then
               begin
                ISRenderFilter:=false;
                break;     //含有OUTPIN就用不着再循环了
               end;
            end;        if ISRenderFilter=true then
            begin  //这里的FILTER就是RenderFilter,但J这个变量现在是无效的不可确定的,i变量还是有用的             if SUCCEEDED(FilterList[i].QueryInterface(IID_IVideowindow,VideoWindow)) then     //只有Video Render Filter实现了这个接口
                    begin
                    VideoRender:=FilterList[i];   //这就是VIDEORENDER FILTER
                     Videowindow.put_WindowStyle(WS_CHILD);
                     Videowindow.put_Left(0);
                      Videowindow.put_Top(0);
                     VideoWindow.put_Owner(handle);
                    end
                 else
                    AudioRender:=FilterList[i];   //这就是 AUDIORENDER FILTER
            end;
         finally
            VideoWindow:=nil;     end;
      end;
        FilterGraph.Stop;
      
       if Not Assigned(InfTee2) then
         InfTee2:=(createcomobject(CLSID_InfTee) as IBaseFilter);
       if Not Assigned(ASFStream) then
          ASFStream:=(Createcomobject(CLSID_HQ_ASFStreaming) as IBaseFilter);
       if Not Assigned(InfTee1) then
         InfTee1:=(createcomobject(CLSID_InfTee) as IBaseFilter);       try   //连接视频部分    VideoRender.EnumPins(EnumPin);
        EnumPin.Next(1,RenderPin,nil);
        RenderPin.ConnectedTo(frompin);
        finally
           RenderPin:=nil;
           EnumPin.Reset;
           EnumPin:=nil;
        end;
            frompin.QueryPinInfo(PinInfo);
             PinList.Assign(Pininfo.pFilter);
             for i:=0 to pinlist.Count-1 do
             begin
                IF PinList.PinInfo[i].dir=PINDIR_INPUT then
                  begin
                    RenderPin:=PinList.Items[i];
                    frompin:=nil;
                  end;
             end;
             RenderPin.ConnectedTo(frompin);
        try
        frompin.Disconnect;
       Renderpin.Disconnect; //哈哈,RenderPin虽然是INPUT PIN 但是也必须调用
                              //DISCONNECT才能真正的都断了连接,但是整个断开
                              //操作必须是先通过Out pin 发出的
        (FilterGraph as IGraphBuilder).AddFilter(ASFStream,'HQ ASFStream');
            PinList.Assign(ASFStream);
            for i:=0 to PinList.Count-1 do
            begin
           sPinName:=PinList.PinInfo[i].achName;
           if  AnsiResemblesText(spinname,'Video in') then
              HQV:=PinList.Items[i]
           else
              HQA:=PinList.Items[i];
            end;
       (FilterGraph as IGraphBuilder).AddFilter(InfTee2,'Inf Tee2');   PinList.Assign(InfTee2);   for i:=0 to PinList.Count-1 do
       begin
            if PinList.PinInfo[i].dir=PINDIR_INPUT then
                InfInPin:=PinList.Items[i]
            else
                InfOutPin1:=PinList.Items[i];
       end;    (FilterGraph as IGraphBuilder).Connect(frompin,InfInPin);
       (FilterGraph as IGraphBuilder).Connect(InfOutPin1,RenderPin);   
                  Pinlist.Clear;
            PinList.Update;        for i:=0 to PinList.Count-1 do
            begin
              if SUCCEEDED(PinList.Items[i].ConnectedTo(pin)) then continue;          InfOutPin2:=PinList.Items[i];
            end;    
           (FilterGraph as IGraphBuilder).Connect(InfOutPin2,HQV);
          finally
       HQV:=nil;
       InfInPin:=nil;
       InfOutPin1:=nil;
       InfOutPin2:=nil;
       frompin:=nil;
       RenderPin:=nil;
       pin:=nil;   end;//连接音频部分
        (FilterGraph as IGraphBuilder).AddFilter(InfTee1,'Inf Tee1');
       try
            AudioRender.EnumPins(EnumPin);
            EnumPin.Next(1,Renderpin,nil);
            Renderpin.ConnectedTo(frompin);
            frompin.Disconnect;
            Renderpin.Disconnect;        PinList.Assign(InfTee1);
            for i:=0 to PinList.Count-1 do   //Info Tee 实际含有一个输入Pin和两个
                                            //输出Pin
            begin
             if PinList.PinInfo[i].dir=PINDIR_INPUT then
                InfInPin:=PinList.Items[i]
             else
                begin                  InfOutPin1:=PinList.Items[i];            end;
            end;      (FilterGraph as IGraphBuilder).Connect(frompin,InfInPin);
          
        (FilterGraph as IGraphBuilder).Connect(InfOutPin1,RenderPin);       PinList.Clear;
            PinList.Update;           for i:=0 to PinList.Count-1 do
            begin
               if PinList.PinInfo[i].dir=PINDIR_INPUT then Continue;           if SUCCEEDED(PinList.Items[i].ConnectedTo(pin)) then Continue;
            
                  InfOutPin2:=PinList.Items[i];        end;         (FilterGraph as IGraphBuilder).Connect(InfOutPin2, HQA);   finally
            pin:=nil;
            HQA:=nil;
            frompin:=nil;
            Renderpin:=nil;
            Enumpin.Reset;
            Enumpin:=nil;
            InfInPin:=nil;
            InfOutPin1:=nil;
            InfOutPin2:=nil; 
       end;
      try       FilterGraph.Play;
       
    except
         FilterGraph.Stop;
       
       try
       //需要得到视频连接段       VideoRender.EnumPins(enumpin);
           enumpin.Next(1,Renderpin,nil);
          Renderpin.ConnectedTo(pin);
          pin.QueryPinInfo(pininfo);
          ColorFilter:=pininfo.pFilter;
          pin.ConnectionMediaType(MediaType);
          pin.Disconnect;
          Renderpin.Disconnect;
          pin:=nil;      PinList.assign(ColorFilter);
          for i:=0 to pinlist.Count-1 do
          begin
            if pinlist.PinInfo[i].dir=PINDIR_INPUT then
                begin
                  pin:=pinlist.Items[i];
                  break;
                end;
          end;      if Failed(pin.ConnectedTo(InfOutpin1)) then exit;
      
          InfOutpin1.QueryPinInfo(pininfo);
          Tee:=pininfo.pFilter;      InfOutpin1.Disconnect;
          pin.Disconnect;      pin:=nil;
          InfOutPin1:=nil;      (FilterGraph as IGraphbuilder).RemoveFilter(ColorFilter);
          ColorFilter:=nil;
          pinList.Assign(Tee);      for i:=0 to PinList.Count-1 do
          begin
              if PinList.PinInfo[i].dir=PINDIR_OUTPUT then
                  begin
                      if Failed(PinList.Items[i].ConnectedTo(pin)) then
                      begin
                      InfOutpin1:=PinList.Items[i];
                      break;
                      end;
                      Pin:=nil;
                  end;      end;
          Pin:=nil;
          (FilterGraph as IGraphbuilder).ConnectDirect(InfOutPin1,RenderPin,@MediaType);
          try
          FilterGraph.Play;
         except
           Messagebox(0,'error','',0);
        end;   finally
         EnumPin.Reset;
         EnumPin:=nil;
         frompin:=nil;
         Tee:=nil;
         Renderpin:=nil;
         pin:=nil;
         InfOutpin1:=nil;     ColorFilter:=nil;
       end;  end;finally
      
        FilterList.Free;
        PinList.Free;    VideoRender:=nil;
        AudioRender:=nil;
    end;end;自己看一下吧,我现在要回学校了,要坐公交车,麻烦……
      

  2.   

    请问VC++.net 中怎么应用?楼主是否可以提供一个Infinite Pin Tee Filter的小程序?