2017-01-19 8 views
5

मैं अपने डाउनलोड की शुरुआत में एक दूरस्थ एमपी 3 फ़ाइल के लिए अवधि की जानकारी प्राप्त करना चाहता हूं। मैं पहले फ्रेम प्राप्त कर सकता हूं लेकिन यह नहीं जानता कि कौन सी पढ़ा जाना चाहिए, ज़िंग या वीबीआरआई।संपूर्ण फ़ाइल डाउनलोड किए बिना एक वीबीआर एमपी 3 के लिए बिट्रेट की गणना कैसे करें?

टैग को पढ़कर मैं यह जानकारी कैसे प्राप्त कर सकता हूं?

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 एमपी 3 हैडर के बारे में अच्छी गठन का एक बहुत है।

  • XING शीर्षलेख की प्रारंभ स्थिति खोजें।
  • 8 वीं बाइट आगे total frames (का एक पूर्णांक है यदि 4 बाइट्स, बिग एंडियन) होगा।

प्रत्येक एमपीईजी फ्रेम फ्रेम प्रति नमूनों की एक निरंतर राशि, नमूना दर से निर्धारित होता है, कुल बाइट्स में frameX की परवाह किए बिना देता है। आप की तरह एक गणना के साथ अनुमान कर सकते हैं:

durationVBR = single_frame_time * total_frames; 

कहाँ ...

single_frame_time = (SampleRate/SamplesPerFrame) * 1000; 

SamplesPerFrame के लिए स्थिरांक हैं:

एमपीईजी-1

  • लेयर मैं = 384 नमूने।
  • परत द्वितीय = 1152 नमूने।
  • परत III = 1152 नमूने।

एमपीईजी-2

  • लेयर मैं = 384 नमूने हैं।
  • परत द्वितीय = 1152 नमूने।
  • परत III = 576 नमूने।
संबंधित मुद्दे