2011-06-02 49 views
9

可以说一个MP3以字节为单位的帧长度为104:如何以毫秒为单位获得该值?有没有公​​式或什么可以做到这一点?以毫秒为单位计算MP3帧的长度

+2

我会说比特率是关键。 CBR最简单,VBR将要求您注意费率变化。 – sehe 2011-06-02 21:44:41

+0

你为什么需要这些信息? – Andrei 2011-06-02 21:52:12

+3

我需要解释为什么? – SolidSnake 2011-06-02 21:54:51

回答

1

我用不同的方法来计算的MP3文件中的每一帧的时间.. 假设所有帧具有文件相同的大小..所以我只是得到以毫秒为单位的MP3文件的总时间..然后计算文件中的总帧数,最后由总帧数把总的时间..所以公式看起来像:

float frameTime = totalTimeMillisec/totalFrames; 

你会得到每帧的总时间以毫秒为单位的轨道.. 我完成后,我得到了52毫秒左右...这和Mark Heath说的类似。

反正谢谢大家的解决方案..

0

框架与时间不一样。但如果你知道总大小,你可以做这样的开销+帧*时间=总大小。

+0

我有帧长度,我有MP3文件的总长度时间..但我需要以毫秒为单位获得每帧的时间..例如,如果我得到20个MP3帧我得到1K毫秒左右,这意味着1秒..如何完成这 – SolidSnake 2011-06-02 21:42:12

+0

http://www.mp3-converter.com/mp3codec/frames.htm FrameSize = 144 * BitRate /(SampleRate + Padding) – Mikhail 2011-06-03 08:40:08

0

http://en.wikipedia.org/wiki/MP3有一个关于MP3文件结构的条目,但你应该尝试找到一个更多的细节。

帧头包含一个称为比特率的字段。鉴于此比特率和帧数据大小,您可以确定该帧数据中实际的音乐时间。我期望公式为:DataSize = BitRate * TimeInterval。有关比特率编码的详细信息,请参阅http://www.mp3-tech.org/programmer/frame_header.html

+0

我不需要数据大小..我只需要总数该框架的时间.. – SolidSnake 2011-06-02 22:56:46

+0

...你通过一个部门获得。 – Andrei 2011-06-03 21:27:58

8

您需要解析MP3帧头以获取MP3版本和图层号(请参阅this document获取帧头格式)。一旦你有了这些,你可以使用下面的查找表来获取帧中的样本数量。

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 
     } 
    }; 
+0

好..它的MPEG版本1和图层是1152现在我应该添加那个来获得帧的总时间? – SolidSnake 2011-06-02 22:54:53

+0

也可以从MP3标头中找出采样率。采样率是每秒采样数,所以样本数除以采样率就是帧的持续时间。 (如果你不得不考虑频道数量,我记不清楚,我想你是这么做的,所以对于立体声,你可以先将样本数量减半) – 2011-06-02 23:02:11

+0

嗯,现在我做了你所说的我但我总是得到“0”..这是我所做的,“mp3Frame.SampleCount/mp3Frame.SampleRate”.. btw,mp3Frame.SampleCount = 576和mp3Frame.SampleRate = 11025 ..也许我需要乘以SampleCount by 2? – SolidSnake 2011-06-02 23:12:54

0

由于数据是加密的,你不能知道玩比特率,直到数据已经被解密。 没有人会说如何加密(压缩)和解压缩数据。 我所知道的是,Lame程序将采取一个波形文件,然后过滤/重新采样它然后以某种方式压缩数据,然后将其放入帧中。我不知道这些MP3播放器是否使用8位或16位字在每个通道播放。但是,比特率和全部都与通道字节的大小和播放的采样率有关。与数据首先输入到编码器不同。 如何查看玩家发挥的最终结果是这里的诀窍。 CBR为后来学习VBR做了很好的参考。

如何取一个样本的一个通道的16位(每个样本的WORD)并为MP3数据压缩ot?结果是12位还是更少? 压缩程序调用什么?

+0

加密?你的意思是压缩?你的回答有点混乱。 – nalply 2012-10-10 19:45:51

15

嗯,这很奇怪,但没有人正确回答这个问题。我已经研究,这里的式:

帧长度(毫秒)=(每帧/采样率样品(以Hz))* 1000

典型MP3(一个MPEG层III,第1版)每帧有1152个采样,采样率(通常)为44100赫兹。因此(1152/44100)* 1000 =每帧26,122449毫秒。

注意帧长度(时间)不取决于比特率。

更多信息:http://www.mp3-converter.com/mp3codec/frames.htm