阿里云ARTC Web SDK提供屏幕共享功能。在发布屏幕共享前,您需要判断当前浏览器环境是否支持屏幕共享,支持预览和订阅屏幕共享流。本文为您介绍屏幕共享相关功能的示例代码。
发布屏幕共享流
判断当前环境是否支持屏幕共享
开启屏幕共享前,您需要先检测当前浏览器是否支持屏幕共享。
const checkResult = await AliRtcEngine.isSupported();
if (!checkResult.detail.isScreenShareSupported) {
// 通过静态方法 isSupported 返回的结果判断是否支持屏幕共享,不支持时提示用户更换或升级浏览器
console.log('The current browser does not support screen sharing.');
}
开启屏幕共享
调用startScreenShare接口开启屏幕共享,如果需要共享音频请将audio参数设为true。
说明
audio参数设置为true时,浏览器系统共享弹窗中将展示是否同时分享标签页中的音频选项,如果用户选择不开启,那么也不会共享音频。另外,Windows设备支持共享系统或标签页的音频,而macOS设备仅支持共享标签页的音频。
// 前提:需要先创建引擎实例
try {
await aliRtcEngine.startScreenShare({
audio: true, // 是否需要共享音频
});
} catch (error) {
console.log('start screen share fail', error);
}
调用startScreenShare接口后,浏览器将弹出系统弹窗,用户需要选中待共享的标签页、窗口或屏幕,再单击分享按键,才能开启屏幕共享。
预览
如果需要预览共享的屏幕流,可以调用setLocalViewConfig接口进行设置。具体方法如下:
在HTML代码中增加一个ID为screenPreviewer的VIDEO元素。
<video id="screenPreviewer" style="display: block;width: 320px;height: 180px;background-color: black;" ></video>
通过setLocalViewConfig方法传入元素ID开启预览。
// 第一个参数支持传入 HTMLVideoElement 或对应的元素 ID,传入 null 时停止预览 // 第二个参数支持传入 1 (预览相机流)、2(预览屏幕共享流) aliRtcEngine.setLocalViewConfig('screenPreviewer', 2);
订阅屏幕共享流
如果需要订阅远端用户的屏幕流,需要监听screenSubscribeStateChanged事件,当状态变为已订阅后调用setRemoteViewConfig接口播放。具体方法如下:
在HTML代码中增加一个ID为screenVideoContainer的DIV元素作为容器。
<div id="screenVideoContainer"></div>
监听到远端屏幕流订阅变化后,若已订阅setRemoteViewConfig接口则播放,若未订阅则移除。
// 存储 Video 元素 const remoteVideoElMap = {}; // 远端容器元素 const remoteVideoContainer = document.querySelector('#remoteVideoContainer'); function removeRemoteVideo(userId) { const el = remoteVideoElMap[userId]; if (el) { aliRtcEngine.setRemoteViewConfig(null, userId, 1); el.pause(); remoteVideoContainer.removeChild(el); delete remoteVideoElMap[userId]; } } // 监听 screenShareSubscribeStateChanged 事件 aliRtcEngine.on('screenShareSubscribeStateChanged', (userId, oldState, newState, interval, channelId) => { // oldState、newState 类型均为AliRtcSubscribeState,值包含 0(初始化)、1(未订阅)、2(订阅中)、3(已订阅) // interval 为两个状态之间的变化时间间隔,单位毫秒 console.log(`频道 ${channelId} 远端用户 ${userId} 订阅状态由 ${oldState} 变为 ${newState}`); // 处理示例 if (newState === 3) { const video = document.createElement('video'); video.autoplay = true; video.setAttribute('style', 'display: block;width: 320px;height: 180px;background-color: black;'); remoteVideoElMap[userId] = video; remoteVideoContainer.appendChild(video); // 第一个参数传入 HTMLVideoElement // 第二个参数传入远端用户 ID // 第三个参数支持传入 1 (预览相机流)、2(预览屏幕共享流) aliRtcEngine.setRemoteViewConfig(video, userId, 1); } else if (newState === 1) { removeRemoteVideo(userId); } });
文档内容是否对您有帮助?