2013-12-18 6 views
5

जैसा कि previous question में चर्चा की गई है, मैंने एक प्रोटोटाइप (एमवीसी वेब एपीआई, नूडियो और NAudio.Lame का उपयोग करके) बनाया है जो एमपी 3 में परिवर्तित करने के बाद लाइव कम गुणवत्ता वाले ऑडियो स्ट्रीमिंग कर रहा है। स्रोत स्ट्रीम पीसीएम है: 8 के, 16-बिट, मोनो और मैं एचटीएमएल 5 के ऑडियो टैग का उपयोग कर रहा हूं।एचटीएमएललाइव स्ट्रीमिंग के लिए खराब विकल्प?

पर दोनों क्रोम और IE11 एक 15-34 दूसरा देरी (उच्च विलंबता) है से पहले ऑडियो ब्राउज़र जो, मुझे बताया गया हूँ से सुना है, हमारे अंत उपयोगकर्ताओं के लिए अस्वीकार्य है। आदर्श रूप से विलंबता 5 सेकंड से अधिक नहीं होगी। मेरे ऑडियो टैग के भीतर preload = "none" विशेषता का उपयोग करते समय भी देरी होती है।

इस मुद्दे पर अधिक बारीकी से देख रहे हैं, ऐसा लगता है कि दोनों ब्राउज़र तब तक ऑडियो बजाना शुरू नहीं करेंगे जब तक उन्हें ~ 32K ऑडियो डेटा प्राप्त नहीं होता है। इसे ध्यान में रखते हुए, मैं लमे की एमपी 3 'बिटरेट' सेटिंग को बदलकर देरी को प्रभावित कर सकता हूं। हालांकि, अगर मैं देरी को कम करता हूं (ऑडियो की समान लंबाई के लिए ब्राउज़र पर अधिक डेटा भेजकर), मैं बाद में ऑडियो ड्रॉप-आउट पेश करूंगा।

उदाहरण:

  • अगर मैं लेम के V0 एन्कोडिंग का उपयोग देरी जो स्रोत ऑडियो के लगभग 0.5 एमबी की आवश्यकता है लगभग 34 सेकंड है।
  • यदि मैं लमे के एबीआर_32 एन्कोडिंग का उपयोग करता हूं, तो मैं देरी को 10-15 सेकेंड तक कम कर सकता हूं लेकिन मुझे सुनवाई सत्र में विराम और ड्रॉप-आउट का अनुभव होगा।

प्रश्न:

  1. कोई भी विचार कैसे मैं स्टार्ट-अप देरी (प्रतीक्षा अवधि) को कम कर सकते हैं?
  2. क्या मुझे "दाएं" को चुनने की उम्मीद में विभिन्न लंग 'प्रीसेट' की जांच जारी रखनी चाहिए?
  3. क्या यह एमपी 3 लाइव स्ट्रीमिंग के लिए सबसे अच्छा प्रारूप हो सकता है?
  4. ओग/वोर्बिस (या ओग/ओपस) में स्विच करने में मदद मिलेगी?
  5. क्या हमें एचटीएमएल 5 के ऑडियो टैग को छोड़कर फ्लैश या जावा एप्लेट का उपयोग करना है?

धन्यवाद।

उत्तर

4

आप देरी को कम नहीं कर सकते हैं, क्योंकि आपके पास ब्राउज़र कोड और बफरिंग आकार पर कोई नियंत्रण नहीं है। एचटीएमएल 5 विनिर्देश किसी भी बाधा को लागू नहीं करता है, इसलिए मुझे कोई कारण नहीं दिख रहा है कि यह क्यों सुधार करेगा।

हालांकि आप वेबौडियो एपीआई (यह काफी सरल) के साथ एक समाधान लागू कर सकते हैं, जहां आप स्वयं स्ट्रीमिंग को संभालते हैं।

यदि आप अपने एमपी 3 के हिस्से को निश्चित आकार में विभाजित कर सकते हैं (ताकि प्रत्येक एमपी 3 भाग आकार पहले से ही ज्ञात हो, या कम से कम, समय प्राप्त करने पर), तो आप कोड की 20 पंक्तियों में लाइव स्ट्रीमिंग कर सकते हैं। खंड का आकार आपकी विलंबता होगी।

कुंजी ऑडियोकॉन्टेक्स्ट :: decodeAudioData का उपयोग करना है।

// Fix up prefixing 
window.AudioContext = window.AudioContext || window.webkitAudioContext; 
var context = new AudioContext(); 
var offset = 0; 
var byteOffset = 0; 
var minDecodeSize = 16384; // This is your chunk size 

var request = new XMLHttpRequest(); 
request.onprogress = function(evt) 
{ 
    if (request.response) 
    { 
     var size = request.response.length - byteOffset; 
     if (size < minDecodeSize) return; 
     // In Chrome, XHR stream mode gives text, not ArrayBuffer. 
     // If in Firefox, you can get an ArrayBuffer as is 
     var buf; 
     if (request.response instanceof ArrayBuffer) 
      buf = request.response; 
     else 
     { 
      ab = new ArrayBuffer(size); 
      buf = new Uint8Array(ab); 
      for (var i = 0; i < size; i++) 
       buf[i] = request.response.charCodeAt(i + byteOffset) & 0xff; 
     } 
     byteOffset = request.response.length; 
     context.decodeAudioData(ab, function(buffer) { 
      playSound(buffer); 
     }, onError); 
    } 
}; 
request.open('GET', url, true); 
request.responseType = expectedType; // 'stream' in chrome, 'moz-chunked-arraybuffer' in firefox, 'ms-stream' in IE 
request.overrideMimeType('text/plain; charset=x-user-defined'); 
request.send(null); 

function playSound(buffer) { 
    var source = context.createBufferSource(); // creates a sound source 
    source.buffer = buffer;     // tell the source which sound to play 
    source.connect(context.destination);  // connect the source to the context's destination (the speakers) 
    source.start(offset);       // play the source now 
              // note: on older systems, may have to use deprecated noteOn(time); 
    offset += buffer.duration; 
} 
संबंधित मुद्दे