【问题标题】:How to calculate BitRate for a VBR mp3 without downloading the entire file?如何在不下载整个文件的情况下计算 VBR mp3 的比特率?
【发布时间】:2017-01-19 02:25:53
【问题描述】:

我想在下载开始时获取远程 mp3 文件的持续时间信息。我一开始可以得到帧,但不知道必须读取哪个,Xing 或 VBRi。

如何通过阅读标签获取这些信息?

MemoryStream ms = new MemoryStream();
waveOut.Play();
long offset = from;
ms.Position = 0;
byte[] decBuffer = new byte[50 * 1024];
while (true)
{
   if (paused)
   {
      waveOut.Stop();
      bwProvider.ClearBuffer();
      break;
   }
      lock (LockObj)
      {
         byte[] readed = Helper.ReadStreamPartially(localStream, offset, 100 * 1024, orders);
         if (readed == null)
            continue;
         ms = new MemoryStream(readed);
      }
      Mp3Frame frame;
      try
      {
         frame = Mp3Frame.LoadFromStream(ms);
      }
      catch
      {
         continue;
      }
      if (frame == null)
         continue;

      int decompressed = decompressor.DecompressFrame(frame, decBuffer, 0);

      bwProvider.AddSamples(decBuffer, 0, decompressed);

      if (Helper.IsBufferNearlyFull(bwProvider))
          Thread.Sleep(500);

      offset += ms.Position;

 }

【问题讨论】:

标签: c# streaming mp3 duration


【解决方案1】:

有点晚了,但如果其他人需要...

这个 CodeProject article 有很多关于 MP3 标题的好结构。

  • 找到 XING 标头的起始位置。
  • 第 8 个字节以后是一个整数 total frames如果存在将是 4 个字节,大端)。

每个 MPEG 帧在每帧中提供恒定数量的样本,由采样率确定,而与总帧中字节数X无关。您可以使用如下计算进行估算:

durationVBR = single_frame_time * total_frames; 

在哪里...

single_frame_time = (SampleRate / SamplesPerFrame) * 1000;

SamplesPerFrame 的常量是:

MPEG-1

  • 第 I 层 = 384 个样本。
  • 第二层 = 1152 个样本。
  • 第三层 = 1152 个样本。

MPEG-2

  • 第 I 层 = 384 个样本。
  • 第二层 = 1152 个样本。
  • 第三层 = 576 个样本。

【讨论】:

  • 有些文件有Info而不是Xing,两者格式相同。其他文件有VBRI,这是一种不同的格式,有些文件根本没有。即使有Xinginfo,下一个字段都是可选的,您必须解析 32 位字段中的标志以查看哪些存在并知道它们位于哪个偏移量。
猜你喜欢
  • 1970-01-01
  • 2012-06-14
  • 2019-04-03
  • 1970-01-01
  • 1970-01-01
  • 2020-12-08
  • 2012-01-19
  • 2021-06-15
  • 2015-12-10
相关资源
最近更新 更多