Javascript 使用WebRTC和WebAudio(WebSockets)的实时流媒体音频

Javascript 使用WebRTC和WebAudio(WebSockets)的实时流媒体音频,javascript,audio,webrtc,live-streaming,web-audio-api,Javascript,Audio,Webrtc,Live Streaming,Web Audio Api,我正在尝试建立一个实时音频流系统,客户端将从他的麦克风(通过getUserMedia访问)向一个或多个对等方广播音频。 为此,音频流的块通过WebSocket发送到服务器,然后服务器将此信息中继到连接到WebSocket的所有对等方 我的主要问题来自如何播放网站上同龄人接收到的大量数据 首先,这就是我在客户端广播JS脚本上发送音频数据块的方式: var context = new AudioContext(); var audioStream = context.createMediaStrea

我正在尝试建立一个实时音频流系统,客户端将从他的麦克风(通过getUserMedia访问)向一个或多个对等方广播音频。 为此,音频流的块通过WebSocket发送到服务器,然后服务器将此信息中继到连接到WebSocket的所有对等方

我的主要问题来自如何播放网站上同龄人接收到的大量数据

首先,这就是我在客户端广播JS脚本上发送音频数据块的方式:

var context = new AudioContext();
var audioStream = context.createMediaStreamSource(stream);
// Create a processor node of buffer size, with one input channel, and one output channel
var node = context.createScriptProcessor(2048, 1, 1);
// listen to the audio data, and record into the buffer
node.onaudioprocess = function(e){
        var inputData = e.inputBuffer.getChannelData(0);
        ws.send(JSON.stringify({sound: _arrayBufferToBase64(convertoFloat32ToInt16(inputData))}));
}
audioStream.connect(node);
node.connect(context.destination);
arrayBufferToBase64和convertoFloat32ToInt16是我用来分别以base64格式发送流,并将inputData转换为Int16的方法,而不是那种花哨的Float32表示法(我使用了在上面找到的方法,应该可以工作)

然后,在数据通过WebSocket之后,我在另一个脚本中收集数据,该脚本将在每个对等方的网站上执行:

var audioCtx = new AudioContext();
var arrayBuffer = _base64ToArrayBuffer(mediaJSON.sound);
audioCtx.decodeAudioData(arrayBuffer, function(buffer) {
     playSound(buffer);
});
我还需要将接收到的base64数据转换为ArrayBuffer,然后由DecodeAudoData对其进行解码,以生成audioBuffer类型的audioBuffer。playSound功能非常简单,如下所示:

function playSound(arrBuff) {
    var src = audioCtx.createBufferSource();
    src.buffer = arrBuff;
    src.looping = false;
    src.connect(audioCtx.destination);
    src.start();
}
但由于某些原因,我无法在这个脚本上播放任何声音。我很肯定广播脚本是正确的,但不是“听众”脚本。有人能帮我吗


谢谢

为什么不使用WebRTC并让浏览器为您完成所有工作?有多少同龄人?另请参见:@Brad我当前使用的体系结构基于WebSocket,用于服务器和客户端之间的所有通信,我无法将其更改为基于WebRTC对等。可以同时连接多个对等点。我已经检查了该链接,但我的问题来自于在接收新数据块时在客户端网站上播放音频的方式。你确定audioBuffer的作用域是正确的吗?如果这不是全局范围,我不确定它是否是。@cwilso你的意思是不应该在函数中声明audioBuffer?如果在解码数据之前声明范围,那么范围不是正确的吗?我知道这是一个老问题,但我可以发现一个错误<在设置
audioBuffer
之前,正在调用code>playSound。您需要从回调内部调用它,以确保在使用它之前设置好它。您甚至不需要
audioBuffer
。您只需使用
播放声音(缓冲区)