[javascript] “Uncaught (in promise) DOMException : 사용자가 먼저 문서와 상호 작용하지 않았기 때문에 play () 실패했습니다.”를 처리하는 방법 Chrome 66이 설치된 데스크톱에서?

오류 메시지가 표시됩니다 ..

잡히지 않은 (약속에서) DOMException : 사용자가 먼저 문서와 상호 작용하지 않았기 때문에 play ()가 실패했습니다.

..Chrome 버전 66을 사용하여 데스크톱에서 동영상을 재생하려고 할 때.

웹 사이트에서 자동으로 재생되는 광고를 찾았지만 다음 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>

그래서으로 통과 한 쉽게 바로 추가 정말 크롬 V66의 자동 재생 차단제이다 webkit-playsinline="true", playsinline="true"하고 autoplay=""받는 특성을 <video>요소? 이것에 부정적인 결과가 있습니까?



답변

chrome 66 업데이트 후 html 5 요소에서 자동 재생이 작동 muted하도록하려면 video 요소에 속성을 추가하기 만하면 됩니다.

따라서 현재 동영상 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>

나는 크롬 66 업데이트가 사용자 탭에서 임의의 소음을 만드는 탭을 중지하려고한다고 생각합니다. 이것이 muted 속성이 자동 재생을 다시 작동하게하는 이유입니다.


답변

내가 찾은 최고의 솔루션은 비디오를 음소거하는 것입니다

HTML

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


답변

  1. 열다 chrome://settings/content/sound
  2. 설정 사용자 제스처가 필요하지 않습니다.
  3. Chrome 다시 시작

답변

당면한 질문에 답하는 중 …
아니요, 이러한 속성을 갖는 것만으로는 충분하지 않습니다. 오디오가있는 미디어를 자동 재생하려면 문서에 사용자 제스처를 등록해야합니다.

그러나이 제한은 매우 약합니다. 상위 문서에서이 사용자 제스처를 수신하고 동영상이 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>요소에서 프로그래밍 방식으로 메소드를 한 번 이상 실제로 트리거해야 합니다.

오디오가 필요하지 않은 경우 미디어에 첨부하지 마십시오. 비디오 트랙 만있는 비디오도 자동 재생이 허용되어 사용자의 대역폭 사용량을 줄일 수 있습니다.


답변

나를 위해 (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();
}


답변

mousemove 이벤트 lisentner를 사용해보십시오

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

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


답변

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>