计算MP3帧的长度(以毫秒为单位)
本文关键字:为单位 MP3 计算 | 更新日期: 2023-09-27 17:58:13
假设一个MP3帧的长度(以字节为单位)为104:如何以毫秒为单位获得?有什么公式或什么方法可以做到这一点吗?
嗯,这很奇怪,但没有人正确回答这个问题。我一直在调查,下面是公式:
帧长度(单位:ms)=(每帧采样数/采样率(单位:hz))*1000
典型的MP3(MPEG Layer III,版本1)每帧具有1152个采样,采样率(通常)为44100hz。因此(1152/44100)*1000=26122449毫秒/帧。
请注意,帧长度(时间)并不取决于比特率。
更多信息:http://www.mp3-converter.com/mp3codec/frames.htm
您需要解析MP3帧头以获得MP3版本和层数(帧头格式请参阅本文档)。一旦有了这些,就可以使用下面的查找表来获取帧中的采样数。
private static readonly int[,] samplesPerFrame = new int[,] {
{ // MPEG Version 1
384, // Layer1
1152, // Layer2
1152 // Layer3
},
{ // MPEG Version 2 & 2.5
384, // Layer1
1152, // Layer2
576 // Layer3
}
};
帧与时间不同。但如果你知道总尺寸,你可以做这样的事情:开销+帧*时间=总尺寸。
http://en.wikipedia.org/wiki/MP3有一个关于MP3文件结构的条目,但你应该试着找到一个更详细的条目。
帧头包含一个称为比特率的字段。给定这个比特率和帧数据大小,您可以确定该帧数据中有多少实际音乐时间。我希望公式是:DataSize=BitRate*TimeInterval。
请参阅http://www.mp3-tech.org/programmer/frame_header.html有关比特率编码的详细信息。
我使用了不同的方法来计算mp3文件中每一帧的时间。。假设文件中的所有帧都具有相同的大小。。所以我只得到mp3文件的总时间(以毫秒为单位)。。然后计算文件中的总帧,最后将总时间除以总帧。。所以公式看起来像:
float frameTime = totalTimeMillisec / totalFrames;
你将得到轨道中每一帧的总时间(以毫秒为单位)。。在我完成之后,我得到了大约52毫秒。。。这和马克·希思说的很相似。。
无论如何,感谢大家的解决方案。。
由于数据是加密的,在解密数据之前,您无法知道播放的比特率。没有人谈论如何加密(压缩)和解压缩数据。我所知道的是,Lame程序将获取一个波形文件,然后对其进行过滤/重新采样,然后在将数据放入帧之前以某种方式压缩数据。我不知道这些mp3播放器是用8位还是16位的单词在每个频道播放。但比特率和所有这些都与通道字节的大小和播放的采样率有关。与第一次输入到编码器的数据不同。这里的诀窍是如何看到玩家的最终结果。CBR为以后学习VBR提供了很好的参考。
如何从一个通道的一个样本中提取16位(每个样本WORD)并压缩MP3数据?结果是12位还是更少?压缩程序叫什么?