在Delphi中如何获取MP3/wav音频文件的持续时间(以分钟和秒为单位)?
在流中打开MP3文件
读取直到找到同步头为止,同步头有11位连续的1。 这曾经是12位,但它已被调整以支持MPEG版本2.5。
确定MPEG版本ID。 为了找到比特率,V2.5与V2相同
确定层描述
读取比特率索引
使用MPEG版本、层描述和比特率索引,在链接的头引用中的比特率索引表中确定实际比特率
将文件大小(以字节为单位)转换成千位((8 * size in bytes)/ 1000),再除以比特率,以秒为单位得到持续时间
我建议你使用BASS
http://www.un4seen.com/bass.html
BASS是一个音频库,旨在为开发者提供强大的流媒体(MP3、OGG等)功能。它只有不到100KB大小的微小DLL,非常容易使用。 uses BASS;
var
playingChannel: HSTREAM;
playingLength: Double;
mp3filename: String;
begin
BASS_Init(-1,44100,0,Application.Handle,nil);
playingChannel:=BASS_StreamCreateFile(FALSE,pchar(mp3filename),0,0,0);
playingLength:=BASS_ChannelBytes2Seconds(playingChannel,
BASS_ChannelGetLength(playingChannel,BASS_POS_BYTE));
end;
//add MPlayer to the uses clause;
//
//add the MP3PlayLength function to an existing form and
//place a button on the form, linking the button click method to see how it works.
uses MPlayer;
function TForm1.MP3PlayLength(aMP3FileName:string):string;
var
wMP : TMediaPlayer;
wLen : Cardinal;
begin
Try
wMP := TMediaPlayer.Create(self);
try
wMP.Visible := false;
wMP.parent := self;
wMP.FileName := aMP3FileName;
wMP.TimeFormat := tfMilliseconds;
wMP.DeviceType := dtAutoSelect;
wMP.Open;
try
wLen := trunc(wMP.Length / 1000);
result := inttostr(wLen div 60)+':'+inttostr(wLen mod 60);
finally
wMP.Close;
end;
finally
wMP.free;
end;
except
result := '(err)';
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
if OpenDialog1.Execute then
showmessage(MP3PlayLength(OpenDialog1.FileName));
end;
我不确定这会起作用,但我找到了这个论坛帖子。为确保其可行性,建议与类似winamp的软件进行比较。
访问www.un4seen.com并下载bass库,您将从论坛部分获得大量信息。 ;)
我已经很久没有玩Delphi了。
试试看,
FileSize(var aFile)