2017-01-19 46 views
5

İndirmenin başında uzak bir mp3 dosyasının süresini öğrenmek istiyorum. İlk önce kareleri alabilirim ama hangisinin okunması gerektiğini bilmiyorum, Xing veya VBRi.Tüm dosyayı indirmeden bir VBR mp3 için BitRate nasıl hesaplanır?

Bu bilgileri etiketlerini okuyarak nasıl edinebilirim?

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

Belki bu size yardımcı olur - https://www.mp3-tech.org/programmer/frame_header.html ve http://mpgedit.org/ mpgedit/mpeg_format/mpeghdr.htm –

+0

http://stackoverflow.com/questions/6196011/how-to-read-xingheaders-and-vbriheaders-from-mp3-files-using-taglib-sharp –

cevap

1

Biraz geç ama başkasının ihtiyacı olursa ...

Bu CodeProject article MP3 başlığındaki hakkında iyi oluşumunun bir yeri vardır.

  • XING başlığının başlangıç ​​konumunu bulun.
  • 8 bayttan sonra, total frames ( 4 byte, Big endian) bir tamsayıdır.

Her MPEG çerçeve bağımsız olarak toplam bayt-in-Framex arasında, numune alma oranına göre belirlenir kare başına örneklerin bir sabit miktarda verir.

single_frame_time = (SampleRate/SamplesPerFrame) * 1000; 

SamplesPerFrame için sabitler

Neredeyiz ...

durationVBR = single_frame_time * total_frames; 

: Sen böyle bir hesaplama ile tahmin edebilirsiniz

MPEG-1

  • Katman I = 384 örnek.
  • Katman II = 1152 örnek.
  • Katman III = 1152 örnek.

MPEG-2

  • Tabaka = 384 örnekler.
  • Katman II = 1152 örnek.
  • Katman III = 576 örnek.