Низкая производительность Safari при многократном воспроизведении звука через себя - PullRequest
0 голосов
/ 17 января 2019

Я пытаюсь воспроизвести звук над клавиатурой. Для этого я увидел, что решение состоит в том, чтобы клонировать звук и воспроизвести новый экземпляр:

var promise = sound.cloneNode(true).play();

Воспроизведение онлайн: https://jsfiddle.net/alvarotrigo/up4c6m95/13/

Похоже, что это нормально работает в Chrome и Firefox. Однако в Safari это приводит к плохой производительности.

Попробуйте воспроизвести ошибку обеими руками очень быстро.

Примечание. Я добавил изображение в формате gif, которое очень быстро запаздывает при наборе текста. Это, конечно, можно отметить и на инструментах разработки Safari, как показано на рисунке ниже:

enter image description here

Весь код здесь:

var sound = new Audio('https://www.w3schools.com/html/horse.mp3');

document.addEventListener('keydown', playSound);


function playSound() {
  //in order to play the same sound over itself
  var promise = sound.cloneNode(true).play();

  //we just dont want to show the console error when autoplay is disabled :)
  if (typeof promise !== undefined) {
    promise.then(function() {
      // Autoplay started!
    }).catch(function(error) {
      //error
    });
  }

}

1 Ответ

0 голосов
/ 24 января 2019

Safari каждый раз отправляет запрос на воспроизведение воспроизводимого аудиофайла, в то время как Firefox и Chrome, с другой стороны, загружают его только один раз.

В Safari на iOS (для всех устройств, включая iPad) ... данные не загружаются, пока пользователь не инициирует их. Это означает, что методы JavaScript play () и load () также неактивны пока пользователь не начнет воспроизведение, если только метод play () или load () запускается действием пользователя.

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

...