2015-05-29 90 views
2

我想通過getUserMedia()使用webrtc並使用socket.io將音頻發送到服務器(socket.io支持音頻,視頻,binarydata)然後服務器會將其廣播給所有連接的客戶端。問題是當流到達連接的客戶端時,它被轉換成JSON對象而不是媒體流對象。所以我無法發送音頻我也嘗試過socket.io-stream模塊,但我沒有成功。你能幫我正確捕獲音頻流併發送給所有連接的客戶端。在node.js中使用socket.io通過webrtc廣播現場音頻

下面是客戶端的代碼誰發送數據

navigator.getUserMedia({audio: true, video: false}, function(stream) { 
    video.src = window.URL.createObjectURL(stream); 
    webcamstream = stream; 
    media = stream; /// here the datatype of media is mediaStream object 
    socket.emit("sendaudio", media); 
}, function(e){ 
    console.log(error); 
}); 

雖然在收到客戶端的代碼如下

socket.on('receiveaudio' , function(media) 
{ 
    console.log(media); //but here i am receiving it as a simple object 
    other.src= media; 
}); 
+0

我想你的目標應該是發送二進制數據,如'Buffer'或'Blob'對象。 Socket.io自1.0開始支持二進制數據。 嘗試將您將mediaStream對象轉換爲緩衝區,然後發送它。另一方面,根據緩衝區重新創建對象。 –

+0

@MaximePiraux你可以發送任何好的教程或例子的鏈接,可以幫助我將媒體流轉換成緩衝區或blob.i發現它很難做到。 –

回答

1

我複製我的回答從here

本示例說明如何使用MediaRecorder上傳音頻,然後使用socket.io轉發。此代碼只會在您撥打mediaRecorder.stop()後纔會播出。您可以選擇在ondataavailable內進行廣播。如果你這樣做,你可能想通過timeslicemediaRecorder.start(),所以它不會經常觸發ondataavailable

這個解決方案並不真實,但我認爲它會幫助那些回來找到這個問題的人。

客戶端代碼

var constraints = { audio: true }; 
navigator.mediaDevices.getUserMedia(constraints).then(function(mediaStream) { 
    var mediaRecorder = new MediaRecorder(mediaStream); 
    mediaRecorder.onstart = function(e) { 
     this.chunks = []; 
    }; 
    mediaRecorder.ondataavailable = function(e) { 
     this.chunks.push(e.data); 
    }; 
    mediaRecorder.onstop = function(e) { 
     var blob = new Blob(this.chunks, { 'type' : 'audio/ogg; codecs=opus' }); 
     socket.emit('radio', blob); 
    }; 

    // Start recording 
    mediaRecorder.start(); 

    // Stop recording after 5 seconds and broadcast it to server 
    setTimeout(function() { 
     mediaRecorder.stop() 
    }, 5000); 
}); 

// When the client receives a voice message it will play the sound 
socket.on('voice', function(arrayBuffer) { 
    var blob = new Blob([arrayBuffer], { 'type' : 'audio/ogg; codecs=opus' }); 
    var audio = document.createElement('audio'); 
    audio.src = window.URL.createObjectURL(blob); 
    audio.play(); 
}); 

服務器代碼

socket.on('radio', function(blob) { 
    // can choose to broadcast it to whoever you want 
    socket.broadcast.emit('voice', blob); 
});