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;
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
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;自己看一下吧,我现在要回学校了,要坐公交车,麻烦……