请教大虾,怎样用Delphi编程合并wav语音文件,例如把“大家.wav"和"早上好.wav"语音文件合并成"大家早上好

  • 主题发起人 主题发起人 afei_20010929
  • 开始时间 开始时间
A

afei_20010929

Unregistered / Unconfirmed
GUEST, unregistred user!
请教大虾,怎样用Delphi编程合并wav语音文件,例如把“大家.wav&quot;和&quot;早上好.wav&quot;语音文件合并成&quot;大家早上好.wav&quot;。 ( 积分: 100 )<br />请教大虾,怎样用Delphi编程合并wav语音文件,例如把“大家.wav&quot;和&quot;早上好.wav&quot;语音文件合并成&quot;大家早上好.wav&quot;。
 
请教大虾,怎样用Delphi编程合并wav语音文件,例如把“大家.wav&quot;和&quot;早上好.wav&quot;语音文件合并成&quot;大家早上好.wav&quot;。
 
dxmylove@yahoo.com.cn,qq:171833017,http://www.websamba.com/dxmylove
联系我,现成代码
 
放第一个再放第二个
 
用do
S 的 Copy 命令:
WinExec('command.com /c copy /b d:/大家.wav + d:/早上好.wav d:/大家早上好.wav', SW_HIDE);
我用这个方法合并过 mp3、wma、mpeg、avi、dat 文件,能连续播放,没有问题;不知道合并 wav 行不行,呵呵。
不行的话把 wav 转换为 avi 肯定没问题。
 
两个接着放音不就行了
 
一个接一个放的话,语音听起来很不连贯,用Copy命令文件从大小来看似乎是连起来了,但实际放出来的却是第一个的语音
一生中最爱:我已经加你了,可惜一直没碰到你
 
如果不是 wav 文件的话可以么?mp3、wma、mpeg、avi、dat 类型文件的文件都可以用 copy。
 
网上找的

procedure LinkWave(waveFiles, NewWaveFile: string);//WaveFiles:原文件串(必须是完整路径);NewWaveFile:生成的文件名
var
Files:TStringList;
n1,n2,n3,n,WaveLen:Integer;
WaveFile,SoureFile:TFileStream;
a1,a2,a3:byte;
//联接WAV声音文件函数。程序源码:周栋梁(snappy)
//调用方法:将所要联接的声音文件的完整路径用“,”号组成字符串。
begin

Files:=TStringList.Create;
Files.CommaText:=WaveFiles;
WaveFile:=TFileStream.Create(NewWaveFile,fmCreate);
SoureFile:=TFileStream.Create(Files.Strings[0],fmOpenRead);
//打开其中一个声音文件
WaveFile.CopyFrom(SoureFile,59);
//读取声音文件头
WaveLen:=0;
//记录声音长度
for n:=0 to Files.Count-1do

begin

SoureFile.Free;
SoureFile:=TFileStream.Create(Files.Strings[n],fmOpenRead);
SoureFile.Position:=54;
SoureFile.read(a1,1);
SoureFile.read(a2,1);
SoureFile.read(a3,1);
WaveLen:=WaveLen+(ord(a3)*65536)+(ord(a2)*256)+ord(a1);
SoureFile.Position:=59;
WaveFile.CopyFrom(SoureFile,SoureFile.Size-60);
end;

WaveFile.Position:=4;
n1:=(WaveFile.Size-8) div 65536;
n2:=(WaveFile.Size-8-n1*65536) div 256;
n3:=WaveFile.Size-8-n1-n2*256;
WaveFile.WriteBuffer(n3,1);
WaveFile.WriteBuffer(n2,1);
WaveFile.WriteBuffer(n1,1);

n1:=WaveLen div 65536;
n2:=(WaveLen-n1*65536) div 256;
n3:=WaveLen-n1-n2*256;
WaveFile.Position:=54;
WaveFile.WriteBuffer(n3,1);
WaveFile.WriteBuffer(n2,1);
WaveFile.WriteBuffer(n1,1);
WaveFile.Position:=46;
WaveFile.WriteBuffer(n3,1);
WaveFile.WriteBuffer(n2,1);
WaveFile.WriteBuffer(n1,1);
Files.Free;
WaveFile.Free;
SoureFile.Free;
end;




调用例子:
procedure TForm1.Button1Click(Sender: TObject);
begin

LinkWave('e:/1.wav,e:/2.wav','e:/ss.wav');
playsound('e:/ss.wav',0,0);//必须在DELPHI中播放,Windows播放器可能不认识生成的声音文件格式
end;
 
可以找一下wav格式编码规则看一下,应该就可以了把
 
唉!要命的是我只能用Wav文件而且不光是在Delphi中使用,你们说的方法我都试过,可惜不行,我也想过找到Wav文件的编码规则来自己编一个函数,竟然找了半天没找到,如果您们手上有的话,请提供一个,小弟不甚感激
 
平常都隐身
 
谢谢各位,我查到了Wav的文件格式,问题已经解决了,没想到其实挺简单的
 
多人接受答案了。
 
后退
顶部