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


122

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

잡히지 않은 (약속에서) 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>요소? 이것에 부정적인 결과가 있습니까?


2
playinline은 iOS의 문제라고 생각합니다.
Josh Lee

답변:


125

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 속성이 자동 재생을 다시 작동하게하는 이유입니다.


한 시간 동안 머리카락을 뽑은 후. 이것은 내 문제를 해결했습니다
Andy McCormick 19

비디오 재생이 시작된 직후에 오디오를 활성화하는 방법이 있습니까? mute속성을 제거하거나 속성을 설정하는 volume것은 도움이되지 않습니다.
nikitahl

MacOs Chrome 버전 74.0.3729.131에서 두 스 니펫 모두 검은 색 화면을 표시합니다
Kamil Kiełczewski

@ KamilKiełczewski이 ( src가) 유효하지 않아 동영상에 검은 색 화면이 표시 되었습니다. src동영상이 자동 재생되도록 스 니펫을 업데이트했습니다 .
Joe

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
Ng8, 최신 Angular 버전에서도 절대적으로 사실이며 믿을 수 없습니다. Angular는 컴포넌트의 HTML 템플릿에서 무슨 일이 일어나는지 신경 쓰지 않습니다!
Pedro Ferreira

2
그리고, 사용하는 새로운 각도의 방법을 @ViewChild(): true로 sttatic 옵션을 설정해야합니다 @ViewChild('videoPlayer', {static: true}) videoplayer: ElementRef; video: HTMLVideoElement; 다음과 : this.video = this.videoplayer.nativeElement;@ngOnInit()
페드로 페레이라

1
이것은 내 문제였으며 HTML에서 음소거는 완전히 무시되었으며 JS에서 강제로 처리해야했습니다. + 일 검색 후 귀하의 답변에 1M
Ignacio Bustos

이것은 제 경우에 정답입니다. 완벽하게 작동했습니다
Harry .Naeem

와우, 실제로 Angular SSR로드 후 뷰에 자바 스크립트 측 뮤팅이 필요하다는 것을 믿을 수 없습니다. 이번에는 HTML이 문제라고 생각했습니다.
arao6

7

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

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의 메서드를 사용하기 시작했을 때 작동이 중지되었습니다 (보기 렌더링에 문제가 있음).

내가 변경하는 경우 markForCheckdetectChanges그것을 다시 일하기 시작했다. 무슨 일이 일어 났는지 정말 설명 할 수 없습니다. 그냥 여기에 놓아 두는 생각이 들었습니다. 아마도 누군가를 도울 것입니다.


1

예상대로 코드 작업을 위해 muted내부 에 속성 을 추가해야합니다 videoElement. 우는 소리 ..

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

유효한 비디오 링크를 소스로 추가하는 것을 잊지 마십시오


0

Android Phone에서 재생하는 데 문제가 있습니다. 몇 번의 시도 끝에 데이터 세이버가 켜져있을 때 자동 재생이 없다는 것을 알았습니다.

데이터 세이버 모드가 활성화 된 경우 자동 재생이 없습니다 . 데이터 세이버 모드가 활성화 된 경우 미디어 설정에서 자동 재생이 비활성화됩니다.

출처


-6

주소 표시 줄에 Chrome : // flags 를 입력 합니다.

검색 : 자동 재생

자동 재생 정책

오디오 또는 비디오의 자동 재생 허용 여부를 결정할 때 사용되는 정책입니다.

– Mac, Windows, Linux, Chrome OS, Android

"이 설정 에는 사용자의 제스처가 필요하지 않습니다 "

Chrome을 다시 시작하면 코드를 변경할 필요가 없습니다.


24
모든 사용자에게 설정 변경을 요청할 수는 없습니다.
Ashish Jhanwar

2
이것은 실제로 일부 사람들 (키오스크, 개인 및 로컬 웹 사이트 ...)의 문제를 해결할 수 있지만 Chrome 76에서 플래그가 제거되었습니다. 이제 유일한 해결책은 이 답변입니다
Milan Švehla
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.