通过socket.io 1.0实时播放音频

ang*_*ngo 6 sockets audio html5 stream node.js

来自socket.io网站

二进制流

从1.0开始,可以来回发送任何blob:图像,音频,视频.

我现在想知道,如果这不是我最近想要实现的目标的解决方案.

我实际上正在寻找一种方法,如何将(A - 即麦克风输入..)的实时音频流广播到连接到我的网站的所有客户端.这样的事情可能吗?我一直在搞乱WebRTC(https://www.webrtc-experiment.com/)的例子,但我无法管理超过几个连接客户端的目标.

我的想法是关于像A一样的getUserMedia或任何其他音频源(PCM,等等......)被切碎到块并提供给客户端并且例如通过html5音频元素或任何东西播放...我需要尽可能多地制作该流尽可能实时,没有喊叫/冰铸服务不够快(事实上,他们不解决我的问题,他们的意思是这样使用)我并不真正关心音频质量.跨平台兼容性非常棒.

有可能吗?通过使用socket.io作为如何向客户端提供这些数据的方式?

我将非常感谢能够帮助我实现这一目标的任何参考,提示或来源.非常感谢.

Deh*_*hli 5

本示例说明如何使用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();
});
Run Code Online (Sandbox Code Playgroud)

服务器代码

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