2017-01-19 40 views
5

Chcę uzyskać informacje o czasie trwania zdalnego pliku mp3 na początku jego pobierania. Na początku mogę uzyskać ramki, ale nie wiem, które muszą być przeczytane, Xing lub VBRi.Jak obliczyć BitRate dla VBR mp3 bez pobierania całego pliku?

Jak mogę uzyskać te informacje, czytając znaczniki?

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

Może to ci pomaga - https://www.mp3-tech.org/programmer/frame_header.html i http://mpgedit.org/ mpgedit/mpeg_format/mpeghdr.htm –

+0

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

Odpowiedz

1

Trochę późno, ale jeśli ktoś potrzebuje ...

Ten CodeProject article ma dużo dobrej formacji o nagłówku MP3.

  • Znajdź pozycję początkową nagłówka XING.
  • 8. bajt jest liczbą całkowitą z total frames (, jeśli istnieje będzie 4 bajty, Big endian).

Każda ramka MPEG daje stałą ilość próbek przypadających na ramkę, określoną przez częstotliwość próbkowania, niezależnie od całkowitej bajtów-w-frameX. można oszacować za pomocą obliczeń, takich jak:

durationVBR = single_frame_time * total_frames; 

Gdzie ...

single_frame_time = (SampleRate/SamplesPerFrame) * 1000; 

stałych dla SamplesPerFrame są:

MPEG-1

  • Warstwa I = 384 próbek.
  • Warstwa II = 1152 próbek.
  • Warstwa III = 1152 próbek.

MPEG-2

  • warstwa I = 384 próbek.
  • Warstwa II = 1152 próbek.
  • Warstwa III = 576 próbek.