2009-06-30 124 views
5

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

+0

你用什么API来播放MP3文件? TMediaPlayer? – 2009-06-30 18:15:45

+0

不,我没有播放该文件,我只需要从文件中获取信息。 – Attilah 2009-06-30 18:18:28

回答

6

的数量,您可以通过比特率除以文件的大小计算的持续时间。您可以从一个帧头获取比特率。当然,这不适用于可变速率MP3,您可以为每个帧使用不同的速率。

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

  1. 公开赛在流

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

  3. 确定MPEG版本ID。为了找到的比特率的目的,V2.5相同V2

  4. 确定层描述

  5. 读比特率索引

  6. 使用MPEG版本,层描述和位速率索引,从链接报头参考中的比特率索引表中确定实际比特率

  7. 将文件大小以千比特((* 8 *字节数)/ 1000)除以比特率以获得持续时间秒

我找不到一个德尔福样本,但这里是一个C# implementation,它使用此技术作为参​​考目的。请参阅getLengthInSeconds方法。

-1

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

尝试,

FileSize(var aFile) 
+0

这将以字节为单位给出大小,而不是分钟和秒。 – 2009-06-30 18:25:44

+1

@Charlie盐 - 这是OP之前发布解释说,他们想要的分钟/秒。我会给Secko休息一下。此外,FileSize()可能会有帮助,并在布鲁斯和我发布的公式中使用。 – 2009-06-30 18:29:11

+0

问题是:“如何在Delphi中获得MP3/wav音频文件的长度?”。 – Secko 2009-06-30 18:34:03

2

不知道这会工作,但我发现这forum post。我会比较结果与类似winamp的东西,以确保它的工作。

1

转到www.un4seen.com并下载贝司库,您将从论坛部分获得大量信息。 ;)

2

在windows下有一个合理有效的方式来确定MP3文件的长度。

这是一个巨大的黑客,但它似乎工作。

Ryan。

//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; 
2

或者,试试MediaInfo.dll link text

它包含一个Delphi包装类。 例如:

MediaInfo_Get(Handle, Stream_General, 0, 'Duration', Info_Text, Info_Name) 

其他解决方案DSPACK link text

size := FilterGraph.Duration; 
2

我建议你使用BASS

http://www.un4seen.com/bass.html

低音音频库..向开发者提供强大的流(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; 
相关问题