|
13 | 13 |
|
14 | 14 | 1. 调用 audio 或 video 的 play 方法时,会报类似于 `DOMException: play() failed because the user didn’t interact with the document first.` 的错误信息。
|
15 | 15 |
|
16 |
| -2. 开启 audio 或 video 的 autoplay 时,即标签上填有 'autoplay' 属性,如 <audio autoplay/>,浏览器控制台会有类似于 `The AudioContext was not allowed to start` 的告警信息。此时,如果页面中使用的是 video 标签,一般会处于 `白屏` 状态。 |
| 16 | +2. 开启 audio 或 video 的 autoplay 时,即标签上填有 'autoplay' 属性,如 `<audio autoplay/>`,浏览器控制台会有类似于 `The AudioContext was not allowed to start` 的告警信息。此时,如果页面中使用的是 video 标签,一般会处于 `白屏` 状态。 |
17 | 17 |
|
18 | 18 |
|
19 | 19 | ## 解决方法
|
20 | 20 |
|
21 |
| -1. 提前检测浏览器是否能自动播放 |
| 21 | +1. 调用 `play` 方法播放失败时,绕开 autoplay 的限制 |
22 | 22 |
|
23 |
| -在用 URTC 创建 client 前,可使用 [can-autoplay](https://www.npmjs.com/package/can-autoplay) 第三方库进行检测,若不支持,可引导用户点击页面上的某个位置(譬如模态框上的确定按钮)来触发用户与页面的交互(即解锁 `the user didn’t interact with the document first`),然后再用 URTC 创建 client 并 joinRoom。示例代码: |
| 23 | +此时可引导用户点击页面上的某个位置,譬如模态框上的确定按钮,再在该 `click` 事件的监听函数里调用 `resume` 方法。示例代码: |
24 | 24 |
|
25 | 25 | ```js
|
26 |
| -canAutoplay.video().then(res => { |
27 |
| - const { result } = res; |
28 |
| - if (!result) { |
29 |
| - // 弹出模态框提示用户点击 |
| 26 | +client.play({ |
| 27 | + streamId: 'xxx' |
| 28 | +}, (err) => { |
| 29 | + if (err) { |
| 30 | + console.log('播放失败', err); |
| 31 | + client.resume('xxx', (err) => { |
| 32 | + if (err) { |
| 33 | + console.log('恢复播放失败', err); |
| 34 | + } |
| 35 | + }); |
30 | 36 | }
|
31 | 37 | });
|
32 | 38 | ```
|
33 | 39 |
|
34 |
| -2. 调用 audio 或 video 的 play 方法播放失败时,绕开 autoplay 的限制 |
| 40 | +> 注:在调用 URTC sdk 的 `play` 方法失败时,会自动显示音视频播放元素的控制面板,面板里会有播放按钮等操作工具,您也可以不调用 `resume` 方法,仅提示用户点击音视频播放元素的控制面板上的播放按钮进行播放。 |
| 41 | +
|
| 42 | +2. 直接绕开 autoplay 的限制 |
35 | 43 |
|
36 |
| -此时可与第一种方法类似,引导用户点击该 audio 或 video 标签(也可以是页面上的某个位置,譬如模态框上的确定按钮),但需要在该 `click` 事件的监听函数里再次调用 play 方法。示例代码: |
| 44 | +由于浏览器限制的是声音的自动播放,在以静音状态进行播放时,是不受 autoplay 的限制的,此时可在调用 `play` 方法时,传的参数中携带 mute: true,并在页面中提示用户,由用户来决定是否与页面进行交互并调用 `resume` 方法来恢复播放声音。示例代码: |
| 45 | + |
| 46 | +```html |
| 47 | +<span id="unmuteBtn" class="unmute-btn"></span> |
| 48 | +``` |
37 | 49 |
|
38 | 50 | ```js
|
39 |
| -// 此处 videoElem 为页面中的 video 标签的 DOM 对象 |
40 |
| -videoElem.play() |
41 |
| - .catch(function () { |
42 |
| - alert('自动播放失败,请点击 video 进行播放'); |
43 |
| - videoElem.onclick = function() { |
44 |
| - videoElem.play() |
45 |
| - .then(function() { |
46 |
| - console.log('播放成功'); |
47 |
| - }) |
48 |
| - .catch(function(err) { |
49 |
| - console.log('播放失败', err); |
50 |
| - }); |
| 51 | +let unmuteBtn = document.querySelector('#unmuteBtn'); |
| 52 | +client.play({ |
| 53 | + streamId: 'xxx', |
| 54 | + mute: true |
| 55 | +}, (err) => { |
| 56 | + if (err) { |
| 57 | + console.log('播放失败', err); |
| 58 | + } |
| 59 | +}); |
| 60 | +unmuteBtn.onclick = function() { |
| 61 | + client.resume('xxx', (err) => { |
| 62 | + if (err) { |
| 63 | + console.log('恢复播放失败', err); |
51 | 64 | }
|
52 | 65 | });
|
| 66 | +} |
53 | 67 | ```
|
54 | 68 |
|
55 |
| -3. 直接绕开 autoplay 的限制 |
56 |
| - |
57 |
| -由于浏览器限制的是声音的自动播放,在以静音状态进行播放时,是不受 autoplay 的限制的,此时可加上 muted 属性,并在页面中添加静音的图标,由用户来决定是否点击图标来播放声音。示例代码: |
| 69 | +3. 提前检测浏览器是否能自动播放 |
58 | 70 |
|
59 |
| -```html |
60 |
| -<video id="player" autoplay muted/> |
61 |
| -<span id="unmuteBtn" class="unmute-btn"></span> <!-- 这里是静音图标 --> |
62 |
| -``` |
| 71 | +在用 URTC 创建 client 前,可使用 [can-autoplay](https://www.npmjs.com/package/can-autoplay) 第三方库进行检测,若不支持,可引导用户点击页面上的某个位置(譬如模态框上的确定按钮)来触发用户与页面的交互(即解锁 `the user didn’t interact with the document first`),然后再用 URTC 创建 client 并 joinRoom。示例代码: |
63 | 72 |
|
64 | 73 | ```js
|
65 |
| -let player = document.querySelector('#player'); |
66 |
| -let unmuteBtn = document.querySelector('#unmuteBtn'); |
67 |
| -unmuteBtn.onclick = function() { |
68 |
| - if (player.muted) { |
69 |
| - player.muted = false; |
70 |
| - unmuteBtn.className = 'mute-btn'; |
71 |
| - } else { |
72 |
| - player.muted = true; |
73 |
| - unmuteBtn.className = 'unmute-btn'; |
| 74 | +canAutoplay.video().then(res => { |
| 75 | + const { result } = res; |
| 76 | + if (!result) { |
| 77 | + // 弹出模态框提示用户点击 |
74 | 78 | }
|
75 |
| -} |
| 79 | +}); |
76 | 80 | ```
|
77 | 81 |
|
78 | 82 | FAQ
|
79 | 83 |
|
80 | 84 | Q: 为什么有时可以播放,有时不行?
|
81 |
| -A: 1. 因为页面不是 100% 被 Autoplay 限制,随着用户使用这个页面的次数增加,部分浏览器会把这个页面加入自己的 Autoplay 白名单列表中。2. 在推+拉流时,若客户端先推流(读取麦克风设备),再拉流,可以绕开 autoplay 的限制。 |
| 85 | +A: 1. 部分浏览器会有自动播放的限制(如 Chrome 70 及以上和 Safari 浏览器)。2.因为页面不是 100% 被 Autoplay 限制,随着用户使用这个页面的次数增加,部分浏览器会把这个页面加入自己的 Autoplay 白名单列表中。3. 在推+拉流时,若客户端先推流(读取麦克风设备),再拉流,可以绕开 autoplay 的限制。 |
82 | 86 |
|
83 | 87 | Q: 为什么别的产品可以自动播放,URTC 却不可以?
|
84 |
| -A: 排查问题时可先确定客户端是不是先推流再拉流(参考上面的问题)。如果是仅拉流,由于这是浏览器级别的限制,所有同类产品都会受到这个 autoplay 限制的影响,解决办法无外乎上面几种。 |
85 |
| -部分产品里由于封装了 DOM 操作的方法,譬如播放时是由用户主动传入 video 标签的 id,在 sdk 内部调用 video 的 play 方法,并在失败时,在页面里插入 DOM 元素并提示用户进行交互,故被人容易理解为其支持自动播放。URTC 为了避免直接操作 DOM,并没有封装此类方法,以保证用户处理此类问题时的灵活性。 |
| 88 | +A: 排查问题时可先确定客户端是不是先推流再拉流(参考上面的问题)。如果是仅拉流,由于这是浏览器级别的限制,所有同类产品都会受到这个 autoplay 限制的影响,解决办法无外乎上面几种。 |
0 commit comments