2016-07-19 12 views
6

पर नोडजेएस सर्वर से लाइव स्ट्रीमिंग ऑडियो प्राप्त करें मुझे 1 क्लाइंट से एक सर्वर से एकाधिक श्रोता क्लाइंट में एक वास्तविक समय लाइव ऑडियो स्ट्रीम की आवश्यकता है।क्लाइंट

वर्तमान में मेरे पास क्लाइंट से रिकॉर्डिंग है और सर्वर पर socket.io के माध्यम से ऑडियो स्ट्रीम करें। सर्वर को यह डेटा प्राप्त होता है और इस स्ट्रीम को सुनना चाहते हैं, जो क्लाइंट को ऑडियो (socket.io? के माध्यम से भी) स्ट्रीम करना होगा। यह यथासंभव वास्तविक समय होना चाहिए (देरी को कम करें)।

मैं माइक्रोफोन रिकॉर्ड करने के लिए GetUserMedia का उपयोग कर रहा हूं (ब्राउज़र संगतता यहां महत्वपूर्ण नहीं है)। मैं चाहता हूं कि क्लाइंट स्ट्रीम सुनने के लिए एचटीएमएल 5 ऑडियो टैग का उपयोग करें। सर्वर पर प्राप्त डेटा खंडों (वर्तमान में 700 द्वारा पैक किया गया) है जो ऑडियो/वाव के साथ ब्लॉब में पैक किया जाता है।

mediaRecorder.ondataavailable = function(e) { 
    this.chunks.push(e.data); 
    if (this.chunks.length >= 700) 
    { 
     this.sendData(this.chunks); 
     this.chunks = []; 
    } 
}; 
mediaRecorder.sendData = function(buffer) { 
    blob = new Blob(buffer, { 'type' : 'audio/wav' }); 
    socket.emit('voice', blob); 
} 

सर्वर मैं ग्राहक के लिए इस तरह एक ही तरह से हिस्सा नहीं भेज पा रहा हूँ पर::

यह मेरा कोड सर्वर को भेजने के लिए है

socket.on('voice', function(blob) { 
    socket.broadcast.emit('voice', blob); 
}); 

पर लेकिन

var audio = document.createElement('audio'); 
socket.on('voice', function(arrayBuffer) { 
    var blob = new Blob([arrayBuffer], { 'type' : 'audio/wav' }); 
    audio.src = window.URL.createObjectURL(blob); 
    audio.play(); 
}); 

यह हिस्सा मैं भेज के पहले ब्लॉब लिए काम करता है आप ke करने के लिए अनुमति नहीं है: ग्राहक मैं इस तरह इस खेल सकते हैं एपी नए यूआरएल स्रोत में audio.src में बदल रहा है, इसलिए यह एक कामकाजी समाधान नहीं है।

मुझे लगता है कि मुझे सर्वर पर किसी प्रकार की स्ट्रीम बनाना है जिसे मैं सुनने वाले ग्राहकों पर एचटीएमएल 5 के ऑडियो टैग में डाल सकता हूं लेकिन मुझे नहीं पता कि कैसे। वास्तविक समय में इस धारा में भाग के साथ प्राप्त ब्लॉब्स को जोड़ा जाना चाहिए।

ऐसा करने का सबसे अच्छा तरीका क्या है? क्या मैं इसे क्लाइंट माइक्रोफोन से सर्वर पर कर रहा हूं?

+0

यदि आपने वीब्रेट के बारे में सुना है, तो यह आपकी समस्या के लिए एक प्राकृतिक समाधान है क्योंकि वीब्रेट पीयर के साथ सहकर्मी है। –

+0

मुझे पता है, लेकिन मैं नहीं चाहता कि यह सहकर्मी के साथ सहकर्मी हो लेकिन सर्वर से प्रसारित हो।क्लाइंट रिकॉर्डिंग करने वाले क्लाइंट ने बैंडविड्थ को सभी क्लाइंट्स को प्रसारित करने के लिए लिखा है, इसलिए मुझे –

+0

करने के लिए सर्वर की आवश्यकता है, आप वेबआरटीसी के एमसीयू आर्किटेक्चर का उपयोग कर सकते हैं, लेकिन मुझे लगता है कि यहां दायरे से बाहर है। –

उत्तर

1

आप को बदल सकता है audiosrc गतिशील के रूप में (यह मानते हुए एमपी 3 प्रकार) इस प्रकार है:

<audio id="audio" controls="controls"> 
    <source id="mp3Source" type="audio/mp3"></source> 
     Your browser does not support the audio format. 
</audio> 

कॉल निम्नलिखित समारोह जब भी, सॉकेट घटना प्राप्त होता है:

function updateSource() { 
     var audio = document.getElementById('audio'); 

     var source = document.getElementById('mp3Source'); 
     source.src= <blob>; 

     audio.load(); //call this to just preload the audio without playing 
     audio.play(); //call this to play the song right away 
    } 
1

मैं करने के लिए थोड़ी देर हो चुकी हूँ यहां पार्टी करें लेकिन ऐसा लगता है कि वेब ऑडियो एपीआई आपका मित्र होगा, अगर आपने इसे पहले ही समाप्त नहीं किया है। यह आपको ऑडियो तत्व को अटैचमेंट के साथ गड़बड़ किए बिना आउटपुट डिवाइस पर सीधे ऑडियो स्ट्रीम चलाने की अनुमति देता है।

मैं वही काम कर रहा हूं और आपके प्रश्न ने मेरे प्रश्न का उत्तर दिया है - क्लाइंट से सर्वर तक डेटा कैसे प्राप्त करें। वेब ऑडियो एपीआई का लाभ स्ट्रीम को एक साथ जोड़ने और सर्वर पर ऑडियो प्रभाव लागू करने की क्षमता है।

MDN Web Audio API

कब घटनाओं ऑडियो संदर्भ में एक ऑडियो बफर वस्तु में डेटा बदलना चाहिए। ऑडियो क्लाइंट प्रत्येक क्लाइंट के लिए एक स्ट्रीम के रूप में उत्सर्जित होने से पहले नोडजेएस वेब ऑडियो संदर्भ में हो सकता है।