mediaplayer的三个问题,全部的分了。我预感只有第三个问题有解答。(145分)

  • 主题发起人 主题发起人 ychg
  • 开始时间 开始时间
Y

ychg

Unregistered / Unconfirmed
GUEST, unregistred user!
1、如何判断一个.dat文件是不是vcd文件?
2、有办法在单击一个图象媒体文件(如*.avi *.dat)时生成一个预览吗?既把该文件的第一
个画面静态显示出来,让大家知道这个avi或dat文件的大致内容。
3、指定了一个固定大小的panel1作为 mediaplayer1.display:=panel1,播放DAT或AVI文件
时图象会缩到左上角,我希望能 [red]按比例[/red]缩放,撑满整个panel1,不撑满的地方
居中。举例说明:

条件:
panel1.heigh:=180;
panel1.width:=320,

例一、avi 原始尺寸为 高360,宽400,则播放时在panel中的尺寸是 高180,宽200,并在panel
中左右居中 (缩小并撑满高度例例)

例二、dat 原始尺寸为 高50,宽160,则播放时在panel中的尺寸是 高100,宽320,并在panel
中上下居中(放大并撑满宽度例)
 
1、判断是否open成功就知道了。
 
To ychg:
你说得对,我先答第3个问题:
基本实现原理:
MediaPlayer.DisplayRect:=Panel1.ClientRect;
你还可配合其他方法实现你的要求.
 
1、判断文件的头,每种类型文件的头都是固定和唯一的
2、获取影片的第一侦
3、MediaPlayer1.DisplayRect := Panel1.ClientRect;
 
哦,对了,我忘了,你可以用DSPACK实现你的第1,2个问题,具体的你看DSPACK中的DEMOS.
补充一下:
DEMOS中的PLAYWIN有类型说明.
Grabber &
CallBack 例中说明可获得播放的每一帧.
 
谢谢各位!
1、open后通过是否有异常正是我原先想在没有办法时使用的方法,不过用户每单击一个dat
就要open它,这种方法效率低了一点,我想要专业一点的方法。判断文件的头的方法我搜索
以前的帖子也看到过,但具体的方法,如vcd的dat文件头的具体格式,或具体的代码,能给出来
吗?如这里不方便的话,可mail到ychg@163.com
2、我找空试一下dspack。
3、MediaPlayer.DisplayRect:=Panel1.ClientRect的方法会让播放的文件变形吧?我要的是
不变形的缩放方法,是不是只能手工计算了。
 
好多问题在以下问题里有解答
http://www.delphibbs.com/delphibbs/dispq.asp?lid=1092849

 
TO YCHG: DSPACK也可以解决你的第3个问题.
 
dspack我从来没有用过,能给出一些具体的代码吗?
我慢慢摸索太费时间,我第一次处理多媒体编程,功力有限。
 
嗨, dspack你安装以后有很多 Demo 的代码,你可以试试吧。
现在做一些简要介绍。
窗口上放DSFilterGraph, DSVideoWindow, ListBox1, OpenDialog各一个。
1.
;打开媒体文件并播放
if OpenDialog.Execute then

begin

FilterGraph.ClearGraph;
FilterGraph.FilterGraph2.RenderFile(StringToOleStr(OpenDialog.FileName),nil);
GetFilterList(FilterGraph.FilterGraph2,listbox1.Items);
FilterGraph.QueryInterfaces;
FilterGraph.MediaControl.Run;
end;

;得到媒体文件类型等等信息
procedure TForm1.GetFilterList(graph: IFilterGraph;
list: TStrings);
var EnumFilters: IEnumFilters;
BaseFilter: IBaseFilter;
FilterInfo: TFilterInfo;
begin

list.Clear;
graph.EnumFilters(EnumFilters);
While (EnumFilters.Next(1, BaseFilter, nil)=S_OK)do

begin

BaseFilter.QueryFilterInfo(FilterInfo);
list.Add(FilterInfo.achName);
end;

end;


2.设播放窗口DSVideoWindow.Align:=alClient
DSVideoWindow.Graph:=DSFilterGraph1
可实现第3个问题。

3.放一个FilterSampleGrabber和Image1在窗口上
在FilterSampleGrabber的OnBuffer事件中放上
FilterSampleGrabber.GetBitmap(image1.Picture.Bitmap,Buffer);
可随时得到当前播放的每一帧。
 
补充一下, 在 打开播放文件中的
FilterGraph.FilterGraph2.RenderFile(StringToOleStr(OpenDialog.FileName),nil);
下一行插上
FilterSampleGrabber.SetBMPCompatible(nil,24);

 
多人接受答案了。
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
后退
顶部