大家救急啊!~~~一个关于连续播放wav 的问题!~~~~~(30分)

  • 主题发起人 主题发起人 mike1031
  • 开始时间 开始时间
M

mike1031

Unregistered / Unconfirmed
GUEST, unregistred user!
我要连续播放wav文件,用循环在字符串中取字匹配wav文件名,用mediaplayer的,可是每次都只放最后一个声音,原因是刚放声音循环又取得下一个文件名,第一个声音还没有放就放下一个拉!我在循环前加判断也不行,大家帮我看看!谢谢!分不够再加!~~部分原码如下:

procedure TForm1.Button1Click(Sender: TObject);
var h,s,a:string;
sStr:string;
x,i:integer;
bChina:Boolean;
procedure Sing(sStr:String);
//产生声音
var sWav:String;
begin

sWav:='mus/wav_'+sStr+'.wav';
if sStr='' then
exit;
try
if ((sStr=' ') or (sStr=',') or (sStr='.') or (sStr=';') or (sStr='!')) then

begin

mediaplayer1.Close;
mediaplayer1.FileName:=apppath+'mus/wav_.wav';
mediaplayer1.Open;
mediaplayer1.play;
end //停止一会
else

begin

mediaplayer1.Close;
mediaplayer1.FileName:=apppath+sWav;
mediaplayer1.Open;
mediaplayer1.play;
end;

except
Showmessage('语音库中没有下列文件:wav_'+sStr+'.wav');
end;

end;

begin


a:=combobox3.Text;
i:=strtoint(a);
h:=combobox2.text;
s:=DBEdit1.Text+combobox2.text ;
end;

for x:=0 to ido

begin

sStr:=s;
bChina:=False;
while length(sStr)>0do
//判断文本是否结束
begin

s:='';
if ((Copy(sStr,1,1)='<') or (bChina=True)) and (Copy(sStr,1,1)<>'>') then
//判断标识符
begin

bChina:=True;
if Copy(sStr,1,1)='<' then

sStr:=Copy(sStr,2,length(sStr));
s:=Copy(sStr,1,2);
sStr:=Copy(sStr,3,length(sStr));
end
else
if (Copy(sStr,1,1)='>') or (bChina=False) then
//判断标识符
begin

bChina:=False;
if Copy(sStr,1,1)='>' then

sStr:=Copy(sStr,2,length(sStr));
if Copy(sStr,1,1)<>'<' then

begin

s:=Copy(sStr,1,1);
sStr:=Copy(sStr,2,length(sStr));
end;

end;

Sing(s);
end;

end;

end;




procedure TForm1.FormCreate(Sender: TObject);
begin

Apppath:=ExtractFilepath(Application.ExeName);//获取当前的目录
if apppath[length(apppath)]<>'/' then

apppath:=apppath+'/';
end;


end.
 
播放声音请用sndplaysound函数
 
USES MMSYSTEM;
.............
用sndplaysound或playsound函数都可以
 
那样的话主界面僵死要用多线程的!~~在我这个原码的基础上可以怎么改啊???
 
问题是你没有给时间让mediaplay放完声音呀,
mediaplayer1.Close;
mediaplayer1.FileName:=apppath+'mus/wav_.wav';
MediaPlayer1.Open;
MediaPlayer1.Play;
sleep(100);
不过好像只能放时长相同的WAV,比sleep的时间长的声音会截掉,而是下一个文件的声音去了,我是新手,才学不到一个月,请指教,呵呵!
hnldlhs@163.com有好方法发给我呀
 
用sleep主界面会僵死在那!只有等放完音主界面才会活!用sleep要用多线程
 
那倒是没想过,呵呵,我试试playsound
 
用playsound也要用到多线程呀,一循环放WAV主界面也会死掉,要放完了才行,创个线程放就没事了。
function playsoundx:boolean;
var
I: Integer;
begin

for I := 0 to 10do
// Iterate
begin

sndplaysound('D:/software/Program Files/Tencent/qq/sound/ring.wav',0)
end;

// for
end;


procedure TForm1.Button1Click(Sender: TObject);
var Ehandle:THandle;
begin

Ehandle:=CreateThread(nil,0,@playsoundx,nil,0,ThreadID);
if ThreadID=0 then
begin

//线程启动错误
end;


end;
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
1K
import
I
后退
顶部