说三道四技术文摘-感悟人生的经典句子
说三道四 > 文档快照

使用DELPHI实现文本文件显示和声音同步播放

HTML文档下载 WORD文档下载 PDF文档下载
使用DELPHI实现文本文件显示和声音同步播放

---- 在一些语言教学软件中,经常使用文本显示和声音同步播放,我们可以用DEL PHI实现之。

---- 一、材料的制作

---- 首先,我们选择几篇文章,这里我们选择马丁路德金、林肯和里根的演说,每一篇文章分为若干句,在制作声音文件时,记下每个句子的开始时间和结束时间,然后将其记到一个数据表中,这个表有如下字段:NO、TEXT、STARTTIME

分别表示每句序号、内容、开始时间。

---- 二、 界面的制作

---- 在DELPHI中创建一个新工程,在FORM中放入多媒体控件,RTF编辑器,命令按钮,单选分组框,数据表,时钟和标签,如图所示

---- 三、各个控件的属性

---- 1、 多媒体控件的AutoEnable和AutoOpen特性设置为False

VisibleButtons特性设置Record、Eject、Step为不可见。

---- 2、 Table控件的DatabaseName设为存放表的目录,我们将应用程序、声音文件和表存放在myprog目录,因此这里将DatabaseName设为c:\myprog,将TableName设为默认的播放文件对应的数据表的名字,这里设为ex1.dbf。

---- 3、 Radiogroup控件的Caption设为 ‘请选择播放内容’,Itmes特性中加上三行:马丁路德金,林肯,里根。

---- 4、 Richedit控件的Lines特性加上‘演讲内容。

---- 四、代码的编写

---- 1、变量声明

var isend:Boolean;

CurrentButton:TMPBtnType;

CurrentPlay

CurrentDisp:longint;

---- 其中isend表示播放是否已经到了末尾,CurrentButton表示当前MediaPlayer元件中按下了哪个按钮,CurrentPlay

CurrentDisp表示当前播放记录及当前显示记录。

---- 2、在FormCreate事件中做一些必要的准备工作,其代码如下:

procedure TForm1.FormCreate(Sender: TObject);

begin

Table1.TableName:='ex1.dbf'; Table1.Open;

MediaPlayer1.FileName:='ex1.wav';MediaPlayer1.Open;

MediaPlayer1.TimeFormat:=tfMilliseconds;

isend:=False;

CurrentButton:=btStop;

CurrentDisp:=1;

CurrentPlay:=1;

end;

---- 3、在单选分组框中加进如下代码:

procedure TForm1.RadioGroup1Click(Sender: TObject);

begin

MediaPlayer1.Close; Table1.Close;

case radiogroup1.ItemIndex of

0:begin MediaPlayer1.FileName:='ex1.wav';

Table1.TableName:='ex1.dbf';end;

1:begin MediaPlayer1.FileName:='ex2.wav';

Table1.TableName:='ex2.dbf';end;

2:begin MediaPlayer1.FileName:='ex3.wav';

Table1.TableName:='ex3.dbf'; end;

end;

Table1.Open; MediaPlayer1.Open;

end;

---- 4、为了适当修改MediaPlayer元件中各个按钮的功能,需要编写MediaPlayer元件的click事件的代码,主要是修改“快进”及“快退”的功能,使其每次移动一句,且移动后直接播放,而不用再按“播放”按钮。为达到这个功能,在过程的一开始,设置DoDefault参数为False

表示不执行默认的动作,在过程的中间部分,加上必要的处理,在过程的结束处,写上根据按下的按钮执行相应功能语句。

procedure TForm1.MediaPlayer1Click(Sender: TObject;

Button: TMPBtnType; var DoDefault: Boolean);

begin

DoDefault:=False;

with MediaPlayer1 do

begin

case Button of

btPlay : begin

if isend=true then

begin

Table1.first; Position:=start;

CurrentPlay:=1; CurrentDisp:=1;

isend:=False;

RichEdit1.lines.clear; RichEdit1.lines.add

('演讲内容');

end;

CurrentButton:=btPlay;

end;

btStop : begin CurrentButton:=btStop;

isend:=true;

end;

btpause: if CurrentButton=btPlay then

CurrentButton:=btpause

else if CurrentButton=btpause then

CurrentButton:=btPlay;

btPrev: begin CurrentButton:=btPrev;

Table1.Prior;

Position:=Table1.fieldvalues

['STARTTIME'];

CurrentButton:=btPlay;

end;

btBack: begin CurrentButton:=btBack;

Table1.first; Position:=start;

CurrentPlay:=1;

CurrentDisp:=1;

RichEdit1.lines.clear;

RichEdit1.lines.add

('演讲内容');

CurrentButton:=btPlay;

end;

btNext: begin CurrentButton:=btNext;

Table1.Next;

Position:=Table1.fieldvalues

['STARTTIME'];

CurrentButton:=btPlay;

end;

end;

case CurrentButton of

btPlay: Play;

btpause:pause;

btStop:Stop;

end;

end;

end;

---- 5、为了能同步显示文本,需要编写定时器OnTime事件的代码,如果当前播放的时间超过了当前记录的开始时间,则设置CurrentPlay为当前记录号,如果CurrentPlay超过了CurrentDisp

则显示当前记录。

procedure TForm1.Timer1Timer(Sender: TObject);

begin

with MediaPlayer1 do

begin

if CurrentButton=btPlay then

begin

if not Table1.eof and (Position

>Table1.FieldValues['STARTTIME'])

then

begin CurrentPlay:=Table1.recno;

if CurrentPlay >=CurrentDisp then

begin

RichEdit1.Lines.add(Table1.fieldvalues['TEXT']);

CurrentDisp:=CurrentDisp+1;

end;

Table1.Next;

end;

if Table1.eof then

begin

CurrentButton:=btStop;

isend:=true;

end;

end;

end;

end;

---- 注:在MediaPlayer的click事件中,使用了btPrev

btNext等常量,为了能够通过编译,在uses子句中需将ComCtrls放在mPlayer之前,以免引起冲突。

CMDN Club 23期:开放平台和O2O移动产品开发 花旗调低Apple股票评级 不信iPhone5会卖得好 2012年Linux Journal读者选择奖结果公布 百度云SiteApp:三步轻松创建移动网站 Twitter跨数据中心图片存储系统Blobstore解析 请大家帮忙了,请看这个错误的原因!! 如何在ListView隔行显示不同的颜色? 互斥信号量 求助! 我加了一个qq群组,可惜人气不旺!欢迎高手加盟,共同解决疑难杂征! C++中位包装的类成员是怎么用的啊? 关于print 关于下载 一道初中智力题,做做看:) 请问 续流二极管短路有什么后果 某乡组织用20辆车运a、b、c、三种苹果,42吨往 The little girl is so afr What ___she little girl o 甲乙丙三个粮仓共存粮460吨.甲仓与乙仓的比是5: 一吨煤共重2吨,用去4/1吨,正好用去8/1,这里 一吨煤共重2吨,用去4/1吨,正好用去8/1,这里 关于蝉的诗句 找关于 蝉 的古诗只要是诗就行.说蝉的.除了《咏蝉 俄罗斯否认疑借助俄礼物窃听G20代表华为称澳政府针对国家宽带网项目未做最国际新闻早报:以色列释放第二批26名迪拜将孔明灯列为危险品:致火灾商铺将中国承建高速路给斯里兰卡带来的社会和湖南:“禁毒志愿者三湘行”传递禁毒理阿妹瘦了才是王道!天河区小学生篮球赛结束性教育别走入道德说教的误区中办出台文件要求从律师、法学专家中公重生之凤霸天下贵女难求九转灵葫都市剩者为王秀色农家汤山温泉旅游地下倒石林旅游南山牧场旅游姊妹湖旅游康定情歌景区旅游
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘