2015-06-20 31 views
6

Gerçek zamanlı sesli sohbet oluşturmaya çalışıyorum. Bir müşteri bir tuşa bastığında ve konuştuğunda, sesin soket üzerinden nodejs arka ucuna gönderilmesini istiyorum, sonra bu verileri başka bir müşteriye aktarmak istiyorum.Düğüm kullanarak istemciden istemciye mikrofon ses akışı yapabilir miyim?

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); 
     } 

    }); 

sunucusu daha sonra bu tampon alır ve başka bir müşteri için akış (bu örnekte, aynı istemci)

Sunucu Kod

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

gönderici müşteri kodu

Ve sonra, sesi diğer tarafta (alıcı) çalmak için istemci kodu şöyle:

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); 
    }); 

Beklenen sonuç, A istemcisinden gelen sesin B istemcisinde duyulacağı, sunucudaki arabelleği görebildiğim, arabelleği istemciye döndüğünün ancak hiçbir şey duymadığıdır.

socket.io 1.x'in ikili verileri desteklediğini biliyorum ancak sesli sohbet yapma konusunda herhangi bir örnek bulamıyorum, ayrıca BinaryJS'yi kullanmayı denedim ama sonuçlar da aynı, WebRTC ile bunu biliyorum Basit bir görev ama WebRTC'yi kullanmak istemiyorum, kimse iyi bir kaynağa işaret edebilir mi, yoksa neyi eksik olduğumu söyleyebilir mi?

cevap

7

Birkaç hafta önce kendiminkine benzer bir şey yapıyorum. eğer değilse

  • bile enterpolasyon veya daha iyi bir ses sıkıştırma olmadan (internet üzerinden)
  • kötü ses quallity bit hızı ve samplerate düşürmeden çok Veriler için

    • : Sorunlar I (bir noktada olacak) koştu size gösterildi, farklı bilgisayarlardan farklı örneklemler alacaksınız (benim PC = 48kHz, benim Laptop = 32Khz) demektir bir yeniden örnekleyici yazmanız gerektiği anlamına gelir
    • Websocket TCP: her ses paketi hedefine ulaşacaktır. Kötü şartlarınız var, aynı anda veya farklı düzende çoklu paketleriniz var. (UDP istiyorsanız, her bir istemcide UDP istemci proxy'si kullanmanız gerekir)
    • WebRTC'de, kötü bir internet bağlantısı tespit edilirse ses miktarını azaltırlar. Bunu yapamazsın çünkü bu düşük seviyeli bir şey!
    • Sen JS JS çevrilmiş
    • Ses kodeksi çok yavaş
    • değilse> sizin frontent engellemek kullanım webworkers çünkü hızlı bir şekilde bu uygulamak zorunda ve beklenmedik sonuçlar (: here benden bir AudioCodex soruya bakın) alacak Ben de Opus denedim, ama henüz iyi sonuç yok.

    şu anda bu proje üzerinde dont iş ama en kodu alabilirsiniz: https://github.com/cracker0dks/nodeJsVoip

    ve çalışma örneği: (kaldırılmış link) çoklu kullanıcı voip ses için. (Artık çalışmıyor! Websocketserver kapalı!) Ayarlara> ses (sayfa) girerseniz, daha yüksek bir bit seçebilir ve daha iyi ses kalitesi için örnekleme yapabilirsiniz.

    DÜZENLEME: WebRTC'yi neden kullanmak istemediğimi söyleyebilir misiniz?

  • +0

    Bu bilgilendirici cevap için çok teşekkür ederim.Webrtc kullanmak istemememin sebebi: önce internette çalışmasını sağlamak için STUN ve TURN servislerini kullanmam gerekiyor, ikincisi bir müşterinin 10 kullanıcı için 10 eşdeğer bağlantı yapmasını istediğini söylüyorsunuz. sohbet istemcilerinde, her bir istemci – udidu

    +0

    kurmak için daha fazla eş bağlantı kurmaya ihtiyaç duyarsınız, STUN ve TURN sunucularına ihtiyaç duyarsınız, ancak kendiniz tarafından kullanabileceğiniz veya barındırabileceğiniz birçok sunucu bulacaksınız (https://code.google.com/p/ rfc5766-dönüş-sunucu /). Many2many problemi için şu adresteki bir yazılımı arayabilirsiniz: MCU. WebRTC için en iyi MCU (açık kaynak) şu anda Licode: http://lynckia.com/licode/ düşünüyorum (ve kullanım), ama ayrıca bir göz atabilirsiniz: http://www.kurento.org/ve Telepresence: https://code.google.com/p/telepresence/ – Cracker0dks

    İlgili konular