Silencing AudioContext предупреждение вокруг приостановленного режима - PullRequest
1 голос
/ 17 января 2020

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

class AudioSample {
  constructor(volume = 1, playbackRate = 1) {
    this.context = new AudioContext();
  }

  load(arrayBuffer) {
    return new Promise((resolve, reject) => {
      this.context.decodeAudioData(
        arrayBuffer,
        buffer => {
          this.buffer = buffer;

          resolve(buffer);
        },
        reject
      );
    });
  }
  // Other stuff
}

// When the page loads
const sample = new AudioSample();

fetch('/some-sound.mp3')
  .then(res => res.arrayBuffer())
  .then(arrayBuffer => sample.load(arrayBuffer));

// When a button is clicked
const play = () => {
  sample.current.pause();
  sample.current.setCurrentTime(0);
  sample.current.play();
};

Этот код работает как задумано; когда страница загружается, она выбирает и готовит звуки. При нажатии кнопки воспроизводится звук (даже в самый первый раз).

Моя проблема заключается в том, что на консоли Chrome зарегистрировано следующее предупреждение:

AudioContext не был разрешен для запуска. Он должен быть возобновлен (или создан) после пользовательского жеста на странице. https://developers.google.com/web/updates/2017/09/autoplay-policy-changes#webaudio

Это предупреждение представляет собой небольшую проблему, потому что я хочу упаковать эту маленькую утилиту, но я не хочу, чтобы мой NPM пакет выдавал предупреждения красной селедки!

Есть ли способ сказать браузеру "Я знаю, не волнуйтесь, я не буду воспроизводить звук, пока пользователь не будет взаимодействовать со страницей"?

1 Ответ

2 голосов
/ 17 января 2020

Для chrome единственный способ избавиться от предупреждения - создать контекст из жеста пользователя. См. Также ошибку chrome 943258

Было бы неплохо, если бы эта ошибка была исправлена. Как говорит ошибка, создание контекста без жеста не является неправильным. Только возобновление без жеста неправильно.

...