请问怎么得到一个WAV文件播放的时间,怎么提高播放速度或音调???(100分)

  • 主题发起人 主题发起人 xzhifei
  • 开始时间 开始时间
X

xzhifei

Unregistered / Unconfirmed
GUEST, unregistred user!
请问怎么得到一个WAV文件播放的时间,怎么提高播放速度或音调??
 
//返回秒数
function ReadWaveTime(FileName: string): Integer;
type
TWaveFileHeader = packed record
FType: Integer;
Size: Longint;
RType: Integer;
end;


TWaveChunkHeader = packed record
CType: Longint;
Size: Longint;
end;


const
ID_RIFF = Ord('R') + Ord('I') * $100 + Ord('F') * $10000 + Ord('F') * $1000000;
ID_WAVE = Ord('W') + Ord('A') * $100 + Ord('V') * $10000 + Ord('E') * $1000000;
ID_FMT = Ord('f') + Ord('m') * $100 + Ord('t') * $10000 + Ord(' ') * $1000000;
ID_FACT = Ord('f') + Ord('a') * $100 + Ord('c') * $10000 + Ord('t') * $1000000;
ID_DATA = Ord('d') + Ord('a') * $100 + Ord('t') * $10000 + Ord('a') * $1000000;

var
DataSize: Integer;
Format: TWaveFormatEx;
Stream: TFileStream;
Header: TWaveFileHeader;
Chunk: TWaveChunkHeader;
begin

Result := 0;
DataSize := 0;
FilLChar(Format, SizeOf(Format), 0);
Stream := TFileStream.Create(FileName, fmOpenRead);
with Streamdo

try
ReadBuffer(Header, Sizeof(Header));
if (Header.FType <>
ID_RIFF) and (Header.RType <>
ID_WAVE) then

raise Exception.Create('invalid wave file format');
Stream.ReadBuffer(Chunk, Sizeof(Chunk));
while Chunk.CType <>
0do

begin

if Chunk.CType = ID_FMT then

Stream.ReadBuffer(Format, Chunk.Size) else

if Chunk.CType = ID_DATA then

begin

DataSize := Stream.Size - Stream.Position;
break;
end else

if Chunk.CType = ID_FACT then

Stream.Seek(Chunk.Size, soFromCurrent);
FillChar(Chunk, SizeOf(Chunk), 0);
Stream.ReadBuffer(Chunk, Sizeof(Chunk));
end;

if (DataSize <>
0) and (Format.nAvgBytesPerSec <>
0) then

Result := DataSize div Format.nAvgBytesPerSec;
finally
Free;
end;

end;


TWaveFormatEx :
nAvgBytesPerSec: 声音文件中声音频率每秒钟产生出的字节数 ;
 
我认为,只要分析清楚Wav文件的结构即可实现上述要求。WAV文件有两种文件头:44B和56B,其中记录有录制该文件所使用的采样频率、声音位数和声道数以及文件的长度,而后才是真正的数据信息,数据信息又根据其采样位数可分为字节型和字型。数据值表示声音音量,数据变化量表示声音频率。
 
我觉得用控件更方便,这方面的控件很多。像NctWavPalyer等,还可以完成其它的功能
 
非常感谢andy263提供的代码!!
也感谢上面两位兄弟的提示!!

还有一个问题,不知道有什么办法解决??

我的分太少了,以后再补上!!
 
接受答案了.
 
后退
顶部