Skip to content

Commit b424335

Browse files
committed
更新版本到 1.5.0
ChangeLog 1. 支持发布图片流 2. 废弃了 startRecording, stopRecording 方法 3. 废弃了 startMix, stopMix, addMixStreams, removeMixStreams 方法 4. 新增 startRecord, stopRecord, updateRecordStreams, startRelay, stopRelay, updateRelayStreams 方法,用于录制及转推功能 5. 录制/转推新增 customMain, customFlow, single 的布局 6. 新增 record-notify 及 relay-notify 事件,用于通知录制/转推中的错误 7. 新增 setRole 方法,允许 live 模式下,切换角色,进行连麦 8. 对本地浏览器不支持的编码格式的流进行订阅时,将会收到订阅失败的错误提示 9. 新增 play, resume 方法,播放音视频流时,无需用户自己操作 video 和 audio 标签,使播放更简单 10. 发布流增加音轨,允许用户针对该音轨进行处理,如展示声音的波形图等 11. 其他一些问题的修复及内部优化
1 parent b11d24d commit b424335

File tree

6 files changed

+631
-125
lines changed

6 files changed

+631
-125
lines changed

AutoPlay.md

+44-41
Original file line numberDiff line numberDiff line change
@@ -13,73 +13,76 @@
1313

1414
1. 调用 audio 或 video 的 play 方法时,会报类似于 `DOMException: play() failed because the user didn’t interact with the document first.` 的错误信息。
1515

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 标签,一般会处于 `白屏` 状态。
1717

1818

1919
## 解决方法
2020

21-
1. 提前检测浏览器是否能自动播放
21+
1. 调用 `play` 方法播放失败时,绕开 autoplay 的限制
2222

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` 方法。示例代码:
2424

2525
```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+
});
3036
}
3137
});
3238
```
3339

34-
2. 调用 audio 或 video 的 play 方法播放失败时,绕开 autoplay 的限制
40+
> 注:在调用 URTC sdk 的 `play` 方法失败时,会自动显示音视频播放元素的控制面板,面板里会有播放按钮等操作工具,您也可以不调用 `resume` 方法,仅提示用户点击音视频播放元素的控制面板上的播放按钮进行播放。
41+
42+
2. 直接绕开 autoplay 的限制
3543

36-
此时可与第一种方法类似,引导用户点击该 audio 或 video 标签(也可以是页面上的某个位置,譬如模态框上的确定按钮),但需要在该 `click` 事件的监听函数里再次调用 play 方法。示例代码:
44+
由于浏览器限制的是声音的自动播放,在以静音状态进行播放时,是不受 autoplay 的限制的,此时可在调用 `play` 方法时,传的参数中携带 mute: true,并在页面中提示用户,由用户来决定是否与页面进行交互并调用 `resume` 方法来恢复播放声音。示例代码:
45+
46+
```html
47+
<span id="unmuteBtn" class="unmute-btn"></span>
48+
```
3749

3850
```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);
5164
}
5265
});
66+
}
5367
```
5468

55-
3. 直接绕开 autoplay 的限制
56-
57-
由于浏览器限制的是声音的自动播放,在以静音状态进行播放时,是不受 autoplay 的限制的,此时可加上 muted 属性,并在页面中添加静音的图标,由用户来决定是否点击图标来播放声音。示例代码:
69+
3. 提前检测浏览器是否能自动播放
5870

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。示例代码:
6372

6473
```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+
// 弹出模态框提示用户点击
7478
}
75-
}
79+
});
7680
```
7781

7882
FAQ
7983

8084
Q: 为什么有时可以播放,有时不行?
81-
A: 1. 因为页面不是 100% 被 Autoplay 限制,随着用户使用这个页面的次数增加,部分浏览器会把这个页面加入自己的 Autoplay 白名单列表中。2. 在推+拉流时,若客户端先推流(读取麦克风设备),再拉流,可以绕开 autoplay 的限制。
85+
A: 1. 部分浏览器会有自动播放的限制(如 Chrome 70 及以上和 Safari 浏览器)。2.因为页面不是 100% 被 Autoplay 限制,随着用户使用这个页面的次数增加,部分浏览器会把这个页面加入自己的 Autoplay 白名单列表中。3. 在推+拉流时,若客户端先推流(读取麦克风设备),再拉流,可以绕开 autoplay 的限制。
8286

8387
Q: 为什么别的产品可以自动播放,URTC 却不可以?
84-
A: 排查问题时可先确定客户端是不是先推流再拉流(参考上面的问题)。如果是仅拉流,由于这是浏览器级别的限制,所有同类产品都会受到这个 autoplay 限制的影响,解决办法无外乎上面几种。
85-
部分产品里由于封装了 DOM 操作的方法,譬如播放时是由用户主动传入 video 标签的 id,在 sdk 内部调用 video 的 play 方法,并在失败时,在页面里插入 DOM 元素并提示用户进行交互,故被人容易理解为其支持自动播放。URTC 为了避免直接操作 DOM,并没有封装此类方法,以保证用户处理此类问题时的灵活性。
88+
A: 排查问题时可先确定客户端是不是先推流再拉流(参考上面的问题)。如果是仅拉流,由于这是浏览器级别的限制,所有同类产品都会受到这个 autoplay 限制的影响,解决办法无外乎上面几种。

Manual.md

+28-5
Original file line numberDiff line numberDiff line change
@@ -46,18 +46,41 @@ const client = new UCloudRTC.Client(appId, token);
4646

4747
```
4848
client.on('stream-published', (stream) => {
49-
// 使用 HtmlMediaElement 播放媒体流。将流的 mediaStream 给 Video/Audio 元素的 srcObject 属性,即可播放,注意设置 autoplay 属性以支持视频的自动播放,其他属性请参见 [<video>](https://developer.mozilla.org/zh-CN/docs/Web/HTML/Element/video)
50-
htmlMediaElement.srcObject = stream.mediaStream;
49+
client.play({
50+
streamId: stream.sid,
51+
container: divElement
52+
});
53+
// 此处 divElement 代表播放发布流的外层容器元素,也可以是这个外层容器元素的 ID,而外层容器一般是一个设置了宽高的 div 元素,请根据实际情况进行传值
5154
}); // 监听本地流发布成功事件,在当前用户执行 publish 后,与服务器经多次协商,成功后会触发此事件
5255
5356
client.on('stream-subscribed', (stream) => {
54-
// 使用 HtmlMediaElement 播放媒体流
55-
htmlMediaElement.srcObject = stream.mediaStream;
57+
client.play({
58+
streamId: stream.sid,
59+
container: divElement
60+
});
61+
// divElement 如上面所说
5662
}); // 监听远端流订阅成功事件,在当前用户执行 subscribe 后,与服务器经多次协商,成功后会触发此事件
5763
5864
client.on('stream-added', (stream) => {
5965
client.subscribe(stream.sid);
60-
}); // 监听新增远端流事件,在远端用户新发布流后,服务器会推送此事件的消息。注:当刚进入房间时,若房间已有的正在发布的流,也会通过此事件进行通知业务侧
66+
}); // 监听新增远端流事件,在远端用户新发布流后,服务器会推送此事件的消息。注:当刚进入房间时,若房间已有的正在发布的流,也会通过此事件通知业务侧
67+
68+
client.on('stream-removed', (stream) => {
69+
// 在页面中删除播放该流的外层容器元素
70+
}); // 监听移除的远端流事件,在远端用户取消推流或流已关闭时,服务器会推送此事件的消息。
71+
72+
client.on('stream-reconnected', (streams) => {
73+
const { previous, current } = streams;
74+
// 从本地缓存的流的数据里找到对应的流并用重连后该流的数据更新原流的数据,或直接删除原来的流,并使用新的流
75+
let idx = allStreams.findIndex(item => item.sid === previous.sid);
76+
if (idx >= 0) {
77+
allStreams.splice(idx, 1, current);
78+
}
79+
client.play({
80+
streamId: current.sid,
81+
container: divElement
82+
});
83+
}); // 当网络断开又恢复时,发布/订阅流可能会被重连,重连成功后,会通过此事件通知业务侧
6184
```
6285

6386
## 3. 加入一个房间,然后发布本地流

0 commit comments

Comments
 (0)