Звук Phaser перестает работать только в Chrome для Android

Звук работает первые несколько минут, но через некоторое время .play() не воспроизводит звук. Кажется, что если есть огромная продолжительность, когда звук не воспроизводится, звук перестает работать.

Он отлично работает на рабочем столе, iOS и в обычном браузере Android. Я просто сталкиваюсь с этой проблемой, особенно на устройствах Android, использующих мобильный хром в качестве браузера.


person user3813559    schedule 19.11.2015    source источник


Ответы (2)


Какая у вас версия фазера и андроида? Для меня кажется, что 4-минутная песня, которую я пробовал, воспроизводится без проблем. Даже если экран гаснет, он продолжается без проблем, когда он возобновляется. Грязным решением будет добавление цикла, который воспроизводит тихий звук каждые 2 минуты, например, просто для «обновления» диспетчера звука, если это решит вашу проблему.

person Apovtx    schedule 19.11.2015
comment
Я использую Phaser v2.1.3 с Canvas и Webaudio. Я добавил 1-секундный пустой звуковой файл для повторения каждые 30 секунд, чтобы обновить контекст веб-аудио. Это помогло. Я заметил резюме для аудиоконтекста, но не смог заставить его работать. Я пробовал что-то вроде sound.context.resume().then(function(){ sound.play()});, но это не сработало. Мне, вероятно, нужно лучше понять, как работает аудиоконтекст. - person user3813559; 20.11.2015
comment
Возможно это баг версии. Пробовал и 2.4.3 и 2.4.4 и вроде работает. Рад, что обходной путь решил вашу проблему! - person Apovtx; 20.11.2015

Оказывается, это ошибка Chrome, из-за которой веб-аудио перестает воспроизводить звуки, если звук не воспроизводится в течение примерно 30 секунд.

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

Исправление, кажется, смотреть

audioContext.currentTime

и когда он застрянет через 30 секунд, создайте новый audioContext.

Решение, которое я использовал, выглядит следующим образом:

Обратите внимание, что я использую библиотеку Phaser, поэтому это точное решение вам не подойдет, но оно даст вам общее представление.

//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;
    }
}
person Brenton Thomas    schedule 01.02.2016