Работа с аудио в Safari на IOS

138
22 декабря 2019, 21:40

Пишу WebGL-приложение с использованием Three.js. В приложении есть фоновая loop-мелодия, а так же при клике на некоторые интерактивные элементы воспроизводится звук (иногда по 5-7 секунд).

Все работает идеально, но в Safari на IOS со временем перестает играть фоновая мелодия и возвращается через 5-45 секунд. Погуглив я нашел такую особенность Safari под IOS:

Одно из самых серьезных ограничений мобильной версии Safari состоит в том, чтоединовременно может воспроизводиться только один аудиопоток. Медиаэлементы HTML5в mobile Safari являются синглтонами, поэтому может воспроизводиться лишь один потокHTML5 audio  HTML5 video).

Однако несколько звуков одновременно воспроизводятся и какое-то время все работает нормально.

Так же Safari дает воспроизвести звук только если юзер кликнул по странице:

userInteraction(){
    if(!this.listener){
      this.listener = new this.THREE.AudioListener();
      // HACK FOR IOS
      const mediaElement = new Audio( './sounds/soundtrack.mp3' );
      mediaElement.loop = true;
      mediaElement.play();
      this.mainTheme = new this.THREE.Audio( this.listener );
      this.mainTheme.setMediaElementSource(mediaElement);
      this.mainTheme.setVolume( Math.ceil(this.musicVolume) / 100 );
      this.mainTheme.setLoop( true );
      this.mainTheme.play();
    }
  }

mainTheme добавлено через mediaElement, ибо иначе звук не работает вообще, можно сказать хак, не знаю.

После добавления mediaElement остальные звуки работают и вызываются вот так:

  playSound(key){
    const sound = new this.THREE.AudioExt( this.listener );
    sound.setBuffer( this.sounds[key] ); // SO: this.sounds - загруженные звуки
    sound.setVolume( Math.ceil(this.effectVolume) / 100 );
    sound.play();
  }

Собственно, почему mainTheme перестает играть и как это исправить?

P.S. На Android и ПК в Firefox/Chrome все работает прекрасно.

READ ALSO
Обработка POST запроса на Koa.js

Обработка POST запроса на Koa.js

Почему на запрос ctsrequest

134
как добавить API 2.1 яндекс карт в Wordpress

как добавить API 2.1 яндекс карт в Wordpress

здравствуйте как добавить API яндекс карт в Wordpress

137
Скрипт для записи всех заголовков в текстовый файл

Скрипт для записи всех заголовков в текстовый файл

У меня есть набор папок, в каждой папке есть набор markdown файловУ меня задача на выходе получить текстовый документ, в котором будут записаны...

127
Vue-multiselect

Vue-multiselect

я использую vue-multiselect вот пример, только я получаю свои данные названия компаний в моем случае, а не как в данном примере названия стран и проблема...

162