2017-01-19 15 views
5

Я хочу получить информацию о длительности для удаленного mp3-файла в начале его загрузки. Я могу получить фреймы сначала, но не знаю, что должно быть прочитано, Xing или VBRi.Как рассчитать битRate для VBR mp3 без скачивания всего файла?

Как я могу получить эту информацию, читая теги?

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

Может быть, это поможет вам - https://www.mp3-tech.org/programmer/frame_header.html и 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 –

ответ

1

Немного поздно, но если кто-то нуждается в нем ...

Это CodeProject article имеет много хорошего формирования о заголовке MP3.

  • Найти начальную позицию заголовка XING.
  • 8-й байт является целым числом total frames (если существует будет 4 байта, большой конец).

Каждый кадр в формате MPEG дает постоянное количество выборок на кадр, определяется частотой дискретизации, независимо от общего количества байт-в-frameX. Вы можете оценить с расчетом как:

durationVBR = single_frame_time * total_frames; 

Где ...

single_frame_time = (SampleRate/SamplesPerFrame) * 1000; 

Константы для SamplesPerFrame являются:

MPEG-1

  • Layer I = 384 образца.
  • Layer II = 1152 образцов.
  • Layer III = 1152 образцов.

в формате MPEG-2

  • Layer I = 384 пробы.
  • Layer II = 1152 образцов.
  • Layer III = 576 образцов.

 Смежные вопросы

  • Нет связанных вопросов^_^