本章要点:
多媒体介绍
TAnimate 组件的属性,事件和方法介绍
TMediaplay组件的属性,事件和方法介绍
综合实例第 8章 多媒体应用编程
8.1 多媒体介绍随着多媒体技术的不断发展,多媒体的使用范围越来越广泛。当你在使用 Windows Media Play时,有没有想过拥有一个自己编写的媒体播放器呢?也许,你会觉得这太复杂,太专业。其实如果你用 Delphi 7.0,那么一切都来得那么简单和容易。 本章主要是讲解如何用 Delphi 7.0来进行多媒体编程。
8.1.1 多媒体定义人类在信息交流中要使用各种媒体 。 媒体有两种含义:存储信息的物理实体,如磁带,磁盘,光盘,打印纸等;信息的表现形式 (表示 )和传播的载体,如文字,声音,图形和图像等 。 计算机媒体是指后者,
也就是说媒体是指信息表示和传播的载体 。 在计算机中使用五种媒体:
感觉媒体,表示媒体,表现媒体,存储媒体,传输媒体 。
8.1.2 多媒体程序设计利用 Delphi 7.0提供的多媒体组件,可实现多媒体程序的设计 。 对一个
Delphi 7.0程序来说,增加声音和动画可提高整个系统的可视性,但也会大大增加系统的开销 。 因此,在程序设计时必须考虑下面几个问题 。
1,时间考虑系统所要求的实时性在加入多媒体之后是否还能满足要求。
2,存储空间音频视频质量越高,所用的存储量就越大。因此要考虑系统在加入多媒体之后,应用程序是否还有足够的空间运行。一般来说程序员要考虑 4倍所讨论对象的存储空间。
3,速度就是说要考虑硬件的问题,如系统主板,CD-ROM的速度是不是能够达到程序要求。
4,显示器要获得色彩逼真的效果,就要将显示器至少设置为 1024× 768和真彩色。这就要求用好的显示器和显卡。
8.1.3 Windows操作系统对多媒体的支持
Delphi 7.0 提供了一个控制多个图片连续播放的动画组件 Tanimate,如图 8-1所示。 Tanimate组件最主要的功能是作为特性动画的提示。此组件在
Win32页中可找到。
多媒体计算机是在传统计算机中增加了音频设备和 CD-ROM设备。在
Windows95/98/2000和 Windows NT中提供了多媒体控制接口 MCI,它包含了一系列的函数调用。
Delphi 7.0中提供了制作多媒体的组件,这些组件将命令及其复杂的函数调用进行了封装,使得创建多媒体应用程序的工作大大地简化了。
8.2 动画组件图 8-1 Tanimate组件
8.2.1 Tanimate 组件的主要属性 (1)
注意,这些 Avi文件都是包含在 Windows系统资源里面,如果你的系统中没有这些文件,那么就不能够调用。
Active属性,设置是否播放动画。取值为 True表示播放动画,取值为 False
则表示没有播放。
Autosize属性,设置自动更改 Tanimate组件的大小。取值为 True或者 False。
Center属性,设置播放的动画是否在 Tanimate 组件的中央。取值为 True
表示播放的动画在 Tanimate组件的中央,取值为 False表示播放的动画在
Tanimate组件的左上部分。
Filename属性,指明要播放的 Avi文件所在的路径。如果 Filename指定了文件的话,那么 Commonavi会自动指定为 AviNone。
Commonavi属性:设定播放的 Avi动画的类型。它有多种选择,详见本教程 P131页。
StartFrame属性,设置播放的 Avi文件从哪一帧开始,如果设置为 1,
表示从第一帧开始,默认值为 1。
8.2.1 Tanimate 组件的主要属性 (2)
StopFrame属性,设置播放的 Avi文件在哪一帧结束,系统会自动地获取 Avi文件中帧的总帧数。你也可以设置一个数值来指定结束的帧数,如果你设置的结束帧数小于 Avi文件中的总帧数的话,那么 Avi文件就会提前结束,如果你设置的结束帧数大于 Avi文件中的总帧数的话,系统还是按照原来的 Avi文件中的帧数来播放。
Repetitons属性,设置重复播放 Avi文件的次数。默认值为 0,表示无限制地播放。
Timer属性,设定使用计时器显示信息。当 Timer属性设为 True时,
系统以同步式相应计时器显示信息。这对于动画显示和其他动作同步显示非常有用。
Transparent属性,设置播放的背景是否为透明的。默认值为 True,
表示播放背景是透明的。
8.2.2 Tanimate 组件的主要方法
1,Create 方法
Create方法用于创建和初始化动画控制,它常用在实时状态下。当在设计阶段放置一个 Tanimate 组件在窗体上的时候,该方法会被自动调用。
2,Play 方法
Play方法是用来播放 Avi文件。它的调用方式为:
procedure Play(FromFrame,ToFrame,Word; Count,Integer);
其中 FromFrame表示播放 Avi文件开始的帧,ToFrame表示播放 Avi文件结束的帧,count表示播放 Avi文件的次数。 FromFrame要小于 ToFrame的值。
3,Seek方法
Seek方法用来显示 Avi文件中指定的某一帧。它的调用方式为:
procedure Seek(Frame,SmallInt);
其中 frame表示指定的帧。
4,Reset 方法
Reset 方法用来清除原来设定的 StartFrame和 StopFrame的值,恢复成初始值。
5,Stop方法
Stop方法用来终止 Avi文件的播放操作。
8.2.3 Tanimate组件的主要事件
1,OnStop 事件
OnStop事件主要是当 Avi文件显示完以后被激活。它的调用方式为:
property OnStop,TNotifyEvent;
2,OnClose事件
OnClose事件是当 Avi文件被关闭以后所激活的事件。它和 OnStop事件的区别在于 OnClose事件是在关闭掉了动画组件以后所产生的事件,而
OnStop事件是动画结束而没有关闭动画组件的时候所产生的事件。它的调用方式为:
property OnClose,TNotifyEvent;
3,Onstart事件
OnStart事件是在 Tanimate 组件开始播放图片时被激活的事件。它的调用方式为:
property OnStant,TNotifyEvent;
4,OnOpen事件
OnOpen事件是在当动画组件打开以后被激活的事件。它的调用方式为:
property OnOpen,TNotifyEvent;
8.2.4 编程实例 (1)
1,主要实现的功能
单击开始按钮,就可以播放 Avi动画。
单击结束按钮,就可中断动画的播放。
2,设置对象的属性如表 8-2所示
【 例 8-1】 这个程序主要是说明 Tanimate的简单应用 。 界面如图 8-2所示 。
图 8-2 动画组件演示
3,编写的代码
procedure TForm1.Button1Click(Sender,TObject);
begin
animate1.Active:=true;//开始播放 Avi文件
end;
8.2.4 编程实例 (2)
procedure TForm1.Button2Click(Sender,TObject);
begin
animate1.Stop;//结束 Avi文件的播放
end;
对象 属性 属性值 说明
Form1 caption 动画组件演示
Animate1
active False 不用自动播放
Center True 在 Animate中央播放
Commonavi aviRecycleFile 播放的 Avi文件
Button1 caption 开始
Button2 caption 结束表 8-2 各组件属性设置
8.2.4 编程实例 (3)
添加一个 Tbutton控件和一个 Tedit控件,输入相关代码:
procedure TForm1.Button3Click(Sender,TObject);
begin
animate1.Seek(strtoint(edit1.text));
//strtoint(edit1.text)是将 edit1.text的字符转换为数值型。
end;
【 例 8-2】 对 【 例 8-1】 的改进,添加搜索播放帧的功能 。 界面如图 8-3所示 。
图 8-3 动画组件演示
【 例 8-3】 这个例子是对上面两个例子的进一步改进 。 主界面如图 8-4所示 。
1,添加一个 Tlistbox组件设置它的 items属性,在 items属性中分别输入 aviNone,aviCopyFile,
aviCopyFiles,aviDeleteFile,aviEmptyRecycle,aviFindComputer,
aviFindFile,aviFindFolder,aviRecycleFile。
2,添加一个 Tlabel组件
8.2.4 编程实例 (4)
3,主要的代码
{在 Form1.create事件中设置程序的初始值}
图 8-4 动画组件演示
procedure TForm1.FormCreate(Sender,TObject);
begin
Animate1.Active,=false;
//表示一开始不播放 Avi文件。
button1.Enabled:=true;
button2.Enabled:=false;
//因为还没有播放 Avi文件,所以这个”结束”按钮也不可以用
end;
{单击”开始”按钮,使得动画可以播放,同时”结束”按钮可以用、”开始”按钮不可以用 }
procedure TForm1.Button1Click(Sender,TObject);
begin
animate1.Active:=true;//开始播放 avi文件
button1.Enabled:=false;
button2.Enabled:=true;
end;
8.2.4 编程实例 (5)
{单击”结束”按钮,使得动画结束,同时”开始”按钮可以用、”结束”按钮不可以用 }
procedure TForm1.Button2Click(Sender,TObject);
begin
animate1.Stop;
button1.Enabled:=true;
button2.Enabled:=false;
end;
{”搜索”按钮的单击事件中的代码 }
procedure TForm1.Button3Click(Sender,TObject);
begin
animate1.Seek(strtoint(edit1.text));
end;
{单击 listbox1可以选择 avi动画 }
procedure TForm1.ListBox1Click(Sender,TObject);
begin
animate1.Active,= False ;
button1.Enabled:=true;
button2.Enabled:=false;
8.2.4 编程实例 (6)
With Animate1 do
begin
If ListBox1.ItemIndex = 0 then
Animate1.FileName,=
'D:\ProgramFiles\Borland\Delphi7\Demos\CoolStuf\cool.avi' ;
//这里的路径与 Delphi 7.0 的安装路径有关。
case ListBox1.ItemIndex of
0,CommonAVI,= aviNone ;
//这里指定 avinone就会调用 Animate.Filename中设置的文件。
1,CommonAVI,= aviCopyFile ;
2,CommonAVI,= aviCopyFiles ;
3,CommonAVI,= aviDeleteFile ;
4,CommonAVI,= aviEmptyRecycle ;
5,CommonAVI,= aviFindComputer ;
6,CommonAVI,= aviFindFile ;
7,CommonAVI,= aviFindFolder ;
8,CommonAVI,= aviDeleteFile ;
end;
8.2.4 编程实例 (7)
{双击 listbox1就可以播放 Avi文件}
procedure TForm1.ListBox1DblClick(Sender,TObject);
begin
animate1.Active:=true;
button1.Enabled:=false;
button2.Enabled:=true;
end;
{“搜索”按钮}
procedure TForm1.Button3Click(Sender,TObject);
begin
animate1.Seek(strtoint(edit1.text));
end;
{“停止”按钮}
procedure TForm1.Button2Click(Sender,TObject);
begin
animate1.Stop;
button1.Enabled:=true;
button2.Enabled:=false;
end;
8.3 多媒体播放器组件
Delphi 7.0有一个很好的播放视频的组件 —— TMediaplay,如图 8-5
所示 。 TMediaplay使用起来相当容易 。 此组件在 System页中可找到 。
TMediaplay 组件共有 9个按钮,就好像普通的录音机的按钮一样 。 从左到右的按钮的功能如表 8-3所示 详见本教程 P137页 。
图 8-5 TMediaplay组件
8.3.1 TMediaplay 组件的主要属性
AutoRewind属性,ColoreButtons属性,DeviceType属性,Display属性、
Enable属性,EnabledButtons属性,Shareable属性,Visible属性、
VisibleButtons属性,Mode属性、
8.3.2 TMediaplayer组件的主要方法
Open方法:开启多媒体播放设备。
Close方法:关闭多媒体播放设备。
Play方法:播放多媒体。
Stop方法:停止播放多媒体。
Pause方法:暂停播放多媒体。
Next方法:播放下一首。
Previous方法:播放上一首。
Step方法:前进 0.1秒长度。
Back方法:后退 0.1秒长度。
Rewind方法:回复到起始播放点。
Eject方法:强制性打开多媒体设备,并释放媒体。
Save方法:保存已经打开的媒体的信息。
8.3.3 TMediaplayer组件的主要事件
TMediaplayer组件常用的事件有如下 5种 。
1,Onclick事件当 Mediaplayer组件处于工作状态时,使用者同时按下空格键及释放一个
MediaPlayer的一个控制按钮的时候,Onclick事件被激活。简单地说就是动作按钮被单击时产生的事件。
2,Onnotify事件当多媒体控制方法(如前面所讲的 open,save,back,close,eject、
Pause等方法)完成以后,就会产生 Onnotify事件。设计阶段应将 Notify属性设置为 True,以便系统可以调用 Onnotify事件。在调用了 Onnotfy事件以后,
Notify属性必须重新设置为 True,以便系统再次来调用 Onnotify事件。简单地说,Onnotify事件就是在动作完成以后的反应。
3,Onpostclick事件当 Onclick事件完成以后,Onpostclick事件就会自动产生。
4,Onenter事件当一个对象被激活(获得焦点)的时候所产生的事件。
5,Onexit事件当一个对象失去焦点的时候所产生的事件。
8.3.4 编程实例( 1)
【 例 8-4】 媒体播放 。 主要的界面如图 8-6所示 。
图 8-6 媒体播放(一)
运行以后的界面如图 8-7所示。
图 8-7 播放时的界面
对象属性设置如表 8-7所示。
主要程序代码如下:
{对“播放”按钮进行设置,单击“播放”按钮就要开始播放 Avi文件}
procedure TForm1.Button1Click(Sender,TObject);
begin
mediaplayer1.Notify:=true;//在设计阶段要将 Notify的值设置为 True。
mediaplayer1.Play;//开始播放 Avi文件。
end;
procedure TForm1.Button3Click(Sender,TObject);
Begin
mediaplayer1.Stop;//停止 Avi文件的播放。
8.3.4 编程实例( 2)
end;
procedure TForm1.Button2Click(Sender,TObject);
begin
mediaplayer1.Pause;//暂停 Avi文件的播放。
end;
{当多媒体控制方法结束以后,就会产生 Onnotify事件}
procedure TForm1.MediaPlayer1Notify(Sender,TObject);
begin
case mediaplayer1.NotifyValue of //对 Notifyvalue的值进行判断
Nvsuccessful:messagedlg('播放成功 ',mtinformation,[mbok],0);
//控制命令成功。这样当播放完多媒体文件以后,就会弹出一个对话框,告诉
“播放成功”。
nvSuperseded:messagedlg('命令被代替 ',mtinformation,[mbok],0);
//控制命令被其他命令所代替。
Nvaborted:messagedlg('命令被终止 ',mtinformation,[mbok],0);
//控制命令被用户所终止。
nvFailure:messagedlg('命令失败 ',mtinformation,[mbok],0);//控制命令失败。
end; end;
8.3.4 编程实例( 4)
4,使用的组件及其说明见表 8-8所示,详见本教程 P143页
5,Mediplayerl的属性与说明 见表 8-9详见本教程
P143页
6,OpenDialog1的主要属性设置
1,主界面如图 8-8所示
2,运行时还将产生如图 8-9所示界面
3,增加的主要功能
可以自由选择要播放的文件。
可以用来播放多种多媒体文件,包括单独的声音或者视频文件。如果播放的是视频文件的话,会弹出 Windows视窗来播放文件。
可以显示出播放进度。
(图 8-8 媒体播放 (二 ) )
图 8-9 运行界面图 8-10 Filter属性的设置
【 例 8-5】 本例子是在 【 例 8-4】 基础上进一步优化的程序。
8.3.4 编程实例( 5)
7,Label1的属性与说明见表 8-10
OpenDialog1决定打开的文件类型,主要是来设置它的 Filter属性。
Filter属性设置如图 8-10所示。详见本教程 P143页
8,Guage1的属性及说明见表 8-11,详见本教程 P143页。
9,Timer1的主要属性
Timer1主要是用来定时更新多媒体组件的播放状态,只要将它的
Enable属性设置为 False,将 Interval属性设置为 100。
10,主要程序代码
procedure TForm1.MediaPlayer1Click(Sender,TObject; Button,
TMPBtnType;
var DoDefault,Boolean);
begin
case Button of
btPlay,//播放按钮
begin
mediaplayer1.Notify:=true;
Timer1.Enabled,= True ;
end;
8.3.4 编程实例( 6)
btPause,Timer1.Enabled,= False ;//暂停按钮
btStop://停止按钮
begin
Timer1.Enabled,= False ;
mediaplayer1.Stop;
mediaplayer1.Position:=0;//使得 Gauge1的进度条回到 0的地方
label1.Caption:='单击打开按钮选择文件 ';
end;
end;
Guage1.MaxValue,= MediaPlayer1.Length ;
Guage1.Progress,= MediaPlayer1.Position ;//来显示播放进度
end;
procedure TForm1.Button1Click(Sender,TObject);
begin
OpenDialog1.Execute ;//打开“打开”对话框
MediaPlayer1.FileName,= OpenDialog1.FileName ;
Label1.Caption,= OpenDialog1.FileName ;
if mediaplayer1.FileName='' then
8.3.4 编程实例( 7)
{注意如果这里不进行判断的话,当打开对话框但不进行选择的时候,程序就会出错,当然了,也可以用 openDialog1.execute属性来进行判断。 }
showmessage('没有打开文件 ')
else
MediaPlayer1.Open ;
{MediaPlayer1.Play ;注意这一句不能写上去,因为如果写上的话,打开播放文件,不按,Play”按钮它就直接播放了。 }
end;
procedure TForm1.Timer1Timer(Sender,TObject);
begin
Timer1.Interval,= 100 ;
Guage1.MaxValue,= MediaPlayer1.Length ;
Guage1.Progress,= MediaPlayer1.Position ;
if MediaPlayer1.Mode = mpStopped then
Timer1.Enabled,= False ;
end;
procedure TForm1.MediaPlayer1Notify(Sender,TObject);
begin
case mediaplayer1.NotifyValue of //对 Notifyvalue的值进行判断
Nvsuccessful:messagedlg('播放成功 ',mtinformation,[mbok],0);
//控制命令成功。这样当播放完多媒体文件以后,就会弹出一个对话框,告诉 "播放成功 "。
nvSuperseded,messagedlg('命令被代替 ',mtinformation,[mbok],0) ;
//控制命令被其他命令所代替。
Nvaborted:messagedlg('命令被终止 ',mtinformation,[mbok],0);
//控制命令被用户所终止。
nvFailure:messagedlg('命令失败 ',mtinformation,[mbok],0);
//控制命令失败。
end;
end;
8.3.4 编程实例( 8)
【 例 8-6】 这个例子主要是将 Tanimate组件和 TMediaplayer组件结合起来应用,用 Tanimate来显示 TMediaplayer的播放区域 。
8.3.4 编程实例( 9)
1,增加的功能
用时间来显示播放的进度。
用 Tanimate来设置播放区域。
2,主界面如图 8-11所示。
图 8-11媒体播放(三)
图 8-12 运行时界面
3,主要属性设置把 form1中的 Bordericons中的 biMaxMize的属性设置为 false(去掉最大化按钮 )。还要将 Mediaplayer1中的 Display属性设置为 Animate1。
4,主要的代码
{ form1中的 Oncreate事件设置 timer.enabled的属性为 false。因为还没有开始播放,timer1不需要有什么动作。}
procedure TForm1.FormCreate(Sender,TObject);
begin
timer1.Enabled:=false;
end;
procedure TForm1.MediaPlayer1Click(Sender,TObject; Button,
TMPBtnType;
var DoDefault,Boolean);
var
Secs,Mins,MSecs,Hours,TempVal,Integer ;
begin
case Button of //用来选择哪个按钮被操作
btPlay,
begin
if label2.Width>animate1.Width then //控制播放界面的大小
form1.Width:=label2.Width+30
else
form1.Width:=animate1.Width+10;
8.3.4 编程实例( 10)
Timer1.Enabled,= True ;
end;
btPause:Timer1.Enabled,= False ;
btStop:Timer1.Enabled,= False ;
end;
MediaPlayer1.TimeFormat,= tfMilliseconds;
//设置多媒体文件的计量单位为毫秒。
{以下部分就是来计算出播放时间的多少}
MSecs,= MediaPlayer1.Position mod 1000 ;
TempVal,= MediaPlayer1.Position div 1000 ;
Secs,= TempVal mod 60 ;
TempVal,= TempVal div 60 ;
Mins,= TempVal mod 60 ;
Hours,= TempVal div 60 ;
{以下部分是表示以,XX:YY:ZZ.AAAA”的形式显示在 label1中}
Label1.Caption,= IntToStr(Hours) + ':' + IntToStr(Mins) ;
Label1.Caption,= Label1.Caption + ':' + IntToStr(Secs) + '.' + 3
IntToStr(MSecs) ;
8.3.4 编程实例( 11)
end;
procedure TForm1.Timer1Timer(Sender,TObject);
var
Secs,Mins,MSecs,Hours,TempVal,Integer ;
begin
MediaPlayer1.TimeFormat,= tfMilliseconds;
MSecs,= MediaPlayer1.Position mod 1000 ;
TempVal,= MediaPlayer1.Position div 1000 ;
Secs,= TempVal mod 60 ;
TempVal,= TempVal div 60 ;
Mins,= TempVal mod 60 ;
Hours,= TempVal div 60 ;
Label1.Caption,= IntToStr(Hours) + ':' + IntToStr(Mins) ;
Label1.Caption,= Label1.Caption + ':' + IntToStr(Secs) + '.' +
IntToStr(MSecs) ;
if MediaPlayer1.Mode = mpStopped then
Timer1.Enabled,= False ;
end;
8.3.4 编程实例( 12)