Я сделал веб-сайт, на котором, если пользователь нажимает, воспроизводится звук. Чтобы звук не перекрывался, мне пришлось добавить код:
n.pause();
n.currentTime = 0;
n.play();
Но это вызывает ошибку:
The play() request was interrupted by a call to pause()
возникает каждый раз, когда звуковое событие запускается сразу после другого запуска. Звуки по-прежнему воспроизводятся нормально, но я хочу, чтобы это сообщение об ошибке не появлялось постоянно. Любые идеи?
javascript
html
google-chrome
audio
Оуэн М
источник
источник
onCanPlay()
. Все эти ответы - грязные уловки.n.play()
тогдаn.pause()
. В этой статье, посвященной основам Интернета, описано решение. tl; dr:n.play().then(() => { n.pause()})
Ответы:
Недавно я столкнулся с этой проблемой - это может быть состояние гонки между
play()
иpause()
. Похоже , что есть ссылка на этот вопрос, или что - то связанный здесь .Как указывает @Patrick ,
pause
не возвращает обещание (или что-то еще), поэтому вышеуказанное решение не сработает. Хотя у MDN нет документацииpause()
, в черновике WC3 для Media Elements сказано:Таким образом, можно также проверить
paused
атрибут в обратном вызове тайм-аута.Основываясь на этом замечательном ответе SO , вот способ проверить, действительно ли видео воспроизводится (или нет), поэтому вы можете безопасно запустить play () без ошибки.
В противном случае, @Patrick «S ответ должен работать.
источник
После нескольких часов поиска и работы я нашел идеальное решение .
После этого вы можете как можно быстрее переключать воспроизведение / паузу , все будет работать правильно .
источник
Я столкнулся с этой проблемой, и у меня был случай, когда мне нужно было нажать pause (), затем play (), но при использовании pause (). Then () я получаю undefined.
Я обнаружил, что если я начал играть через 150 мс после паузы, это решило проблему. (Надеюсь, Google скоро исправит)
источник
Я только что опубликовал статью об этой конкретной проблеме на странице https://developers.google.com/web/updates/2017/06/play-request-was-interrupted, в которой рассказывается, что именно происходит и как это исправить .
источник
попытайся
источник
Мне помогло это решение:
источник
В зависимости от того, насколько сложным вы хотите ваше решение, это может быть полезно:
Это немного перебор, но помогает при обработке Promise в уникальных сценариях.
источник
Предлагаемые здесь решения либо не сработали для меня, либо слишком большие, поэтому я искал что-то еще и нашел решение, предложенное @dighan на bountysource.com/issues/
Итак, вот код, который решил мою проблему:
Он по-прежнему выдает ошибку в консоли, но, по крайней мере, видео воспроизводится :)
источник
Возможно, это лучшее решение, как я понял. Spec говорит, как цитируется из @JohnnyCoder:
-> загрузка
указывает состояние готовности носителя HAVE_ENOUGH_DATA = 4
Обычно загружайте видео, только если оно еще не загружено. У меня возникла упомянутая ошибка, потому что видео не было загружено. Может быть, лучше, чем использовать тайм-аут.
источник
убраны все ошибки: (машинопись)
источник
С прямой трансляцией я столкнулся с той же проблемой. и мое исправление это. Из тега html-видео не забудьте удалить "автовоспроизведение" и использовать этот код ниже для воспроизведения.
источник
Chrome возвращает Promise в новейших версиях. В противном случае просто:
источник
У меня такая же проблема, наконец, я решаю:
источник
Этот фрагмент кода исправлен для меня!
Измененный код @JohnnyCoder
HTML:
JS:
источник
Я исправил это с помощью кода ниже:
Если вы хотите поиграть, используйте следующее:
Точно так же, когда вы хотите сделать паузу:
источник
Вот еще одно решение, если причина в том, что ваше видео загружается очень медленно и видео не буферизуется:
if (videoElement.state.paused) { videoElement.play(); } else if (!isNaN(videoElement.state.duration)) { videoElement.pause(); }
источник
Похоже, с этой проблемой сталкивались многие программисты. решение должно быть довольно простым. медиа-элемент возвращается
Promise
из действий, поэтомудолжен сделать трюк
источник
вот решение из блога googler:
источник
Все новые браузеры поддерживают автоматическое воспроизведение видео с отключением звука, поэтому, пожалуйста, поставьте что-нибудь вроде этого
URL-адрес видео должен соответствовать статусу SSL, если ваш сайт работает с https, тогда URL-адрес видео также должен быть в https и то же самое для HTTP.
источник
Самое чистое и простое решение:
источник
Причина первая - вызов паузы без ожидания разрешения игры
слишком много ответов для этого сценария, поэтому я просто буду ссылаться на лучший документ по этой проблеме:
https://developers.google.com/web/updates/2017/06/play-request-was-interrupted
Причина вторая - вызов play, когда вкладка не сфокусирована
В этом случае браузер может прервать
play
вызов,pause
когда вкладка не в фокусе. в целях экономии ресурсов для активной вкладки.Таким образом, вы можете просто подождать, пока вкладка будет сфокусирована, прежде чем вызывать play:
источник
Я столкнулся с той же проблемой и решил ее, динамически добавив
autoplay
атрибут, а не используяplay()
. Таким образом, браузер научился играть, не попадая в состояние гонки.источник
При попытке зациклить автоматическое воспроизведение видео, вызывая
play()
его по окончании, обходной путь тайм-аута у меня не сработал (каким бы длинным ни был тайм-аут).Но я обнаружил, что при клонировании / замене видео на jQuery, когда оно закончится, оно будет правильно зацикливаться.
Например:
и
Я использую Chrome 54.0.2840.59 (64-разрядный) / OS X 10.11.6
источник
Думаю, они обновили видео в формате html5 и исключили некоторые кодеки. У меня сработало после удаления кодеков.
В приведенном ниже примере:
источник
Когда вы видите ошибку с помощью
Uncaught (in promise)
This, просто означает, что вам нужно обработать обещание с помощью..catch()
В этом случае.play()
возвращает обещание. Вы можете решить, хотите ли вы записать сообщение, запустить какой-то код или ничего не делать, но пока у вас есть.catch()
ошибка, ошибка исчезнет.источник
Я воспользовался уловкой, чтобы решить эту проблему. Определите глобальную переменную var audio;
и в функциональной проверке
и в функции остановки
поэтому следующий вызов
audio.play
аудио будет готов с текущего времени '0'я использовал
но это не сработало. Спасибо.
источник