2013-03-26 14 views
8

Ho cercato su Google questo e guardandomi attorno a StackOverflow per un po 'ma non ho trovato una soluzione - da qui il post.Streaming Binary con Node.js e WebSockets

Sto giocando con Node.js e WebSockets per curiosità. Sto cercando di trasmettere alcuni dati binari (un mp3) al client. Il mio codice finora è sotto ma ovviamente non funziona come previsto.

Sospetto che il mio problema è che in realtà non sto inviando dati binari dal server e vorrei qualche chiarimento/aiuto.

Heres mio server ...

var fs = require('fs'); 
var WebSocketServer = require('ws').Server; 

var wss = new WebSocketServer({port: 8080,host:"127.0.0.1"}); 
wss.on('connection', function(ws) {  
    var readStream = 
    fs.createReadStream("test.mp3", 
    {'flags': 'r', 
     'encoding': 'binary', 
     'mode': 0666, 
     'bufferSize': 64 * 1024}); 

    readStream.on('data', function(data) { 
     ws.send(data, {binary: true, mask: false}); 
    }); 
}); 

e il mio cliente ...

context = new webkitAudioContext(); 
var ws = new WebSocket("ws://localhost:8080"); 
ws.binaryType = 'arraybuffer'; 

ws.onmessage = function (evt) { 
    context.decodeAudioData(
    evt.data, 
     function(buffer) { 
      console.log("Success"); 
     }, 
     function(error) { 
      console.log("Error"); 
     }); 
}; 

La chiamata di decodificare sempre finiscono nella richiamata errore. Presumo questo perché riceve dati errati.

Quindi la mia domanda è come eseguire correttamente il flusso del file come file binario?

Grazie

+0

Potete prego fornire piena esempio o il codice per questo come sto imparando node.js e prese web e le mie esigenze sono anche stessi –

risposta

0

Problema risolto.

Ho risolto questo problema con una combinazione di rimuovere il " 'encoding': 'binario'" parametro dei opzioni passate a "createReadStream()" e la soluzione a ...

decodeAudioData returning a null error

Come alcuni dei miei commenti, quando ho aggiornato le opzioni createReadStream, il primo blocco era in riproduzione, ma tutti gli altri blocchi eseguivano il callback onError da decodeAudioData(). La soluzione nel link sopra ha risolto questo problema per me. Sembra che decodeAudioData() sia un po 'schizzinoso su come i blocchi che riceve dovrebbero essere formattati. Essi dovrebbero essere validi pezzi apparentemente ...

Define 'valid mp3 chunk' for decodeAudioData (WebAudio API)

+2

puoi per favore fornirmi un esempio completo o un codice per questo poiché sto imparando node.js e web socket e i miei requisiti sono audo streaming in html –

3

Che il server sta facendo è che è l'invio di dati costituite da dati audio binari in 64 KB pezzi al vostro cliente. Il client dovrebbe ricostruire il file audio prima di chiamare decodeAudioData.

Stai chiamando decodeAudioData ogni volta che il tuo cliente riceve un messaggio su websocket. Devi creare un buffer separato per aggiungere tutti i pezzi ad esso. Quindi, al completamento del trasferimento, il buffer deve essere immesso in decodeAudioData.

Sono disponibili due opzioni: ora

  1. si carica tutto il file (fs.read) senza l'utilizzo di eventi di flusso e inviare l'intero file con ws.send (facile da fare)
  2. Si utilizza eventi streaming , modifica il tuo client per accettare blocchi di dati e assemblarli prima di chiamare decodeAudioData
+0

Grazie per il feedback. Darò questo via. In precedenza stavo guardando fs.read ma non voglio leggere il file in una volta sola. – fatlog

+0

In realtà, solo pensando a questa soluzione.Questo non significa che non stia davvero trasmettendo il file? Aspetterò di ricevere l'intero file prima di iniziare a riprodurlo ... – fatlog

+0

Solo un aggiornamento. Penso che il problema potrebbe essere legato a ... http://stackoverflow.com/questions/10470742/define-valid-mp3-chunk-for-decodeaudiodata-webaudio-api Ho provato a utilizzare readFile invece di createReadSTream e funziona perfettamente - come nel file viene passato e inizia a giocare. Tuttavia, non è in streaming ... – fatlog