2015-02-10 32 views
1

我必須通過websocket服務器發送大量ArrayBuffers(音頻語音數據)。問題是,客戶端必須知道傳入數據是哪種類型的ArrayBuffer(Uint8/Uint16/Float32 ...)。如果用戶切換到其他音頻質量,該類型可以隨時更改。如何通過Websockets路由不同的數據類型?

通知客戶有關數組類型的最佳方式是什麼?

想法而已:

  • 把一個額外的前綴字節數組(這可能是緩慢的,因爲我要創建一個新的arrayBuffer爲每一個音頻塊)
  • 使用諸如/ 16float或不同的途徑/ uint8知道哪些數據即將到來。 (我還沒有找到任何信息如何使用websockets完成)

有沒有更好的方法來做到這一點?任何人都可以給我一個例子如何使用websockets的URL路徑路線工作?


編輯: 我實現前綴字節發送關於客戶端和數組類型的信息,但在更好的/其他的解決方案仍然感興趣。

+0

您可以發送一個類型爲「'{type:」uint8「,data:myArrayBuffer}'的對象。 – jfriend00 2015-02-10 01:19:59

+0

不幸的是,當我傳輸的數據比數據元素多時,我沒有語音。 myWebSocket.send([e.data,「s」]);和var voice = new Uint16Array(data [0]);來測試它。但不工作,因爲「聲音」是空的。不知道爲什麼websockets是如此不情願。 – Cracker0dks 2015-02-10 01:52:21

+0

好的,我正在考慮爲您封裝數據結構的'socket.io'。不是我猜想的香草webSocket界面。 – jfriend00 2015-02-10 02:48:17

回答

1

Cracker0dks,爲什麼你使用純websockets而不是庫。有了primus,你可以使用substream - 命名空間 - 這或多或少正是你想要的 - 你也可以使用帶有primus的二元分析器。

Socket.io也是一種選擇,但他們並不像普里默斯。好(在我看來)

目前它是最支持/穩定/完整的WS

// server side: 
var primus 
    , server 
    , substream 
    , http 
    , Uint8 
    , Uint16 
    , Float32 
    ; 

Primus = require('primus'); 
http = require('http'); 
substream = require('substream'); 

server = http.createServer(); 
primus = new Primus(server); 

primus.use('substream', substream); 
server.listen(8000); 

primus.on('connection', function (spark) { 
    Uint8 = spark.substream('Uint8'); 
    Uint16 = spark.substream('Uint16'); 
    Float32 = spark.substream('Float32'); 

    Uint8.on('data', function (data) { 
     console.log(data); //we recieve data from client on Uint8 ('to server') 
    }); 

    Uint16.on('data', function (data) { 
     console.log(data); //we recieve data from client on Uint16 ('to server') 
    }); 

    Float32.on('data', function (data) { 
     console.log(data); //we recieve data from client on Float32 ('to server') 
    }); 

    Uint8.write('to client'); // write data to client to Uint8 
    Uint16.write('to client'); // write data to client to Uint16 
    Float32.write('to client'); // write data to client to Float32 

    // 
    // piping data to Float32 
    // 
    fs.createReadSteam(__dirname + '/example.js').pipe(Float32, { 
     end: false 
    }); 

    // 
    // To stop receiving data, simply end the substream: 
    // 
    Uint16.end(); 
}); 




// client side: 
var primus 
    , Uint8 
    , Uint16 
    , Float32 
    ; 
primus = new Primus('server address'); 
Uint8 = primus.substream('Uint8'); 
Uint8.write('to server'); // write data to server to Uint8 

Uint16 = primus.substream('Uint16'); 
Uint16.write('to server'); // write data to server to Uint16 

Float32 = primus.substream('Float32'); 
Float32.write('to server'); // write data to server to Float32 


Uint8.on('data', function (data) { 
    console.log(data); // you get data from server to Uint8 ('to client') 
}); 

Uint16.on('data', function (data) { 
    console.log(data); // you get data from server to Uint8 ('to client') 
}); 

Float32.on('data', function (data) { 
    console.log(data); // you get data from server to Uint8 ('to client') 
}); 

上述解決方案被從他們的文檔中提取出來並更改爲適合您的示例 - 我沒有測試它,但它應該可以正常工作。

我希望有所幫助。

+0

是的,這是一個很好的方式來做到這一點。謝謝! – Cracker0dks 2015-02-21 02:33:51

+0

不客氣。你有沒有得到它的工作? – 2015-02-21 02:46:53

+0

還沒有,我的解決方案前綴字節的作品,所以我必須首先解決其他問題。但是我閱讀了doc和primus是一個非常酷的框架,當我得到我的應用程序的其餘工作時,我將執行這個框架。我還必須找到一種方法來告訴客戶端哪個數據幀來自哪個客戶端,所以也許我必須通過前綴字節來做到這一點。但這一切真的沒有問題在最後...您的解決方案應該工作(根據文檔),所以你得到的觀點:) – Cracker0dks 2015-02-21 18:21:19

相關問題