我正在尝试建立一个实时音频流系统,客户端将从麦克风(使用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表示(我使用在SO上找到的方法,应该可以工作)。
然后,在数据通过WebSocket之后,我在另一个脚本中收集数据,该脚本将在每个对等方的网站上执行:
var audioCtx = new AudioContext();
var arrayBuffer = _base64ToArrayBuffer(mediaJSON.sound);
audioCtx.decodeAudioData(arrayBuffer, function(buffer) {
playSound(buffer);
});
我还需要将收到的base64数据转换为ArrayBuffer,然后由decodeAudioData解码,以生成AudioBuffer类型的audioBuffer。 playSound函数就像这样简单:
function playSound(arrBuff) {
var src = audioCtx.createBufferSource();
src.buffer = arrBuff;
src.looping = false;
src.connect(audioCtx.destination);
src.start();
}
但由于某些原因,我无法在这个剧本上播放任何声音。我很确定广播脚本是正确的,但不是“监听器”脚本。谁可以帮我这个事 ?
谢谢!