Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/428.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 口吃;“机器人”;通过网络音频API录制WAV音频_Javascript_Web Audio Api - Fatal编程技术网

Javascript 口吃;“机器人”;通过网络音频API录制WAV音频

Javascript 口吃;“机器人”;通过网络音频API录制WAV音频,javascript,web-audio-api,Javascript,Web Audio Api,我正在使用Web Audio API从应用程序用户按住特定键(例如按键通话)时的浏览器中捕获音频的波形音频剪辑(更新:不使用按键通话时也会发生)。许多录音中的音频都会结巴;您可以(约5秒开始)和。如何诊断(或修复)此问题?(我在createScriptProcessor中玩弄了很多缓冲区大小,但都没有用。) 使用该应用程序的电脑都是MacBook Pros,在OS X 10.8或10.9上运行Chrome 36(更新:也就是10.10上的Chrome 39/40)。这是chrome://vers

我正在使用Web Audio API从应用程序用户按住特定键(例如按键通话)时的浏览器中捕获音频的波形音频剪辑(更新:不使用按键通话时也会发生)。许多录音中的音频都会结巴;您可以(约5秒开始)和。如何诊断(或修复)此问题?(我在
createScriptProcessor
中玩弄了很多缓冲区大小,但都没有用。)

使用该应用程序的电脑都是MacBook Pros,在OS X 10.8或10.9上运行Chrome 36(更新:也就是10.10上的Chrome 39/40)。这是chrome://version 对于记录上面链接的样本的机器:

googlechrome:36.0.1985.143(官方版本287914)
操作系统:MacOSX
闪烁:537.36(@179211)
JavaScript:V8 3.26.31.15
闪光:14.0.0.177
用户代理:Mozilla/5.0(Macintosh;英特尔Mac OS X 10_8_5)AppleWebKit/537.36(KHTML,如Gecko)Chrome/36.0.1985.143 Safari/537.36
命令行:/Applications/Google Chrome.app/Contents/MacOS/Google Chrome--标志开关开始--标志开关结束
可执行路径:/Applications/Google Chrome.app/Contents/MacOS/Google Chrome
配置文件路径:/Users/jason/Library/Application Support/Google/Chrome/Default
变体:e950616e-37fb3cc2
8afebf76-771ac34e
c70841c8-4866ef6e
195ce1b5-d93a0620
c4126e6a-ca7d8d80
9e5c75f1-ad69ceb0
262f996f-7075cd8
24dca50e-837c4893
ca65a9fe-91ac3782
8d790604-9cb2a91c
4ea303a6-3D47F4
d8f57532-3f4a17df
b2612322-f8cf70e2
5a3c10b5-e1cc0f14
244ca1ac-4ad60575
f47ae82a-86f22ee5
5e29d81-cf4f6ead
3ac60855-486e2a9c
246fb659-6e597ede
f296190c-65255996
4442aae2-6e597ede
ed1d377-e1cc0f14
75F0A0-a5822863
e2b18481-d7f6b13c
e7e71889-4ad60575
cbf0c14e-bf3e6cfd
录音代码的相关部分如下(略为简化):

函数startRecording(){
getUserMedia({audio:true,video:false},函数(流){
audioContext=audioContext | |新建窗口。webkitAudioContext();
输入=audioContext.createMediaStreamSource(流);
node=input.context.createScriptProcessor(4096,1,1);
输入连接(节点);
连接(audioContext.destination);
this.worker=new worker(this.workerUrl);//参见下面的Web worker代码
this.worker.addEventListener(“消息”,this.handleWorkerMessage.bind(this));
this.worker.postMessage({command:“init”});
node.addEventListener(“audioprocess”,this.onAudioProcess);
});
}
函数stopRecording(){
此项记录=错误;
this.worker.postMessage({command:“end”});
}
函数onAudioProcess=函数(evt){
如果(!this.recording | | stream.end)返回;
var channelLeft=evt.inputBuffer.getChannelData(0);
channelLeft=新的Float32Array(channelLeft);
this.worker.postMessage({command:“encode”,buffer:channelLeft});
}
函数handleWorkerMessage=函数(evt){
var数据=evt.data;
开关(data.command){
案例“结束”:
这个.appendToBuffer(data.buffer);
var观点;
试一试{
视图=新数据视图(this.buffer);
var blob=new blob([view],{type:this.mimeType});
这个.回调(blob);
}最后{
this.worker.terminate();
node.removeEventListener(“audioprocess”,this.onAudioProcess);
}
打破
}
}
函数appendToBuffer=函数(缓冲区){
如果(!this.buffer){
this.buffer=缓冲区;
}否则{
var tmp=新的UINT8阵列(this.buffer.byteLength+buffer.byteLength);
tmp.set(新的Uint8Array(this.buffer),0);
tmp.set(新的Uint8Array(buffer),this.buffer.bytellength);
this.buffer=tmp.buffer;
}
}
下面是保存传递给它的缓冲区并在最后构建WAV的Web Worker(此代码大量借用RecordRTC):

var缓冲区,
长度=0,
采样器=44100;
函数concatBuffers(缓冲区,总长度){
var buf;
var结果=新的Float32Array(总长度);
var偏移=0;
var lng=缓冲区长度;
对于(var i=0;i