2015-06-20 22 views
6

Sto provando a creare una chat vocale in tempo reale. quando un client è in possesso di un pulsante e parla, voglio che il suono venga inviato tramite il socket al backend nodejs, quindi voglio trasmettere questi dati a un altro client.Posso ascoltare l'audio del microfono dal client al client usando nodejs?

qui è il codice del client mittente:

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

    }); 

Il server quindi ottiene questo buffer e streaming a un altro client (in questo esempio, lo stesso cliente)

Server Codice

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

E quindi, per riprodurre il suono dall'altra parte (il ricevitore), il codice cliente è come:

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

Il mio risultato atteso è che il suono dal client A sarà ascoltato nel client B, posso vedere il buffer sul server, posso vedere il buffer nel client ma non sento nulla.

So che socket.io 1.x supporta i dati binari ma non riesco a trovare alcun esempio di creazione di una chat vocale, ho provato anche a utilizzare BinaryJS ma i risultati sono gli stessi, inoltre, so che con WebRTC questo è un compito semplice ma non voglio usare WebRTC, qualcuno può indicarmi una buona risorsa o dirmi cosa mi manca?

risposta

7

Ho costruito qualcosa del genere da solo poche settimane fa. Problemi che ho incontrato (si a un certo punto):

  • Per quantità di dati senza ridurre il bitrate e frequenza di campionamento (su internet)
  • quallity audio male senza interpolazione o una migliore compressione audio
  • Anche se non la sua mostrati, otterrai diversi samplerate da diverse schede audio del computer (mio PC = 48kHz, mio ​​portatile = 32Khz) che significa che devi scrivere un resampler
  • Websocket è TCP: ogni pacchetto audio raggiungerà il suo obiettivo, ma se hai cattive condizioni hai pacchetti multipli allo stesso tempo o in ordine diverso. (U deve utilizzare un proxy client UDP su ogni client se si desidera UDP)
  • In WebRTC riducono la qualità audio se viene rilevata una connessione Internet non valida. Non puoi farlo perché questa è roba di basso livello!
  • è necessario implementare questo in un modo veloce, perché JS sarà bloccare la propria frontent se non> uso webworkers
  • Audio codice tradotto in JS sono molto lento e si ottengono risultati inaspettati (vedi una domanda audiocodex da me: here) Ho provato anche Opus, ma non ci sono ancora buoni risultati.

I dont lavoro su questo progetto al momento, ma è possibile ottenere il codice a: https://github.com/cracker0dks/nodeJsVoip

e l'esempio di lavoro: (link rimosso) per audio multi utente VoIP. (Non funziona più! Websocketserver non funziona!) Se vai in impostazioni> audio (sulla pagina) puoi scegliere un bit più alto e samplerate per una migliore qualità audio.

MODIFICA: Puoi dirmi perché non vuoi usare WebRTC?

+0

Grazie mille per questa risposta informativa.La ragione per cui non voglio usare webrtc: prima devo usare i servizi STUN e TURN per farlo funzionare su Internet e poi, diciamo che vuoi che un client trasmetta a 10 utenti, significa 10 connessioni peer, più i clienti nella chat, più connessioni peer ogni client ha bisogno di stabilire – udidu

+0

sì, hai bisogno di server STUN e TURN ma troverai molti server che puoi utilizzare o ospitare da te (https://code.google.com/p/ rfc5766-turn-server /). Per molti e molti problemi puoi dare un'occhiata al software chiamato: MCU. Il miglior MCU per WebRTC (open source) al momento è Licodo: http://lynckia.com/licode/ penso (e utilizzo), ma puoi anche dare un'occhiata a: http://www.kurento.org/e Telepresence: https://code.google.com/p/telepresence/ – Cracker0dks

Problemi correlati