代码改变世界

获得wav语音文件时长

2018-04-08 14:48  圣二十一郎  阅读(1384)  评论(0编辑  收藏  举报

用代码获取文件时长。

直接读取wav文件头信息,从文件起始地址偏移28个字节长度为4个字节保存的是每秒钟播放的字节数,

从文件起始地址偏移40个字节长度为4个字节保存的是声音数据的总的字节数,相除就是播放时间。 

 1 var
 2 
 3 fileStream: TFileStream;
 4 {文件头标志}
 5 fileHeadArr: array[0..3] of Byte;
 6 //每秒钟播放的字节数
 7 //声音数据的总的字节数,相除就是播放时间
 8 nSecByte, nCountByte: Integer;
 9 begin
10 Result := -1;
11 fileStream := TFileStream.Create(strSourceFile, fmOpenRead or fmShareDenyNone);
12 try
13 try 
14 fileStream.Position := 28;
15 fileStream.Read(fileHeadArr, SizeOf(fileHeadArr));
16 
17 nSecByte := StrToInt('$' + IntToHex(fileHeadArr[3], 2) + IntToHex(fileHeadArr[2], 2) +
18 IntToHex(fileHeadArr[1], 2) + IntToHex(fileHeadArr[0], 2));
19 
20 fileStream.Position := 508;
21 fileStream.Read(fileHeadArr, SizeOf(fileHeadArr));
22 nCountByte := StrToInt('$' + IntToHex(fileHeadArr[3], 2) + IntToHex(fileHeadArr[2], 2) +
23 IntToHex(fileHeadArr[1], 2) + IntToHex(fileHeadArr[0], 2));
24 
25 Result := nCountByte div nSecByte;
26 except
27 on e:Exception do
28 begin
29        输出日志('GetFileDuration: ' + e.Message);
30 end; 
31 end;
32 finally
33 fileStream.Free;
34 end;