计算MP3帧的长度(以毫秒为单位)

时间:2011-06-02 21:34:54

标签: c# .net audio mp3

假设一个MP3帧长度以字节为单位104:如何以毫秒为单位得到它?是否有任何公式或其他事情要做?

6 个答案:

答案 0 :(得分:16)

嗯,这很奇怪,但没有人正确回答这个问题。我一直在调查,这是公式:

帧长度(以毫秒为单位)=(每帧采样数/采样率(以赫兹为单位))* 1000

典型的MP3(MPEG Layer III,版本1)每帧有1152个样本,采样率(通常)为44100 hz。所以(1152/44100)* 1000 =每帧26,122449毫秒。

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

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

答案 1 :(得分:9)

您需要解析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
        }
    };

答案 2 :(得分:1)

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

float frameTime = totalTimeMillisec / totalFrames;

您将获得轨道中每一帧的总时间(以毫秒为单位)。 在我完成之后,我得到了大约52毫秒......这与马克希思所说的相似......

无论如何,感谢大家的解决方案......

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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

帧头包含称为比特率的字段。给定此比特率和帧数据大小,您可以确定该帧数据中的实际音乐时间。我希望公式为:DataSize = BitRate * TimeInterval。

有关比特率编码的详细信息,请参阅http://www.mp3-tech.org/programmer/frame_header.html

答案 5 :(得分:0)

由于数据已加密,因此您无法知道播放的比特率,直到数据被解密为止。 没有人谈论如何加密(压缩)和解压缩数据。 我所知道的是Lame程序将采用波形文件,然后对其进行过滤/重采样,然后以某种方式压缩数据,然后将其放入帧中。我不知道这些MP3播放器是否在每个频道中使用8或16位字。但是比特率和所有都与通道字节的大小和播放的采样率有关。与首先输入编码器的数据不同。 如何查看玩家所玩的最终结果就是这里的诀窍。 CBR为以后学习VBR提供了很好的参考。

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