如何得到一个wav文件的放音时间?(300分)

  • 主题发起人 主题发起人 htw
  • 开始时间 开始时间
H

htw

Unregistered / Unconfirmed
GUEST, unregistred user!
如何得到一个wav文件的放音时间?
 
你可以用DSPACK中的TDSTRACKBAR来作,就可以得到时长了!
 
用MediaPlayer控件打开,读Length属性
 
转载
//返回秒数
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: 声音文件中声音频率每秒钟产生出的字节数


 
仁豆豆厉害!
 
后退
顶部