2017-01-19 72 views
5

Tôi muốn nhận thông tin về thời lượng cho một tệp mp3 từ xa khi bắt đầu tải xuống. Tôi có thể nhận được các khung hình lúc đầu nhưng không biết phải đọc, Xing hoặc VBRi.Làm thế nào để tính toán BitRate cho một VBR mp3 mà không cần tải xuống toàn bộ tệp?

Làm cách nào để có được thông tin này bằng cách đọc các thẻ?

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; 

} 
+1

http://stackoverflow.com/q/9046492/1070452 – Plutonix

+0

Có thể điều này sẽ giúp bạn - https://www.mp3-tech.org/programmer/frame_header.html và http://mpgedit.org/ mpgedit/mpeg_format/mpeghdr.htm –

+0

Có một cái nhìn tại đây http://stackoverflow.com/questions/6196011/how-to-read-xingheaders-and-vbriheaders-from-mp3-files-using-taglib-sharp –

Trả lời

1

Một hơi muộn nhưng nếu bất cứ ai khác cần nó ...

này CodeProject article có rất nhiều hình tốt về tiêu đề MP3.

  • Tìm vị trí bắt đầu của tiêu đề XING.
  • Byte 8 trở đi là số nguyên total frames (nếu tồn tại sẽ là 4 byte, Big endian).

Mỗi khung MPEG cung cấp số lượng mẫu cố định cho mỗi khung hình, được xác định theo tỷ lệ lấy mẫu, bất kể tổng số bytes-in-frameX. Bạn có thể ước với một tính toán như:

durationVBR = single_frame_time * total_frames; 

đâu ...

single_frame_time = (SampleRate/SamplesPerFrame) * 1000; 

Các hằng số cho SamplesPerFrame là:

MPEG-1

  • lớp I = 384 mẫu.
  • Lớp II = 1152 mẫu.
  • Lớp III = 1152 mẫu.

MPEG-2

  • lớp I = 384 mẫu.
  • Lớp II = 1152 mẫu.
  • Lớp III = 576 mẫu.
Các vấn đề liên quan