我想使用socket.io将音频缓冲区从JavaScript流式传输到我的烧瓶服务器。但套接字实例未定义'当我想在音频回调函数中使用它时。
在这段代码中,主线程中的socket实例是' socket'。功能'记录'每次从麦克风收到新的缓冲区时,都会从工作人员调用。
但是socket.emit总是给我:
未捕获的ReferenceError:socket未定义记录@ 斑点:http://localhost:7777/400a58bc-b64f-4c66-9bb1-65a28bf9bfba:39onmessage @ blob:http://localhost:7777/400a58bc-b64f-4c66-9bb1-65a28bf9bfba:15
如何从工作人员中正确访问套接字?
在主线程中,我有来自web worker的socket对象和postMessage中调用的方法:
var socket = io.connect('http://' + document.domain + ':'+location.port);
socket.on('connect', function() {
socket.emit('my event', {data: 'I\'m connected!'});
});
...
function record(inputBuffer){
var buf = inputBuffer[0]
///////HERE THE socket CANNOT BE FOUND, WHY??
socket.emit('audio event',{data : buf})
}
在网络工作者帖子中,postMessage调用'记录'方法:
this.onmessage = function(e){
switch(e.data.command){
case 'record':
/////HERE THE 'record' FUNCTION IS CALLED IN THE MAIN THREAD
record(e.data.buffer);
break;
}
};
...
(function(window){
var Recorder = function(source, cfg){
this.context = source.context;
if(!this.context.createScriptProcessor){
this.node = this.context.createJavaScriptNode(bufferLen, 2, 2);
} else {
this.node = this.context.createScriptProcessor(bufferLen, 2, 2);
}
var currCallback;
this.node.onaudioprocess = function(e){
////THIS IS THE CALLBACK FROM MICROPHONE HARDWARE
worker.postMessage({
command: 'record',
buffer: [
e.inputBuffer.getChannelData(0),
e.inputBuffer.getChannelData(1)
]
});
}
this.record = function(){
recording = true;
}
worker.onmessage = function(e){
var blob = e.data;
currCallback(blob);
}
window.Recorder = Recorder;
})(window);
答案 0 :(得分:0)
如果您的套接字位于主线程中,则无法从webWorker访问它。这是webWorkers的限制。您不能在主线程和webWorker之间共享变量。由于并发问题,存在此限制。
你在这里的选择是:
在webWorker中创建webSocket,因此socket
变量存在于webWorker中,可以在那里使用。
如果要从webWorker中向webSocket发送数据,请将数据作为参数发送到主线程,要求它在webSocket上发送数据并让主线程执行实际发送。因此,webSocket上的所有发送都将保留在主线程中。