ShadowOfCasper
@ShadowOfCasper
Middle User Interface Web Developer

Как исправить баг с play pause HTML5 в google chrome?

При разработке радиоприёмника столснулся с проблемой в google chrome. Именно в chrome, что самое поразительное, в остальных браузерах всё работает прекрасно. В chrome происходят 2 неведомых бага. Один явный, другой непонятно откуда взявшийся и даже нагуглить его не выходит.
Сначала про приёмник:
radiotune.concord-media.ru
В нём есть переключалки станций - всего их около 20. Работает он на плагине buzz.js (сначала хотел сделать нативно через audio src, но потом начал копаться на stackoverflow, когда обнаружил в хроме первый баг с кэшированием звука).

Баг №1:
Он явный и загуглить его можно было. В консоль выпадала ошибка, а проигрывание прекращалось.
Uncaught (in promise) DOMException: The play() request was interrupted by a call to pause().
Я нашёл багрепорт. Что странно - он закрыт, но судя по всему в официальном обновлении фикс не выкатили, ибо хром я обновлял пару недель назад, а ветка закрыта уже как с 8 месяцев. На stackoverflow предлагают костыли, типа setTimeout. Не знаю как остальные ставили на это галки - лично мне не помогло. Скорее всего потому что в src у меня потоковые ссылки и с ними всё не так просто. Сталкивался ли кто-то с этим багом на практике? Как боролись?

Баг №2:
Выше уже упоминал. Chrome зараза кэширует проигранный звук. Как результат после перемотки на ту же станцию он начинает проигрывать то, что уже закэшировал при первом воспроизведении. Как отключить эту хрень я так и не понял. Когда пробовал делать нативными методами (до установки buzz.js) я удалял в алгоритме переключения src, потом возвращал обратно, на audio повесил preload none, пробовал current time на ноль скидывать и не скидывать. Ничего не помогает.

Вообщем, очень я разочарован в google chrome. Видимо, flash ещё актуален из за подобных косяков, казалось бы, самой крутой IT-компании мира.

UPD
Коллега из backend подсказал подкрутить к событию promise. Я с промисами не работал и как-то хз как это сделать, может подскажет кто?
Собственно событие в нынешнем виде:
var i = 0;
switchStationBtn.click(function(){
        soundsGroup[i].pause();
        if(i === (stations.ids.length - 1)){
            i = 0;
        }else{
            i += 1;
        }
});
switchBtn.click(function(){
        if(soundsGroup[i].isPaused()){
            soundsGroup[i].play();
        }else{
            soundsGroup[i].pause();
        }
});


Как мне в такую конструкцию впилить промис, чтоб он обрабатывал ошибку и даже при ошибке выдавал play()
  • Вопрос задан
  • 4779 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы