2015-06-20 8 views
6

मैं रीयलटाइम वॉयस चैट बनाने की कोशिश कर रहा हूं। एक बार जब ग्राहक एक बटन और बातचीत कर रहा है, तो मैं सॉकेट पर ध्वनि को नोडजेस बैकएंड पर भेजना चाहता हूं, फिर मैं इस डेटा को किसी अन्य क्लाइंट पर स्ट्रीम करना चाहता हूं।क्या मैं नोडजेस का उपयोग कर क्लाइंट से क्लाइंट तक माइक्रोफ़ोन ऑडियो स्ट्रीम कर सकता हूं?

socket.on('connect', function() { 
     var session = { 
      audio: true, 
      video: false 
     }; 

     navigator.getUserMedia(session, function(stream){ 
      var audioInput = context.createMediaStreamSource(stream); 
      var bufferSize = 2048; 

      recorder = context.createScriptProcessor(bufferSize, 1, 1); 

      recorder.onaudioprocess = onAudio; 

      audioInput.connect(recorder); 

      recorder.connect(context.destination); 

     },function(e){ 

     }); 

     function onAudio(e) { 

      if(!broadcast) return; 

      var mic = e.inputBuffer.getChannelData(0); 

      var converted = convertFloat32ToInt16(mic); 

      socket.emit('broadcast', converted); 
     } 

    }); 

सर्वर तो इस बफर हो जाता है और एक अन्य ग्राहक को धारा (इस उदाहरण में, एक ही ग्राहक)

सर्वर कोड

socket.on('broadcast', function(buffer) { 
    socket.emit('broadcast', new Int16Array(buffer)); 
}); 
:

यहाँ इस ग्राहक कोड है

और फिर, दूसरी तरफ (रिसीवर) पर ध्वनि चलाने के लिए, क्लाइंट कोड इस प्रकार है:

socket.on('broadcast', function(raw) { 

     var buffer = convertInt16ToFloat32(raw); 

     var src = context.createBufferSource(); 
     var audioBuffer = context.createBuffer(1, buffer.byteLength, context.sampleRate); 

     audioBuffer.getChannelData(0).set(buffer); 

     src.buffer = audioBuffer; 

     src.connect(context.destination); 

     src.start(0); 
    }); 

मेरा अनुमानित परिणाम यह है कि क्लाइंट बी में क्लाइंट ए की आवाज सुनाई जाएगी, मैं सर्वर पर बफर देख सकता हूं, मैं क्लाइंट में बफर वापस देख सकता हूं लेकिन मुझे कुछ भी नहीं सुना है।

मुझे पता है कि socket.io 1.x बाइनरी डेटा का समर्थन करता है लेकिन मुझे वॉयस चैट करने का कोई उदाहरण नहीं मिल रहा है, मैंने बाइनरीजेएस का उपयोग करने का भी प्रयास किया लेकिन परिणाम भी वही हैं, मुझे पता है कि वेबआरटीसी के साथ यह भी है एक साधारण काम है, लेकिन मैं वेबआरटीसी का उपयोग नहीं करना चाहता, क्या कोई मुझे एक अच्छे संसाधन के लिए इंगित कर सकता है या मुझे बता सकता है कि मुझे क्या याद आ रही है?

उत्तर

7

मैं कुछ हफ्ते पहले इस तरह कुछ ऐसा बना सकता हूं। बिटरेट और sampleRate (इंटरनेट पर) अगर इसके नहीं

  • भी प्रक्षेप या एक बेहतर ऑडियो संपीड़न के बिना
  • बुरा ऑडियो quallity कम करने के बिना

      ज्यादा आंकड़ों के
    • : समस्याएं मैं में (आप कुछ बिंदु पर होगा) भाग गया आपको दिखाया गया है, आपको अलग-अलग कंप्यूटर साउंड कार्ड्स (मेरे पीसी = 48kHz, मेरे लैपटॉप = 32 किलोहर्ट्ज़) से अलग नमूने मिलेंगे, जिसका मतलब है कि आपको एक resampler
    • वेबसाइटसेट टीसीपी है: प्रत्येक ऑडियो पैकेट अपने लक्ष्य तक पहुंच जाएगा, लेकिन अगर आपके पास खराब परिस्थितियां हैं जो आपको एक ही समय में या अलग-अलग क्रम में बहुमूल्य पैकेट मिलती हैं। (यदि आप यूडीपी चाहते हैं तो यू को प्रत्येक क्लाइंट पर यूडीपी क्लाइंट प्रॉक्सी का उपयोग करना होगा)
    • वेबआरटीसी में यदि खराब इंटरनेट कनेक्शन का पता चला है तो वे ऑडियो क्वालिटी को कम करते हैं। आप ऐसा नहीं कर सकते क्योंकि यह निम्न स्तर की सामग्री है!
    • आप क्योंकि जे एस नहीं तो अपने frontent को ब्लॉक करेगा> उपयोग webworkers
    • ऑडियो कोडेक्स जे एस के लिए अनुवाद बहुत धीमी गति से कर रहे हैं एक तेजी से तरीके से इस लागू करने के लिए है और आप अप्रत्याशित परिणाम (मुझ से एक audiocodex प्रश्न देखें: here) मिल जाएगा मैंने Opus भी कोशिश की है, लेकिन अभी तक कोई अच्छा परिणाम नहीं है।

    मैं इस समय इस परियोजना पर काम न लेकिन आप पर कोड प्राप्त कर सकते हैं: बहु उपयोगकर्ता वीओआईपी ऑडियो के लिए (लिंक हटा दिया): https://github.com/cracker0dks/nodeJsVoip

    और काम उदाहरण। (अब और काम नहीं कर रहा है! Websocketserver नीचे है!) यदि आप सेटिंग्स> ऑडियो (पृष्ठ पर) में जाते हैं तो आप बेहतर ऑडियोक्वॉलिटी के लिए उच्च बिट और नमूना चुन सकते हैं।

    संपादित करें: क्या आप मुझे बता सकते हैं कि आप वेबआरटीसी का उपयोग क्यों नहीं करना चाहते हैं?

  • +0

    इस जानकारीपूर्ण उत्तर के लिए आपको बहुत बहुत धन्यवाद।कारण मैं webrtc का उपयोग नहीं करना चाहता हूं: सबसे पहले मुझे इंटरनेट पर काम करने के लिए STUN और TURN सेवाओं का उपयोग करना होगा, दूसरा कहना है कि आप चाहते हैं कि एक क्लाइंट 10 उपयोगकर्ताओं को प्रसारित करे, इसका अर्थ है 10 पीयर कनेक्शन, और भी चैट में क्लाइंट, अधिक ग्राहक कनेक्शन को – udidu

    +0

    स्थापित करने की आवश्यकता है, हाँ, आपको STUN और टर्न सर्वर की आवश्यकता है, लेकिन आपको कई सर्वर मिलेंगे जो आप स्वयं का उपयोग कर सकते हैं या होस्ट कर सकते हैं (https://code.google.com/p/ आरएफसी 5766-टर्न-सर्वर /)। कई 2 कई समस्याओं के लिए आप एमसीयू नामक सॉफ़्टवेयर की तलाश कर सकते हैं। इस समय वेबआरटीसी (ओपन सोर्स) के लिए सर्वश्रेष्ठ एमसीयू लाइसेंस है: http://lynckia.com/licode/ मुझे लगता है (और उपयोग), लेकिन आप यह भी देख सकते हैं: http://www.kurento.org/और टेलीपेरेंस: https://code.google.com/p/telepresence/ – Cracker0dks

    संबंधित मुद्दे

     संबंधित मुद्दे