【问题标题】:Calculating the length of MP3 Frames in milliseconds [closed]以毫秒为单位计算 MP3 帧的长度 [关闭]
【发布时间】:2011-09-07 10:02:54
【问题描述】:

假设一个 MP3 帧长度(以字节为单位)是 104:如何以毫秒为单位获得?有什么公式或什么可以做到这一点吗?

【问题讨论】:

  • 我想说比特率是关键。 CBR 是最简单的,VBR 会要求您注意费率变化。
  • 为什么需要这些信息?
  • 你“不需要”做任何事情!但是,通常,当人们问这类问题(“我如何得到 X”)时,他们需要它来做其他事情。有时可以以不同的方式解决“其他问题”。
  • aha 好的.. 我需要裁剪我拥有的 mp3 文件.. 所以我需要设置开始时间和结束时间来进行裁剪.. 我需要计算每一帧的时间文件..
  • @Andrei 虽然这可能是真的,但回避实际问题是个坏主意。我来到这里想知道这个确切问题的确切答案。 StackOverflow 旨在成为一个公开的问题和答案档案,而不仅仅是 OP。

标签: c# .net audio mp3


【解决方案1】:

嗯,这很奇怪,但没有人正确回答这个问题。我一直在研究,公式如下:

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

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

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

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

【讨论】:

  • 这应该被标记为正确答案。
  • “每帧 1152 个样本” - 这对 VBR 准确吗?
  • @mvmn 是的,但是每帧的样本数确实会随着马克的回答中概述的采样率而变化。
【解决方案2】:

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

【讨论】:

  • ok.. 它的 MPEG 版本 1 和层是 1152 现在我应该在哪里添加它以获得帧的总时间?
  • 采样率也可以从 MP3 标头中找到。采样率是每秒的样本数,因此样本数除以采样率就是帧的持续时间。 (如果您还必须考虑通道数,我想不起来了,我想您这样做了,所以对于立体声,您首先将样本数量减半)
  • 嗯,现在我做了你告诉我的事,但我总是得到“0”......这就是我所做的,“mp3Frame.SampleCount / mp3Frame.SampleRate”..顺便说一句,mp3Frame.SampleCount =576 和 mp3Frame.SampleRate=11025.. 也许我需要将 SampleCount 乘以 2?
  • 您需要使用浮点数。帧持续约 52 毫秒(0.052 秒)。
  • “你需要使用浮点数”——或者颠倒除法的方向并以每秒帧数而不是每帧秒数工作。
【解决方案3】:

帧不等于时间。但是如果你知道总大小,你可以做这样的事情开销+帧*时间=总大小。

【讨论】:

  • 我有帧长度,我有 mp3 文件的总长度时间。但我需要以某种方式以毫秒为单位获取每帧的时间。例如,如果我得到 20 个 mp3 帧大约 1k 毫秒,这意味着 1 秒.. 如何做到这一点
  • mp3-converter.com/mp3codec/frames.htm FrameSize = 144 * BitRate / (SampleRate + Padding)
【解决方案4】:

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

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

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

【讨论】:

  • 我不需要数据大小..我只需要该帧的总时间..
  • ...你通过一个部门得到。
  • 每帧的样本数(以及持续时间)与比特率无关。比特率是应用压缩量的(近似)度量。
【解决方案5】:

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

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

【讨论】:

  • 加密?你的意思是压缩的?你的回答有点混乱。
【解决方案6】:

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

float frameTime = totalTimeMillisec / totalFrames;

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

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

【讨论】:

  • 如果是 MP3 流,例如您想流式传输到媒体播放器,并且您希望通过延迟每一帧以与文件播放相同的速率进行流式传输。您不知道总帧数(互联网互联网广播电台将永远运行)。所以正确的答案是 Mark Heath 和 lucianolev 的混合。
猜你喜欢
  • 2010-11-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多