繁体   English   中英

在node.js中使用socket.io通过WebRTC广播实时音频

[英]Broadcasting live audio through webrtc using socket.io in node.js

我正在尝试使用webrtc通过getUserMedia()并使用socket.io将音频发送到服务器(socket.io支持音频,视频,二进制数据),然后服务器会将其广播到所有连接的客户端。 问题是,当流到达连接的客户端时,它将转换为JSON对象而不是媒体流对象。 所以我无法发送音频,但我也尝试过socket.io-stream模块,但是我没有成功。 您能帮我正确捕获音频流并将其发送到所有连接的客户端吗?

这是发送数据的客户的代码

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

我从这里复制了我的答案。

本示例说明如何使用MediaRecorder上传音频,然后使用socket.io转发音频。 仅当您被称为mediaRecorder.stop()后,此代码才会广播。 您可以选择在ondataavailable内部广播。 如果这样做,您可能希望将timeslice传递给mediaRecorder.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);
});

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM