MP3 / wav音频文件的持续时间

时间:2009-06-30 18:00:48

标签: delphi audio mp3

如何在Delphi中获取MP3 / wav音频文件的持续时间(以分钟和秒为单位)?

9 个答案:

答案 0 :(得分:7)

您可以通过将文件大小除以比特率来计算持续时间。您可以从其中一个帧头获取比特率。当然,这对于可变速率MP3不起作用,在每种帧中你可以有不同的速率。

使用Header Layout(只有四个字节):

  1. 在流中打开MP3

  2. 通过阅读直到找到第一个帧头的开头 找到同步头,其中有11个连续位设置为1.这个 曾经是12,但它被调整为允许MPEG版本2.5。

  3. 确定MPEG版本ID。为了找到比特率,V2.5与V2

  4. 相同
  5. 确定图层说明

  6. 读取比特率指数

  7. 使用MPEG版本,层描述和比特率索引,从链接头引用中的比特率索引表中确定实际比特率

  8. 以千比特((8 *大小,以字节为单位)/ 1000)除以文件大小的比特率,以秒为单位获得持续时间

  9. 我找不到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项目中的后台解决方法。

http://blog.ncodedev.com

答案 8 :(得分:-1)

我和Dephi一起玩了很长时间。

尝试,

FileSize(var aFile)