如何在Delphi中獲取MP3/wav音頻文件的持續時間(以分鐘和秒爲單位)?MP3/wav音頻文件的持續時間
回答
的數量,您可以通過比特率除以文件的大小計算的持續時間。您可以從一個幀頭獲取比特率。當然,這不適用於可變速率MP3,您可以爲每個幀使用不同的速率。
使用Header Layout(它只是四個字節):
公開賽在流
找到第一個幀頭開始的MP3通過閱讀,直到你 發現,該同步頭,其中有11個連續的比特設置爲1.這個 曾經是12,但它被調整爲允許MPEG版本2.5。
確定MPEG版本ID。爲了找到的比特率的目的,V2.5相同V2
確定層描述
讀比特率索引
使用MPEG版本,層描述和位速率索引,從鏈接報頭參考中的比特率索引表中確定實際比特率
將文件大小以千比特((* 8 *字節數)/ 1000)除以比特率以獲得持續時間秒
我找不到一個德爾福樣本,但這裏是一個C# implementation,它使用此技術作爲參考目的。請參閱getLengthInSeconds方法。
我和Dephi一起玩了很長時間。
嘗試,
FileSize(var aFile)
這將以字節爲單位給出大小,而不是分鐘和秒。 – 2009-06-30 18:25:44
@Charlie鹽 - 這是OP之前發佈解釋說,他們想要的分鐘/秒。我會給Secko休息一下。此外,FileSize()可能會有幫助,並在布魯斯和我發佈的公式中使用。 – 2009-06-30 18:29:11
問題是:「如何在Delphi中獲得MP3/wav音頻文件的長度?」。 – Secko 2009-06-30 18:34:03
不知道這會工作,但我發現這forum post。我會比較結果與類似winamp的東西,以確保它的工作。
轉到www.un4seen.com並下載貝司庫,您將從論壇部分獲得大量信息。 ;)
在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;
我建議你使用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;
結帳這個博客,使用背景的解決方法的ffmpeg在Ruby項目。
- 1. AMR音頻文件的持續時間
- 2. 如何提取音頻/視頻文件的持續時間?
- 3. 獲取音頻文件的持續時間
- 4. 使用ProgressBar四捨五入音頻文件的持續時間
- 5. 獲取音頻文件的持續時間
- 6. iPhone:獲取音頻文件的持續時間
- 7. iPhone - 獲得線性PCM音頻文件的持續時間
- 8. 音頻持續時間返回0.0
- 9. HTML5音頻持續時間問題
- 10. libav給音頻持續時間爲負
- 11. 加入多個音軌時的音頻持續時間匹配
- 12. 源視頻和低頻音頻的持續時間不同
- 13. 如果視頻持續時間長於音頻持續時間,如何重複播放音軌
- 14. 如何獲取使用FFMPEG上傳後的音頻文件的持續時間
- 15. 持續時間的生成的音頻正弦波的
- 16. 在ffmpeg中獲取音頻的持續時間在php
- 17. sox音頻持續時間中的次秒格式是什麼?
- 18. 音頻播放持續時間的變化而玩
- 19. 在php表中的JavaScript音頻持續時間顯示問題
- 20. 檢索從kbps和大小的音頻持續時間
- 21. 從MemoryStream中打開音頻(wav)文件以確定持續時間
- 22. 輸出音頻文件未正確創建,或者持續時間不明
- 23. HTML 5音頻:有緩衝持續時間變化時觸發的事件
- 24. Flex中的聲音持續時間
- 25. 如何使用C#獲得視頻文件的持續時間?
- 26. 在Java/Android中提取3GP視頻文件的持續時間
- 27. 使用Dropzone.js獲取視頻文件的持續時間
- 28. 不知道文件持續時間的分割視頻
- 29. 如何獲得視頻閃存文件的持續時間?
- 30. Microsoft.WindowsAPICodePack.Shell音頻持續時間沒有得到
你用什麼API來播放MP3文件? TMediaPlayer? – 2009-06-30 18:15:45
不,我沒有播放該文件,我只需要從文件中獲取信息。 – Attilah 2009-06-30 18:18:28