изменение веб-политики автозапуска при возобновлении контекста не включает звук

Я работаю над прогрессивным веб-приложением, которое в основном используется на настольных компьютерах и Android для воспроизведения музыки. На ПК все нормально работает. На Андроиде вдруг перестало работать. После некоторого исследования я нашел это обновление, касающееся изменение политики автовоспроизведения в Chrome.

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

До этого обновления у меня был свой AudioContext, который создается onload, а затем просто используется. Это больше не работает.

В сообщениях об обновлении говорится следующее:

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

Поэтому я внес некоторые изменения в .suspend() и .resume() контекст соответственно onPlay и onPause моего приложения.

На ПК это все еще работает, на Android - нет. Я что-то упускаю?

Изменить 1:

Я нашел этот сайт, на котором написано следующее:

В соответствии с новой политикой медиа-контент будет разрешен для автовоспроизведения при следующих условиях:

а) Контент отключен или не содержит звука (только видео)

б) Пользователь коснулся или щелкнул где-нибудь на сайте во время сеанса просмотра.

c) На мобильном устройстве, если сайт был добавлен на главный экран пользователем.

г) На компьютере, если пользователь часто воспроизводил мультимедиа на сайте, согласно Индексу взаимодействия со СМИ.

Я понимаю, что это правда, если одно из этих совпадений. В моем случае б) и в) выполнены. Полагаю, это должно работать?


person Tobias Würth    schedule 07.05.2018    source источник
comment
@Kaiido Хм, понятно. Думаю, мне нужно посмотреть, как я могу сделать это синхронно, потому что до сих пор я работал с модулями vuex, которые в моем случае запускают действие асинхронно. Может быть, я мог бы добавить действие синхронной инициализации или что-то подобное .. Можете ли вы предоставить источники для двух разных автозапусков? может быть, это поможет прояснить мое замешательство   -  person Tobias Würth    schedule 08.05.2018
comment
К сожалению, это всего лишь мой собственный опыт, и он может быть неверным ... (повторное чтение вашего сообщения об ошибке, как правило, доказывает, что я ошибаюсь) Они изменили многие вещи вокруг этих политик, и документы трудно склеить . Но, опять же, по опыту, реакция внутри пользовательского жеста всегда работает на всех UA.   -  person Kaiido    schedule 08.05.2018
comment
некоторые обсуждения этой проблемы: Chrome группы .google.com / a / chromium.org / forum / #! msg / blink-dev / и спецификации github.com/WebAudio/web-audio-api/issues/836   -  person Kaiido    schedule 08.05.2018
comment
Итак, я ошибся, похоже, они используют одну и ту же политику для AudioContext и MediaElement.autoplay. Теперь я не знаю, почему это не работает для вас, может быть, тот факт, что вы пытаетесь использовать AudioContext, вызывает ошибку, которая блокирует нормальное поведение даже после того, как пользователь предоставил требуемый жест? Вы можете предотвратить это, проверив свойство AudioContext state. Если установлено "suspended", ничего не предпринимайте.   -  person Kaiido    schedule 08.05.2018
comment
спасибо за ваш вклад, я ценю это. Я почти уверен, что не использую контекст до того, как пользователь сделал ввод, потому что я начинаю загружать аудиоисточники с удаленного хоста только тогда, когда пользователь нажимает на что-то «воспроизведение». после завершения загрузки он декодируется, контекст возобновляется, а затем воспроизводится. Если пользователь нажимает паузу, я останавливаю узел и приостанавливаю контекст, пока он снова не нажмет кнопку воспроизведения.   -  person Tobias Würth    schedule 08.05.2018
comment
@Kaiido, ты прав. Мне удалось решить проблему, создав контекст ПОСЛЕ того, как пользователь взаимодействовал со страницей. Я до сих пор делаю это асинхронно, так что это не имеет значения. Хотели бы вы написать правильный ответ? Я приму это   -  person Tobias Würth    schedule 09.05.2018


Ответы (1)


Вам нужно вызвать resume () в аудиоконтексте при событии действия пользователя, таком как нажатие кнопки. Я предполагаю, что ваша проблема заключалась в том, что вы вызывали context.resume () не в событии взаимодействия с пользователем. Вы не можете просто вызвать его из onLoad.

Образец кода:

// Existing code unchanged.
window.onload = function() {
  var context = new AudioContext();
  // Setup all nodes
  ...
}

// One-liner to resume playback when user interacted with the page.
document.querySelector('button').addEventListener('click', function() {
  context.resume().then(() => {
    console.log('Playback resumed successfully');
  });
});

Документы описывают это здесь: https://developers.google.com/web/updates/2017/09/autoplay-policy-changes#webaudio.

person Deemoe    schedule 20.03.2019