簡體   English   中英

如何在不下載整個文件的情況下計算VBR mp3的BitRate?

[英]How to calculate BitRate for a VBR mp3 without downloading the entire file?

我想在下載開始時獲取遠程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;

 }

有點晚,但如果有人需要它...

這篇CodeProject 文章有很多關於MP3標題的良好形式。

  • 找到XING標題的起始位置。
  • 第8個字節以后是total frames的整數( 如果存在則為 4個字節,Big endian)。

每個MPEG幀每幀提供恆定量的采樣,由采樣率決定,而不管幀中的總字節數X。 您可以通過以下計算進行估算:

durationVBR = single_frame_time * total_frames; 

哪里...

single_frame_time = (SampleRate / SamplesPerFrame) * 1000;

SamplesPerFrame的常量是:

MPEG-1

  • 層I = 384個樣本。
  • 層II = 1152個樣品。
  • 層III = 1152個樣品。

MPEG-2

  • 層I = 384個樣本。
  • 層II = 1152個樣品。
  • 層III = 576個樣品。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM