如何在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