Як попрацювати з "Uncaught (у перспективі) DOMException: play () не вдалося, оскільки користувач не взаємодів із документом спочатку". на робочому столі з Chrome 66?


122

Я отримую повідомлення про помилку ..

Uncaught (обіцяє) DOMException: play () не вдалося, оскільки користувач спочатку не взаємодіяв із документом.

..при спробі відтворити відео на робочому столі за допомогою версії 66 Chrome.

Я знайшов оголошення, яке почалося відтворення автоматично на веб-сайті, однак використовуючи наступний HTML:

<video
    title="Advertisement"
    webkit-playsinline="true"
    playsinline="true"
    style="background-color: rgb(0, 0, 0); position: absolute; width: 640px; height: 360px;"
    src="http://ds.serving-sys.com/BurstingRes/Site-2500/Type-16/1ff26f6a-aa27-4b30-a264-df2173c79623.mp4"
    autoplay=""></video>

Так обходячи Автовідтворення блокувальника Chrome V66 дійсно так просто , як додавання webkit-playsinline="true", playsinline="true"і autoplay=""атрибутів до <video>елементу? Чи є якісь негативні наслідки для цього?


2
Я думаю, що playinline - це iOS.
Джош Лі

Відповіді:


125

Щоб автоматичне відтворення на html 5 елементах працювало після оновлення chrome 66, вам просто потрібно додати mutedвластивість до відеоелементу.

Отже ваш поточний HTML-код відео

<video
    title="Advertisement"
    webkit-playsinline="true"
    playsinline="true"
    style="background-color: rgb(0, 0, 0); position: absolute; width: 640px; height: 360px;"
    src="http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/BigBuckBunny.mp4"
    autoplay=""></video>

Просто потреби muted="muted"

<video
    title="Advertisement"
    style="background-color: rgb(0, 0, 0); position: absolute; width: 640px; height: 360px;"
    src="http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/BigBuckBunny.mp4"
    autoplay="true"
    muted="muted"></video>

Я вважаю, що оновлення chrome 66 намагається зупинити вкладки, створюючи випадковий шум на вкладках користувачів. Ось чому приглушене властивість змушує автовідтворення знову працювати.


після витягування волосся на годину. це
Енді Маккормік

Чи є спосіб увімкнути аудіо відразу після відтворення відео? Видалення muteатрибута чи параметра налаштування volumeне допомагає.
nikitahl

На MacOs Chrome Версія 74.0.3729.131 обидва фрагменти дають чорний екран
Kamil Kiełczewski

@ KamilKiełczewski На відео було показано чорний екран, оскільки його srcбуло недійсно. Я оновив фрагмент, srcщоб відео відтворювалося автоматично.
Джо

2
Я повинен був зробити це muted="true"замість
tgordon18

13

Найкраще рішення, яке я знайшов, - це відключення відео

HTML

<video loop muted autoplay id="videomain">
  <source src="videoname.mp4" type="video/mp4">
</video>

12
  1. відчинено chrome://settings/content/sound
  2. Налаштування Не потрібно жодних жестів користувача
  3. Відновіть Chrome

6
Зміни політики автоматичного відтворення Клацніть на мене
Ming

4
Він використовується лише для розробника для тестування поведінки в політиці автоматичного відтворення Chrome на локальному рівні. developers.google.com/web/updates/2017/09/…
Tuan Nguyen

5
Я виявив, що прапор командного рядка --autoplay-policy=no-user-gesture-requiredє програмним способом досягнення цього параметра.
nickiaconis

27
Це працює лише для вашого веб-переглядача, всі інші все ще постраждають
koosa

37
Хто підтримує цю відповідь? Це не superuser.com. Рішення для вашої локальної машини не може бути прийнятною відповіддю.
adripanico

11

Відповідь на відповідне питання ...
Ні, недостатньо мати ці атрибути, щоб мати змогу автоматично відтворювати медіа зі звуком, вам потрібно зареєструвати у вашому документі жест користувача.

Але це обмеження дуже слабке: якщо ви отримали цей жест користувача на батьківському документі, а ваше відео завантажилося з iframe, ви можете його відтворити ...

Тож візьмемо для прикладу цю загадку , яка є лише

<video src="myvidwithsound.webm" autoplay=""></video>

При першому завантаженні, і якщо ви нікуди не натиснете, воно не запуститься, оскільки у нас ще не зареєстровано жодної події.
Але як тільки ви натискаєте кнопку "Виконати" , батьківський документ (jsfiddle.net) отримав жест користувача, і тепер відео відтворюється, хоча технічно він завантажений в інший документ.

Але наступний фрагмент, оскільки вимагає від вас фактично натиснути кнопку « Виконати фрагмент коду », автоматично відтворить.

<video src="https://upload.wikimedia.org/wikipedia/commons/transcoded/2/22/Volcano_Lava_Sample.webm/Volcano_Lava_Sample.webm.360p.webm" autoplay=""></video>

Це означає, що ваша об’ява, ймовірно, змогла відтворити, оскільки ви вказали користувачу жест на головну сторінку.


Тепер зауважте, що Safari та Mobile Chrome мають більш жорсткі правила, ніж це, і вам потрібно буде фактично запустити принаймні один раз play()метод програмно на <video>або <audio>елемент від самого обробника подій користувача.

І якщо вам не потрібно аудіо, просто не прикріплюйте його до своїх медіа, відео з лише відеодоріжкою також дозволяється автоматично відтворювати, а це зменшить використання пропускної здатності вашого користувача.


11

Для мене (у проекті Angular) цей код допоміг:

У HTML ви повинні додати autoplay muted

В JS / TS

playVideo() {
    const media = this.videoplayer.nativeElement;
    media.muted = true; // without this line it's not working although I have "muted" in HTML
    media.play();
}

1
Абсолютно правдива і неймовірна, навіть з останньою версією Angg Ng8. Angular просто не хвилює, що відбувається з HTML-шаблоном компонента!
Педро Феррейра

2
І, використовуючи новий метод Angular, @ViewChild()вам потрібно встановити статичний параметр true: @ViewChild('videoPlayer', {static: true}) videoplayer: ElementRef; video: HTMLVideoElement; І тоді: this.video = this.videoplayer.nativeElement;@ngOnInit()
Педро Феррейра

1
Це було моєю проблемою, ігнорований в HTML повністю ігнорується, і мені довелося змусити його JS. + 1М на вашу відповідь після днів пошуку
Ігнасіо Бустос

Це правильна відповідь у моєму випадку, спрацював чудово
Гаррі. Наем

Нічого собі, не можу повірити, що мені насправді потрібні дзвінки на стороні javascript для кутових переглядів SSR після завантаження. Весь цей час я думав, що проблема полягає в HTML.
arao6

7

Спробуйте скористатись ліцензієм подій миші

var audio = document.createElement("AUDIO")
document.body.appendChild(audio);
audio.src = "./audio/rain.m4a"

document.body.addEventListener("mousemove", function () {
    audio.play()
})

4

Розтягніть елемент DOM, обробіть помилку та деградуйте граціозно

Нижче я використовую функцію прототипу, щоб обернути натиснуту функцію відтворення DOM, захопити її обіцянку, а потім перейти до кнопки відтворення, якщо браузер видасть виняток. Це розширення вирішує недоліки браузера і є програмою на будь-якій сторінці зі знанням цільових елементів.

// JavaScript
// Wrap the native DOM audio element play function and handle any autoplay errors
Audio.prototype.play = (function(play) {
return function () {
  var audio = this,
      args = arguments,
      promise = play.apply(audio, args);
  if (promise !== undefined) {
    promise.catch(_ => {
      // Autoplay was prevented. This is optional, but add a button to start playing.
      var el = document.createElement("button");
      el.innerHTML = "Play";
      el.addEventListener("click", function(){play.apply(audio, args);});
      this.parentNode.insertBefore(el, this.nextSibling)
    });
  }
};
})(Audio.prototype.play);

// Try automatically playing our audio via script. This would normally trigger and error.
document.getElementById('MyAudioElement').play()

<!-- HTML -->
<audio id="MyAudioElement" autoplay>
  <source src="https://www.w3schools.com/html/horse.ogg" type="audio/ogg">
  <source src="https://www.w3schools.com/html/horse.mp3" type="audio/mpeg">
  Your browser does not support the audio element.
</audio>

Це дуже розумний підхід, який не порушує жодної політики (оскільки відтворення не починається все одно) і запобігає помилкам. +1
loretoparisi

3

У моєму випадку мені довелося це зробити

 // Initialization in the dom
 // Consider the muted attribute
 <audio id="notification" src="path/to/sound.mp3" muted></audio>


 // in the js code unmute the audio once the event happened
 document.getElementById('notification').muted = false;
 document.getElementById('notification').play();

2

Chrome потребує взаємодії з користувачем, щоб відео відтворювалося або відтворювалося через js (video.play ()). Але взаємодія може бути будь-якого виду, у будь-який момент. Якщо просто натиснути випадковим чином на сторінці, відео автоматично відтвориться. Тоді я вирішив, додавши кнопку (лише в хромованих браузерах), яка говорить "включити автовідтворення відео". Кнопка нічого не робить, але просто натискання на неї - необхідна взаємодія з користувачем для подальшого відео.


1

Під час спроби відтворення аудіофайлу я зіткнувся з подібною помилкою. Спочатку він працював, потім він перестав працювати, коли я почав використовувати markForCheckметод ChangeDetector в тій же функції, щоб викликати повторне відображення, коли обіцянка вирішується (у мене виникла проблема з візуалізацією перегляду).

Коли я змінив markForCheckдо detectChangesнеї почав працювати знову. Я справді не можу пояснити, що сталося, я просто думав кинути це сюди, можливо, це комусь допоможе.


1

Вам слід було додати mutedатрибут всередині videoElementвашого коду, як очікувалося. Подивіться нижче ..

<video id="IPcamerastream" muted="muted" autoplay src="videoplayback%20(1).mp4" width="960" height="540"></video>

Не забудьте додати дійсне відео посилання як джерело


0

У мене були проблеми з програванням Android Phone. Після кількох спроб я з'ясував, що коли Data Saver увімкнено, немає автоматичної гри:

Немає автоматичної гри, якщо ввімкнено режим Збереження даних . Якщо ввімкнено режим Збереження даних, автоматичне відключення відключено в налаштуваннях медіа.

Джерело


-6

Введіть прапори Chrome: // в адресний рядок

Пошук: Автовідтворення

Політика автоматичної гри

Політика, яка застосовується при вирішенні питання про те, чи дозволяється аудіо чи відео до автовідтворення.

- Mac, Windows, Linux, Chrome OS, Android

Установіть це на " Не потрібен жест користувача "

Перезапустіть Chrome, і вам не потрібно змінювати жоден код


24
Ви, можливо, не можете просити кожного користувача змінити налаштування.
Ашиш Джанвар

2
Це могло б вирішити проблему для деяких людей (кіоски, приватні та локальні веб-сайти ...), але прапор було знято в Chrome 76. Зараз єдиним рішенням є ця відповідь
Мілан Швахла,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.