Javascript ScriptProcessorNode跳过
我有以下javascript代码:Javascript ScriptProcessorNode跳过,javascript,audio,web-audio-api,Javascript,Audio,Web Audio Api,我有以下javascript代码: var audio = null; try { window.AudioContext = window.AudioContext || window.webkitAudioContext; audio = new AudioContext(); } catch (e) { alert("Web Audio API is not supported in this browser"); } var scriptNode = audi
var audio = null;
try {
window.AudioContext = window.AudioContext || window.webkitAudioContext;
audio = new AudioContext();
} catch (e) {
alert("Web Audio API is not supported in this browser");
}
var scriptNode = audio.createScriptProcessor(1024, 0, 1);
var pos = 0.0;
scriptNode.onaudioprocess = function(audioProcessingEvent) {
var output = audioProcessingEvent.outputBuffer;
for (var channel = 0; channel < output.numberOfChannels; channel++) {
var data = output.getChannelData(channel);
for (var i = 0; i < data.length; i++) {
data[i] = Math.sin(pos);
pos += 2.0 * 3.14159 * 440.0 / audio.sampleRate;
while (pos >= 2.0 * 3.14159) {
pos -= 2.0 * 3.14159;
}
}
}
}
scriptNode.connect(audio.destination);
var audio=null;
试一试{
window.AudioContext=window.AudioContext | | window.webkitadiocontext;
音频=新的音频上下文();
}捕获(e){
警报(“此浏览器不支持Web音频API”);
}
var scriptNode=audio.createScriptProcessor(1024,0,1);
var pos=0.0;
scriptNode.onaudioprocess=函数(audioProcessingEvent){
var输出=audioProcessingEvent.outputBuffer;
用于(var通道=0;通道=2.0*3.14159){
pos-=2.0*3.14159;
}
}
}
}
scriptNode.connect(audio.destination);
我正在尝试访问web音频的音频循环,这与C语言中的低级音频流API的工作方式非常相似。这段代码应该连续播放440 Hz的音调,直到页面关闭。代码将播放该音调,但一两秒钟后,声音会反复跳过,这表明缓冲区空间已用完,并且没有在每个缓冲区调用脚本
我相信解决这个问题的方法很简单,但是到底是什么导致了跳绳呢?如何使此脚本连续运行
编辑:如果我刷新页面,跳过就会消失。这是浏览器错误吗?将ScriptProcessor节点的缓冲区大小从1024增加到更大。或者使用0让浏览器为您选择一个值
注意:ScriptProcessors也已弃用,但其替代品尚不可用。替换应该表现得更好。例如,间隔为4秒
var audio = null;
try {
window.AudioContext = window.AudioContext || window.webkitAudioContext;
audio = new AudioContext();
} catch (e) {
alert("Web Audio API is not supported in this browser");
}
var INTERVAL = 4; // 4 [sec]
var scriptNode = audio.createScriptProcessor(1024, 0, 1);
var pos = 0.0;
var elapsedBuffer = 0;
scriptNode.onaudioprocess = function(audioProcessingEvent) {
var output = audioProcessingEvent.outputBuffer;
for (var channel = 0; channel < output.numberOfChannels; channel++) {
var data = output.getChannelData(channel);
for (var i = 0; i < data.length; i++) {
elapsedBuffer++;
if (elapsedBuffer > audio.sampleRate) {
if (elapsedBuffer > (INTERVAL * audio.sampleRate)) {
elapsedBuffer = 0;
}
data[i] = 0;
continue;
}
data[i] = Math.sin(pos);
pos += 2.0 * 3.14159 * 440.0 / audio.sampleRate;
while (pos >= 2.0 * 3.14159) {
pos -= 2.0 * 3.14159;
}
}
}
};
scriptNode.connect(audio.destination);
var audio=null;
试一试{
window.AudioContext=window.AudioContext | | window.webkitadiocontext;
音频=新的音频上下文();
}捕获(e){
警报(“此浏览器不支持Web音频API”);
}
变量间隔=4;//4[秒]
var scriptNode=audio.createScriptProcessor(1024,0,1);
var pos=0.0;
var elapsedBuffer=0;
scriptNode.onaudioprocess=函数(audioProcessingEvent){
var输出=audioProcessingEvent.outputBuffer;
用于(var通道=0;通道audio.sampleRate){
if(elapsedBuffer>(间隔*音频采样器)){
elapsedBuffer=0;
}
数据[i]=0;
继续;
}
数据[i]=Math.sin(pos);
pos+=2.0*3.14159*440.0/audio.sampleRate;
而(位置>=2.0*3.14159){
pos-=2.0*3.14159;
}
}
}
};
scriptNode.connect(audio.destination);
是非常有用的Web音频API库。请稍候。。。他们不赞成某些东西而不先更换?真的吗?如果我给它0,我仍然会跳过它,不过:/Yes,它已经被弃用了。这并不意味着你现在不能使用它,但希望它最终会消失。请尝试32768,最大尺寸,而不是0。您使用的是什么浏览器和操作系统?16384可以工作,但这是一个巨大的延迟。我用4096跳过,这也是太多的延迟。