如何在Delphi中获取MP3 / wav音频文件的持续时间(以分钟和秒为单位)?
答案 0 :(得分:7)
您可以通过将文件大小除以比特率来计算持续时间。您可以从其中一个帧头获取比特率。当然,这对于可变速率MP3不起作用,在每种帧中你可以有不同的速率。
使用Header Layout(只有四个字节):
在流中打开MP3
通过阅读直到找到第一个帧头的开头 找到同步头,其中有11个连续位设置为1.这个 曾经是12,但它被调整为允许MPEG版本2.5。
确定MPEG版本ID。为了找到比特率,V2.5与V2
确定图层说明
读取比特率指数
使用MPEG版本,层描述和比特率索引,从链接头引用中的比特率索引表中确定实际比特率
以千比特((8 *大小,以字节为单位)/ 1000)除以文件大小的比特率,以秒为单位获得持续时间
我找不到Delphi示例,但这里有C# implementation使用此技术进行参考。请参阅getLengthInSeconds方法。
答案 1 :(得分:3)
答案 2 :(得分:2)
不确定这会有效,但我发现了forum post。我会将结果与winamp之类的内容进行比较,以确保其有效。
答案 3 :(得分:2)
在Windows下,有一种确定MP3文件长度的合理有效方法。
这是一个巨大的黑客,但它似乎工作。
瑞恩。
//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;
答案 4 :(得分:2)
或者,尝试使用MediaInfo.dll link text。
它包含一个Delphi包装类。 例如:
MediaInfo_Get(Handle, Stream_General, 0, 'Duration', Info_Text, Info_Name)
其他解决方案DSPack link text
size := FilterGraph.Duration;
答案 5 :(得分:2)
我建议你使用BASS
http://www.un4seen.com/bass.html
BASS是一个音频库..为开发人员提供强大的流(MP3 .. OGG ..)功能。全部在一个小的DLL中,大小不超过100KB。
它非常容易使用
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;
答案 6 :(得分:1)
访问www.un4seen.com并下载低音库,您将从论坛部分获得大量信息。 ;)
答案 7 :(得分:0)
结帐此博客,使用ffmpeg作为ruby项目中的后台解决方法。
答案 8 :(得分:-1)
我和Dephi一起玩了很长时间。
尝试,
FileSize(var aFile)