Автовоспроизведение звука на вкладке хромового фона

У меня есть игра HTML5, в которой используются звуковые уведомления.

Когда пользователи ищут других игроков с совпадением, они часто меняют вкладки, чтобы делать другие вещи, и полагаются на звуковое уведомление, чтобы знать, когда вернуться. Это не работает после изменения Chrome (рабочего стола), чтобы запретить звуковые уведомления.

Как я могу гарантировать, что звуковые уведомления все еще работают в фоновом режиме?

Ответ 1

Решение, которое сработало для меня, состояло в том, чтобы воспроизвести небольшой пустой звук (достаточно 0,1 секунды) после загрузки страницы. После этого, даже если вы перейдете на другую вкладку, вкладка в фоновом режиме будет по-прежнему воспроизводить звук на каком-то внешнем или внутреннем событии.

Ответ 2

Пример 1

Вот пример, который создает div и использует тег HTML5 <audio> с отступлением к <embed>, который воспроизводит аудиофайл через 3 секунды после нажатия кнопки.

Чтобы протестировать его, запустите образец и нажмите кнопку, затем измените вкладки и отметьте 3 секунды. Вы должны увидеть значок динамика на этой вкладке и услышать звук падения монет через 3 секунды, даже если эта вкладка не является текущей вкладкой.

function playCoinDrop() {
  soundDiv = document.createElement("div");
  soundDiv.innerHTML = '<audio autoplay="autoplay"><source src="http://themushroomkingdom.net/sounds/wav/smw/smw_coin.wav" type="audio/wav" /><embed hidden="true" autostart="true" loop="false" src="http://themushroomkingdom.net/sounds/wav/smw/smw_coin.wav" /></audio>';
}
<button onclick="setTimeout(playCoinDrop, 3000)">play sound</button>

Ответ 3

Здесь фоновые вкладки по-прежнему могут воспроизводить звуки из элементов <audio> (Chrome 49.0.2623.87). Однако, если Chrome заблокировал это, способ обойти его будет состоять в том, чтобы уведомить переднюю вкладку о событии и воспроизвести звук вместо закладки фона.

Следующее должно быть реализовано как расширение пользовательского словаря, чтобы он мог работать на любой вкладке - в качестве демонстрации он работает только между двумя вкладками с одним и тем же URL-адресом JSBin:

var intercom = Intercom.getInstance();

document.addEventListener("visibilitychange", getVisible);

function getVisible (evt) {
  document.getElementById("fg-indicate").style.visibility = document.visibilityState;
  if (document.visibilityState == "visible") {    
     // tab comes to front => listen to intercom
     intercom.on('notice', play);
   } else {
     // kill callback
     intercom.off('notice', play);
     // call intercom with delay
     window.setTimeout(function f() {
       intercom.emit('notice', {message: 'Hello, all windows!'});
     }, 3000);
   }
}

function play() {
  document.getElementsByTagName("audio")[0].play();
}

Он опирается на библиотеку intercom.js и использует localstorage для связи между открытыми вкладками.

Попробуйте это сделать

  • открытие https://jsbin.com/gerihijofe/1/edit?html,js,output на одной вкладке
  • затем на другой вкладке
  • вкладки переключателей
  • подождите 3 секунды, посмотрите, где появляется значок маленького динамика.
  • вкладки переключателей
  • подождите 3 секунды, посмотрите, где появляется значок маленького динамика.

и т.д.

Код и немного больше кода для ввода элемента <audio> могут быть обернуты в пользовательский указатель, чтобы он мог запускаться на любом сайте, который находится впереди.