首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在不下载整个文件的情况下计算VBR mp3的BitRate?

如何在不下载整个文件的情况下计算VBR mp3的BitRate?
EN

Stack Overflow用户
提问于 2017-01-19 10:25:53
回答 1查看 563关注 0票数 5

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

如何通过读取标记来获取此信息?

代码语言:javascript
复制
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;

 }
EN

回答 1

Stack Overflow用户

发布于 2017-02-03 14:32:28

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

这个CodeProject 有很多关于MP3头的很好的格式。

  • 查找XING报头的起始位置。
  • 前面的第8个字节是total frames的整数(如果存在,则为4字节,大端)。

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

代码语言:javascript
复制
durationVBR = single_frame_time * total_frames; 

哪里..。

代码语言:javascript
复制
single_frame_time = (SampleRate / SamplesPerFrame) * 1000;

SamplesPerFrame的常量为:

MPEG-1

  • Layer I= 384 samples.
  • Layer II = 1152
    • = 1152 samples。

MPEG-2

  • Layer I= 384 samples.
  • Layer II = 1152
    • III = 576个样本。
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41732725

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档