HTML5 Audio не может воспроизводиться через Javascript, если только вручную его не запускать вручную

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

 

А затем через javascript, в соответствующее время:

 $('#denied')[0].play() 

Прекрасно работает на Chrome на моем рабочем столе. В Android 4.1.1 звук не будет воспроизводиться, если только я не нажму «играть» на аудиоустройствах HTML5 до того, как javascript попытается воспроизвести его.

Таким образом, в основном браузер Android (фондовый или Dolphin) не будет воспроизводить звук, если пользователь не инициирует его в какой-то момент перед javascript. Это предназначено? Есть ли способ обойти это?

В моем случае это было простое решение:
https://stackoverflow.com/a/28011906/4622767
Скопируйте и вставьте это в свой хром:

 chrome://flags/#disable-gesture-requirement-for-media-playback 

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

Ну, для моих целей, вот что я сделал:

К счастью, прежде чем пользователь сможет инициировать поведение для запуска аудио, им нужно нажать кнопку. Я устанавливаю объем элемента равным 0.0, и он «играет», когда нажимает эту кнопку.

После того, как звук воспроизводится беззвучно, я просто устанавливаю свойство объема обратно в 1.0, и он воспроизводится без вмешательства пользователя просто отлично.

Я знаю, что в мобильном safari любой вызов javascript для воспроизведения () должен находиться в том же стеке вызовов, что и событие с инициализированным кликом пользователя . Подмена клика с помощью триггера javascript также не будет работать.

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

К счастью для меня приложение html5, над которым я работаю, нужно работать только в Android 4.1, но если вы пытаетесь сделать что-то кросс-платформенное, вам нужно немного приспособить его. Для меня не работало ни настройка громкости 0.0, ни назад, либо автовоспроизведение на элементе управления. Я также пытался приглушить, и это тоже не сработало. Тогда я подумал, что, если я установил продолжительность и только сыграю минимальную сумму файла? Вот еще один скрипт с взломом, который действительно работал:

 function myAjaxFunction() { clearTimeout(rstTimer); //timer that resets the page to defaults var snd=document.getElementById('snd'); snd.currentTime=snd.duration-.01; //set seek position of audio near end snd.play(); //play the last bit of the audio file snd.load(); //reload file document.getElementById('myDisplay').innerHTML=defaultDisplay; var AJAX=new XMLHttpRequest(); //won't work in old versions of IE sendValue=document.getElementById('myInput').value; AJAX.open('GET', encodeURI('action.php?val='+sendValue+'&fn=find'), true); AJAX.send(); AJAX.onreadystatechange=function() { if (AJAX.readyState==4 && AJAX.status==200) { document.getElementById('myDisplay').innerHTML=AJAX.responseText; if (document.getElementById('err')) { //php returns 
if fail rstTimer = setTimeout('reset()', 5000); //due to error reset page in 5 seconds snd.play(); //play error sound document.getElementById('myInput').value=''; //clear the input } } } }

Основная проблема заключается в том, что звук (на iOS и Android) должен запускаться щелчком пользователя. Мое обходное решение было очень простым. Свяжите audio.play () с прослушивателем событий щелчка, а затем немедленно приостановите его. С этого момента и на звук работает отлично.

 var myAudio = new Audio('assets/myAudio.mp3'); ... button.addEventListener("click", function() { myAudio.play(); myAudio.pause(); ... }); 

Вам не нужен JavaScript для автозапуска, и я вижу несколько проблем в вашем коде:

  

Я бы изменил его на (в HTML5 вам не нужен синтаксис атрибута = «значение» в некоторых случаях, это для XHTML):

  play! 

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

 var audio = document.getElementById('denied'); var button = document.getElementById('play-button'); button.addEventListener('click',function(){ audio.play(); }); 

или с помощью jQuery:

 $('#play-button').click(function(){ audio.play(); });} 

редактировать

Имейте в виду, что HTML5 – это довольно недавняя технология (по крайней мере, некоторые функции), поэтому совместимость браузера и функциональность меняются каждый раз.

Я призываю всех постоянно информировать о текущем статусе, поскольку иногда вещи становятся менее зависимыми от взлома или наоборот.

Хорошая отправная точка: http://caniuse.com/#feat=audio (проверьте вкладки внизу).

Также для глобального аудио решения я рекомендую использовать SoundManager2 JS library

Вот блог-сообщение о причине и о том, как его преодолеть, загружая все аудиофайлы при первом взаимодействии с пользователем и воспроизводя их позже запрограммированным образом: https://blog.foolip.org/2014/02/10/media- play-restrictions-in-blink / Приняв этот подход, небольшой модуль javascript доступен на GitHub https://github.com/MauriceButler/simple-audio

Я пробовал этот простой подход самостоятельно – отлично работал и отлично!

Я встретил ту же проблему в своем приложении. Мой сценарий использования приложений был следующим:

  1. нажмите кнопку, чтобы отобразить таблицу с информацией (действие пользователя)
  2. показать таблицу и обновить данные в ней AJAX
  3. воспроизведение звука при изменении данных

К счастью, у меня было действие пользователя (шаг 1), поэтому я смог «инициировать» его звук, а затем воспроизвести его с помощью javascript без необходимых действий пользователя. См. Код.

HTML

   

Javascript

 $("#btnShow").click(function () { //some code to show the table //initialize the sound document.getElementById('kohoutAudio').play(); document.getElementById('kohoutAudio').pause(); }); function announceChange(){ document.getElementById('kohoutAudio').play(); }; 

Это случилось со мной. Вот как я взломал это:

Я настроил звук на autoplay и установил vol в 0 . Когда мне нужно играть, я использую метод load() и он будет автоматически запускаться. Это легкий mp3-файл, и он воспроизводится каждый час / два часа, так что это отлично работает для меня.

  • Массив сортировки Javascript по двум полям
  • JavaScript внезапно прекратил работу над windows7 всеми браузерами?
  • В чем же нуждается JSF, когда пользовательский интерфейс может быть достигнут с помощью библиотек JavaScript, таких как jQuery и AngularJS
  • Какова цель символа плюса перед переменной?
  • Распространение объекта по сравнению с Object.assign
  • Установка Android Studio на Windows 7 не удалась, не найден JDK
  • Использование HTML5 / Canvas / JavaScript для снятия скриншотов в браузере
  • В чем разница между использованием «let» и «var» для объявления переменной в JavaScript?
  • Как установить контрольную точку JavaScript из кода в Chrome?
  • AngularJS: ng-selected не отображает выбранное значение
  • Javascript для преобразования UTC в местное время
  • Interesting Posts

    Повторный запуск кнопки «Активность на дому», но … только в первый раз

    Создание категориальной переменной в R на основе диапазона

    C эквивалентно просмотру fstream

    как загрузить файл с помощью AngularJS и вызвать API MVC?

    Как использовать локальное подключение к Интернету для доступа к Интернету, все еще подключенного к VPN

    Ошибка: нет такого раздела grub rescue>

    Android: Можете ли вы вложить fragmentы?

    Преобразовать массив байтов в целое число на Java и наоборот

    Получить идентификатор приложения из токена доступа пользователя (или проверить исходное приложение для токена)

    android listview получить выбранный элемент

    Как «застегнуть» или «повернуть» переменное количество списков?

    Должен ли я использовать @EJB или @Inject

    Как запустить файл «.bat» во время установки?

    Как проверить нули в глубоком lambda-выражении?

    Как скомпилировать / связать Boost с clang ++ / libc ++?

    Давайте будем гением компьютера.