我正在尝试创建一个实验应用程序,它可以实时地将音频从client 1流到client 2。
因此,按照有关同一主题的一些教程和问题,我使用了WebRTC和binaryjs。到目前为止,这是我得到的
Client 1和Client 2已经连接到BinaryJS来发送/接收数据块。
2- Client 1使用WebRTC记录音频,并逐渐发送给BinaryJS。
3- Client 2接收到块并尝试播放它们。
嗯,我在最后一部分中出了个错误。这是我得到的错误消息:
RangeError:源代码太大了 在Float32Array.set (本地)
这是密码:
客户端1
var WSClient;
var AudioStream;
function load(){
var session = {
audio: true,
video: false
};
var recordRTC = null;
navigator.getUserMedia(session, startRecording, onError);
WSClient = new BinaryClient('ws://localhost:9001');
WSClient.on('open',function(){
console.log('client opened')
AudioStream = WSClient.createStream();
})
}
function startRecording(stream){
var context = new AudioContext();
var audio_input = context.createMediaStreamSource(stream);
var buffer_size = 2048;
var recorder = context.createScriptProcessor(buffer_size, 1, 1);
recorder.onaudioprocess = function(e){
console.log('chunk')
var left = e.inputBuffer.getChannelData(0);
AudioStream.write(left);
};
audio_input.connect(recorder);
recorder.connect(context.destination);
}Client 2
var WSClient;
var audioContext;
var sourceNode;
function load(){
audioContext = new AudioContext();
sourceNode = audioContext.createBufferSource();
sourceNode.connect(audioContext.destination);
sourceNode.start(0);
WSClient = new BinaryClient('ws://localhost:9001');
WSClient.on('open',function(){
console.log('client opened');
});
WSClient.on('stream', function(stream, meta){
// collect stream data
stream.on('data', function(data){
console.log('received chunk')
var integers = new Int16Array(data);
var audioBuffer = audioContext.createBuffer(1, 2048, 4410);
audioBuffer.getChannelData(0).set(integers); //appearently this is where the error occurs
sourceNode.buffer = audioBuffer;
});
});
}服务器
var wav = require('wav');
var binaryjs = require('binaryjs');
var binaryjs_server = binaryjs.BinaryServer;
var server = binaryjs_server({port: 9001});
server.on('connection', function(client){
console.log('server connected');
var file_writter = null;
client.on('stream', function(stream, meta){
console.log('streaming', server.clients)
//send to other clients
for(var id in server.clients){
if(server.clients.hasOwnProperty(id)){
var otherClient = server.clients[id];
if(otherClient != client){
var send = otherClient.createStream(meta);
stream.pipe(send);
}
}
}
});
client.on('close', function(stream){
console.log('client closed')
if(file_writter != null) file_writter.end();
});
});错误发生在这里:
audioBuffer.getChannelData(0).set(integers);所以我有两个问题:
是否可以发送我在client 1中捕获的块,然后在client 2中复制它们?
我所犯的错误是怎么处理的?
谢谢你们!
@编辑1
由于我从其他问题中得到了代码片段,所以我仍然试图理解它。我在client 2代码中注释了创建Int16Array的行,现在得到了一个不同的错误(但我不知道哪个版本的代码更正确):
Uncaught :未能在“AudioBufferSourceNode”上设置“缓冲区”属性:无法在已设置缓冲区后设置缓冲区
可能是因为每次我得到新的数据时都会设置它。
发布于 2017-11-14 16:17:57
DOMException about AudioBufferSourceNode意味着您需要为正在创建的每个新Audiobuffer创建一个新的AudioBufferSourceNode。所以就像
sourceNode = new AudioBufferSourceNode(audioContext, {buffer: audioBuffer})
AudioBuffer有Float32Array,您需要在将Int16Array分配给AudioBuffer之前将其转换为Float32Array。很可能足以除以32768。
https://stackoverflow.com/questions/47274120
复制相似问题