找人:CoolSlob,你帮我呀,怎样知道: DSPACK控件播放的文件是否是音频? ( 积分: 10 )

  • 主题发起人 主题发起人 py6530
  • 开始时间 开始时间
P

py6530

Unregistered / Unconfirmed
GUEST, unregistred user!
用FilterGraph播放文件时,我怎样才能知道它播放的是声音文件还是带有图像的?如有图像,才可以为VideoWindow指定FilterGraph属性。
你教我:
枚举Graph链上的Filter,找到Renderer Filter,
看看这个Renderer Fileer Input Pin的媒体属性,再判断是Video还是Audio.
可是:怎样枚举Graph链上的Filter,找到Renderer Filter?
给个代码吧.
 
用FilterGraph播放文件时,我怎样才能知道它播放的是声音文件还是带有图像的?如有图像,才可以为VideoWindow指定FilterGraph属性。
你教我:
枚举Graph链上的Filter,找到Renderer Filter,
看看这个Renderer Fileer Input Pin的媒体属性,再判断是Video还是Audio.
可是:怎样枚举Graph链上的Filter,找到Renderer Filter?
给个代码吧.
 
才10分, 没诚意
 
dspack中有一个类
TFilterList可以列举filter

FilterList:= TFilterList.Create(FilterGraph);
for i:=0 to FilterList.Count-1do

begin

Filter:= FilterList;
// Filter name 是否包含 "Render"
// Filter.QueryInterface( IVideoWindow ), 如果支持则是Video Render
// 否则是音频Render

//
...
end;
 
zhongs:
你说的也够明白了,可我还是解不透,
单这句:FilterList:= TFilterList.Create(FilterGraph);
编译时也出错:
[Error] main.pas(175): There is no overloaded version of 'Create' that can be called with these arguments
再有一句:Filter:= FilterList;

这Filte 是什么类?(你没定义,是TFilter吗)

再加你50分,给个完整些的代码,好吗
 
还有,怎样在VideoWindow上输出文字呀?(透明文字背景)
 
var
pFG: IFilterGraph;
Filter: IBaseFilter;
Filters: TFilterList;
I: integer;
Name: WideString;

....

// FG is TFilterGraph
FG.RenderFile(FileName);
...

pFG:= FG as IFilterGraph;


// Find Video Render Filter
Filters:= TFilterList.Create(pFG);
for I:= 0 to Filters.Count-1do

begin

Filter:= Filters.Items;
Name:= Filters.FilterInfo.achName;
Memo1.Lines.Add(name);
if Pos('Renderer', Name) > 0 then

begin

....
end;

end;
 
zhongs :

难道真的有这么难? 仍然不行 你帮我查查.
第一次播放,出现两个视频窗口,再连续播放,出错!

还有:如何在 VideoWindow 控件上叠加上 文字?

我将检测播放的文件是否带有视频,写为一个函数:(播放前检测)
function TFormPlayWin.getisGrampFile(f: string): boolean;
var
pFG: IFilterGraph;
Filter: IBaseFilter;
Filters: TFilterList;
I: integer;
Name: WideString;
begin

result:=false;
// FG is TFilterGraph
if FilterGraph.Active then
FilterGraph.ClearGraph ;
if not FilterGraph.Active then
FilterGraph.Active := true;

FilterGraph.RenderFile(F);
pFG:= FilterGraph as IFilterGraph;
// Find Video Render Filter
Filters:= TFilterList.Create(pFG);
for I:= 0 to Filters.Count-1do

begin

Filter:= Filters.Items;
Name:= Filters.FilterInfo.achName;
// Memo1.Lines.Add(name);
if Pos('Renderer', Name) > 0 then

begin

result:=true;
exit;
end;

end

end;


播放的代码如下:
var f:string;
begin

if OpenDialog.Execute then

begin

f:=OpenDialog.FileName ;
if getisGrampFile(f) then
//是否有视频
VideoWindow.FilterGraph :=FilterGraph
else

VideoWindow.FilterGraph :=nil;
FilterGraph.RenderFile(OpenDialog.FileName);
// VideoWindow.PopupMenu := PopupMenu;
SoundLevel.Position := FilterGraph.Volume;
// if is audio then

// VideoWindow.FilterGraph :=nil;
FilterGraph.Play;
end;

end;
 
我的QQ:328980163 加我指点更好
 
还发现:
如果是连续播放VCD,则出错,但如果先放一首MP3,再放VCD,如此重复,均不会出错,好像是在播放VCD时,还有什么未完全释放?
 
发分了,可惜,还不知道怎样在图像上叠加文字,
还有,怎样加分?
 
不好意思。
现在才看到这贴。

平时很少上DFW。[:(]
 
后退
顶部