2015-11-19 81 views
0

聲音在最初的幾分鐘內運行,但過了一段時間.play()不播放任何聲音。看起來如果有很長時間沒有聲音播放聲音停止工作。Phaser聲音僅在Android版Chrome上停止工作

它在桌面,iOS和通用Android瀏覽器上正常工作。我只是在使用手機瀏覽器的Android設備上遇到這個問題。

回答

0

你有什麼版本的相位器和機器人?對我來說,我嘗試了4分鐘的歌曲似乎沒有問題。即使屏幕消失,恢復時也不會有任何問題。一個骯髒的解決方案是添加一個循環,每2分鐘播放一段無聲的聲音,例如只是爲了「刷新」聲音管理器,如果這可以解決您的問題。

+0

我我用Canvas和Webaudio使用Phaser v2.1.3。我添加了1秒鐘的空白聲音文件,每30秒循環一次以刷新網絡音頻上下文。那就是訣竅。我確實注意到了音頻環境的簡歷,但是我無法使其工作。我嘗試了一些像 'sound.context.resume()。then(function(){sound.play()});'但那不起作用。我可能需要更好地瞭解audiocontext的工作原理 – user3813559

+0

也許這是一個版本錯誤。我嘗試了2.4.3和2.4.4,它似乎工作。很高興解決方法解決了您的問題! – Apovtx

1

事實證明,這是一個Chrome錯誤,如果沒有聲音播放30秒之類的東西,就會導致Web音頻停止播放聲音。

https://code.google.com/p/chromium/issues/detail?id=518863

的修復似乎是看

audioContext.currentTime

,當它在30秒創造了新的audioContext卡住。

我結束了使用如下解決方案:

注意我用的移相器庫 - 所以這個確切的解決方案不會爲你工作 - 但它會給你的總體思路

//This is run using a timer event every second 

//this.game.time.events.loop(1000, this.checkAudioContext, this); 

evil.AudioManager.prototype.checkAudioContext=function(){ 

    //work out when the audio context has stopped 

    if(this.game.sound.context.currentTime-this.last_context_time===0){ 

     //close out the existing context and create a new one 
     //you will also need new gain nodes if you are using them 

     this.game.sound.context.close(); 
     this.game.sound.context=new AudioContext(); 
     this.game.sound.masterGain= this.game.sound.context.createGain(); 
     this.game.sound.masterGain.gain.volume=this.volume; 
     this.game.sound.masterGain.connect(this.game.sound.context.destination); 

     //now go through every sound and connect them to the new context 
     //creating gain nodes as we go. 
     for(var key in this.tracks){ 

      var snd=this.tracks[key].snd; 
      snd.context=this.game.sound.context; 
      snd.masterGainNode = this.game.sound.masterGain; 
      snd.gainNode=this.game.sound.context.createGain();   
      snd.gainNode.gain.value = snd.volume * this.volume; 
      snd.gainNode.connect(snd.masterGainNode); 
     }  

    }else{ 
    //update out time variable 
    this.last_context_time=ctx.currentTime; 
    } 
}