2009-06-30 120 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; 
相關問題