Какие события допустимы для запуска воспроизведения звука HTML5 в мобильном Chrome

Мобильные браузеры требуют действий пользователя, чтобы начать воспроизведение аудиоэлементов. Событие click удовлетворяет требованиям, но похоже, что touchstart не является приемлемым инициирующим событием в Chrome на Android или iOS. (Увидеть ниже)

Кто-нибудь знает, где найти точное определение контекста события, необходимого для начала игры.

(Я пытался решить проблему UX, используя идеи из Как чтобы предотвратить масштабирование двойным касанием в iOS и Android. С момента публикации моего исходного вопроса я нашел решение, которое решает проблему UX без использования touchstart, но я думаю, что основной вопрос о том, какие события считаются действиями пользователя.)

Дополнение:

Было высказано предположение, что я ошибаюсь насчет событий touchstart, поэтому для записи я предлагаю тривиальную тестовую программу. Поскольку для этого требуется настоящий музыкальный файл и мобильное устройство, JSFiddle не является подходящей платформой (если кто-то не знает, как имитировать событие touchstart в скрипке). Чтобы воспроизвести мои наблюдения, отредактируйте javascript, чтобы загрузить свой собственный аудиофайл.

<!DOCTYPE html>
<html>
<body>

<br>
<button type="button" id="but1">click</button>
<button type="button" id="but2">touch</button>
<br>
<br>
<span id="message"></span>

<script>

var e;

e = document.getElementById('but1');
e.onclick = click;
e = document.getElementById('but2');
e.ontouchstart = touchstart;

function click() {
  alert('caught click');
  play();
  event.preventDefault();
}

function touchstart() {
  alert('caught touchstart');
  play();
  event.preventDefault();
}

var p;
var t;

function play() {

  p = new Audio();
  p.src = '/k487.mp3';      //  CHANGE THIS
  p.preload = 'auto';
  p.play();

  t = setInterval(report,1000);
}

function report() {

  var s = 'Player readyState='+p.readyState+', currentTime='+p.currentTime;
  var e = document.getElementById('message');

  e.innerHTML = s;
}

</script>
</body>
</html>

Когда я загружаю эту страницу в Chrome 58 на Android 6.0.1, кнопка Click работает должным образом, выдает всплывающее окно, воспроизводит музыку и обновляет время воспроизведения.

Если я перезагружу страницу и вместо этого коснусь сенсорной кнопки, появится всплывающее окно, но музыка не будет воспроизводиться. На дисплее состояния отображается состояние готовности 4 и значение currentTime 0. Другими словами, событию touchstart разрешено загружать звук, но не начинать воспроизведение.

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


person gawkmeister    schedule 16.06.2017    source источник


Ответы (2)


Когда вызывается метод play () для медиа-элемента, пользовательский агент должен выполнить следующие шаги: https://html.spec.whatwg.org/multipage/media.html#dom-media-play

step1: если медиа-элемент не может воспроизводиться ...

тогда мне интересно условие, при котором разрешено воспроизведение, оно переходит сюда https://html.spec.whatwg.org/multipage/media.html#allowed-to-play.

он говорит:

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

затем перешел к "инициированной-пользователем-активацией" вот Думаю, в этом причина:

Алгоритм запускается при активации пользователя, если выполняется одно из следующих условий:

Задача, в которой выполняется алгоритм, в настоящее время обрабатывает поведение активации, атрибут isTrusted события щелчка которого имеет значение true.

  • изменять
  • щелкнуть
  • контекстное меню
  • dblclick
  • мышь
  • указатель
  • перезагрузить
  • Отправить
  • прикосновение

"touchstart" здесь не упоминается.

надеюсь, что это поможет вам.

person Topppy    schedule 23.05.2018
comment
Похоже, этот список является более теоретическим. В мобильном Chrome событие touchend также вызывает исключение, запрещающее воспроизведение мультимедиа. - person crazy; 27.11.2020

На этой странице вы найдете ответ на этот вопрос.

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

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

    var EXE_JUST_ONE_TIME = false;

    document.addEventListener("touchstart" , function(e) {

    if (EXE_JUST_ONE_TIME == false){
    EXE_JUST_ONE_TIME = true;

    document.getElementById("LaserShot").play(); // need for play pause just for buffering start
    document.getElementById("LaserShot").pause();
    // now you can play programmability from js 
    document.getElementById("LaserShot_CLONE").play();
    document.getElementById("LaserShot_CLONE").pause();

    }
  else if(EXE_JUST_ONE_TIME = true){

    document.getElementById("MakeReadyotherAudio1").play();
    document.getElementById("MakeReadyotherAudio1").pause();

     EXE_JUST_ONE_TIME = 'NOMORE'

  } 


    }

Если у вас возникнут проблемы, я могу сделать вам фрагмент кода с рабочим примером!

Я вложил 90% в мобильный веб-разработчик в функцию события при запуске:

   document.getElementById("myAnchor").addEventListener("click", function(event){
    event.preventDefault()
});

// Иногда, даже если вы не используете какое-то событие, его полезно переопределить:

  window.addEventListener('touchstart', function(e){
      e.preventDefault()

    }, false)

    window.addEventListener('touchmove', function(e){
        e.preventDefault()

    }, false)

    window.addEventListener('touchend', function(e){    
        e.preventDefault()


    }, false)

    window.addEventListener('touchleave', function(e){    
        e.preventDefault()


    }, false)
    window.addEventListener('touchcancel', function(e){    
        e.preventDefault()


    }, false)
    window.addEventListener('touchenter', function(e){    
        e.preventDefault()


    }, false)

Если вы хотите, вы можете использовать эту библиотеку: оптимизация событий для настольных / мобильных устройств для Canvas

person Nikola Lukic    schedule 16.06.2017
comment
Кажется, это ответ на другой вопрос. Похоже, вы признаете, что для запуска проигрывателя требуется первый щелчок по чему-либо. - person gawkmeister; 18.06.2017
comment
touchstart не является приемлемым исходным событием, это неверно. Посмотрите, возможно, отслеживание ошибок: stackoverflow.com/questions/2794769/ Я всегда использую только для мобильных событий касания. - person Nikola Lukic; 18.06.2017
comment
Я добавил свои доказательства к исходному вопросу. - person gawkmeister; 21.06.2017