Javascript Webaudio声音在Android浏览器上大约2分钟后停止

Javascript Webaudio声音在Android浏览器上大约2分钟后停止,javascript,android,google-chrome,web-audio-api,Javascript,Android,Google Chrome,Web Audio Api,我遇到了一个关于Android浏览器上WebAudio的问题 我在三星Galaxy S3(GT-I9300)上体验到了这一点: Chrome版本44.0.2403.133 安卓4.3.0 下面是我用来尝试隔离问题的代码: var audioContext; if(window.AudioContext) { audioContext = new AudioContext(); } var startTime = Date.now(); var lastTrigger; var g

我遇到了一个关于Android浏览器上WebAudio的问题

我在三星Galaxy S3(GT-I9300)上体验到了这一点:

  • Chrome版本44.0.2403.133
  • 安卓4.3.0
下面是我用来尝试隔离问题的代码:

var audioContext;
if(window.AudioContext) {
    audioContext = new AudioContext();
}

var startTime = Date.now();
var lastTrigger;

var gain = audioContext.createGain();
gain.gain.value = 1;
gain.connect(audioContext.destination);

var buttonTrigger = document.getElementById('trigger');
buttonTrigger.addEventListener('click', function(event) {
    var oscillator =  audioContext.createOscillator();
    oscillator.type = "square";
    oscillator.frequency.value = 100 +  (Math.cos(audioContext.currentTime)*100);
    oscillator.connect(gain);
    oscillator.start(0);
    oscillator.stop(audioContext.currentTime+0.1);

    lastTrigger = Date.now();
});

var timer = document.getElementById('timer');
setInterval(function() {
    if(lastTrigger) { timer.textContent = Date.now() - lastTrigger; }
}, 1000);
现在开始了

这只需创建一个振荡器节点并单击按钮即可播放。在我的手机上,如果我在大约一分半或两分钟内没有点击按钮,我将不再听到任何声音

没有抛出错误

是否有人对此问题有任何经验以及可能的解决方法

这个问题最初出现在一个更大的应用程序中,该应用程序使用Phaser播放m4a文件中的声音,因此这不仅仅与振荡器有关

更新

据报道,这个问题现在已经解决了。

我想你看到的是,当一段时间没有声音时,网络音频会自动关闭。如果您再次单击按钮,或者在第一次单击按钮后的第二次左右,会发生什么情况?(重新启动网络音频可能需要一些时间(至少几十毫秒)

suspend()/resume()方法,并查看context.state,在这里会很有帮助。

我想您看到的是,当一段时间没有声音时,Web音频会自动关闭。如果您再次单击按钮,或者在第一次单击按钮后的第二次左右,会发生什么情况?(重新启动网络音频可能需要一些时间(至少几十毫秒)


suspend()/resume()方法,并查看context.state,在这里会很有帮助。

@raymondoy的评论回答了这个问题。Android上的Chrome有一个bug(至少三星Galaxy S3/4是这样)。Webaudio在一段时间不活动后停止播放声音。不活动本质上就是沉默

我能找到的唯一解决办法就是每隔一段时间播放某种声音。我曾经尝试过每30秒播放一次声音,这就解决了这个问题


我还试着播放某种无声噪音(无声音频缓冲区或m4a音频文件的无声部分或静音),但这两种声音都没有解决问题。

@raymondoy的评论回答了这个问题。Android上的Chrome有一个bug(至少三星Galaxy S3/4是这样)。Webaudio在一段时间不活动后停止播放声音。不活动本质上就是沉默

我能找到的唯一解决办法就是每隔一段时间播放某种声音。我曾经尝试过每30秒播放一次声音,这就解决了这个问题


我还尝试过播放某种无声噪音(无声音频缓冲区或m4a音频文件的无声部分或静音),但这两种声音都没有解决问题。

在Android上遇到同样的问题后。我找到了一个比每30秒播放一次“虚拟声音”更好的解决方案

只需记住您上次播放上下文的时间:

var lastPlayed = new Date().getTime();
var audioSource = context.createBufferSource();
    audioSource.connect( context.destination );
    audioSource.buffer = sb;
    audioSource.start( 0 );
下次播放样本/声音时,只需检查经过的时间并重置AudioContext

if(new Date().getTime()-lastPlayed>30000){   // Time passed since last playing is greater than 30 secs
     context.close();
     context=new AudioContext();
}

对于Android,这就像魅力一样有效。

在Android上遇到同样的问题后。我找到了一个比每30秒播放一次“虚拟声音”更好的解决方案

只需记住您上次播放上下文的时间:

var lastPlayed = new Date().getTime();
var audioSource = context.createBufferSource();
    audioSource.connect( context.destination );
    audioSource.buffer = sb;
    audioSource.start( 0 );
下次播放样本/声音时,只需检查经过的时间并重置AudioContext

if(new Date().getTime()-lastPlayed>30000){   // Time passed since last playing is greater than 30 secs
     context.close();
     context=new AudioContext();
}


对于Android来说,这很有魅力。

还有一个相关的Chrome错误:@cwilso直到我重新加载页面,并且忘了在我的帖子中提到,context.state在我检查它时仍在“运行”。看起来@RaymondToy post的错误报告正是我要找的。我搜索了chromium Bug,发现了一些类似的问题,但没有发现那个问题。仍在寻找解决方法。我试着每20秒播放一次无声音轨,但这并没有阻止这个问题。如果我经常玩一个振荡器节点,它会工作,但在我正在玩的游戏中不能这样做。我认为你的无声音轨不应该是真正的无声音轨。一个非常低级别的噪音可能足以让事情保持活力。下面是一个相关的Chrome bug:@cwilso直到我重新加载页面,并且忘记在我的帖子中提到,context.state在我检查它时仍在“运行”。看起来@raymondoy post的bug报告正是我要找的。我搜索了chromium Bug,发现了一些类似的问题,但没有发现那个问题。仍在寻找解决方法。我试着每20秒播放一次无声音轨,但这并没有阻止这个问题。如果我经常玩一个振荡器节点,它会工作,但在我正在玩的游戏中不能这样做。我认为你的无声音轨不应该是真正的无声音轨。一个非常低的噪声水平可能足以使事物保持活力。另外,
gain.value=1
应该是
gain.gain.value=1
。在本例中没有区别,因为默认增益为
1
,但如果您想更改增益,则会有影响。有关更多详细信息,请参阅。感谢您指出这一点。我已经编辑了原始帖子。作为旁白,
gain.value=1
应该是
gain.gain.value=1
。在本例中没有区别,因为默认增益为
1
,但如果您想更改增益,则会有影响。有关更多详细信息,请参阅。感谢您指出这一点。我已经编辑了原始帖子。您还可以通过检查audioContext.currentTime是否正在运行来检测这种情况,尽管
。state==“running”
。然后你不必硬编码30秒,我实际上找到了时间变量,有时触发中断的audiocontext.Hi似乎需要2分钟。我有一个理论。如果再次创建上下文,则第二个上下文将永远不会触发错误。有人能证实这一点吗??如果这是真的,您可以简单地创建一个上下文,关闭它,然后创建第二个上下文。。一切都会好起来的。忘了我的理论吧,那不是真的。上下文可以冻结