【金秋打卡】第6天 TRTC
课程名称:SpringBoot+Vue3 项目实战,打造企业级在线办公系统
课程章节: 用户管理模块
课程讲师: 神思者
课程内容 接昨天
腾讯云TRTC服务的API文档(https://cloud.tencent.com/document/product/647/17249)
我们动手写JS程序之前,还是要先熟悉前端页面和视频会议的流程。例如当用户进入到meeting_video.vue页面,并不意味着连接上了在线视频会议室。而是需要我们手动点击右下角的电话图标,才会创建TrtcClient对象连接视频会议室,订阅远端流、推送本地流。当我再次点击电话图标,则会退出在线视频会议室,然后销毁本地流和远端流。
为什么不设计成进入到meeting_video.vue页面就自动连接视频会议室,推送本地流和订阅远端流?在技术上是可以实现的,但是不太符合情理。比如说用户希望先整理一下仪容仪表然后再进入视频会议室,如果你写的程序一上来就执行本地推流了,这就不太合适吧。
视频墙中每个格子里面都有用于播放流数据的DIV控件,这些控件的id就是某个参会人的userId。一会儿我们接收到远端流或者本地流的时候,可以从流中取出userId,然后找到对应的DIV控件播放流数据。
phoneHandle: function() {
let that = this;
//检查浏览器是否支持在线视频会议
TRTC.checkSystemRequirements().then(checkResult => {
if (!checkResult.result) {
that.$alert('当前浏览器不支持在线视频会议', '提示信息', {
confirmButtonText: '确定'
});
} else {
that.meetingStatus = !that.meetingStatus;
if (that.meetingStatus) {
//记录摄像头和话筒的状态
that.videoStatus = true;
that.micStatus = true;
//TRTC日志输出级别为Error
TRTC.Logger.setLogLevel(TRTC.Logger.LogLevel.ERROR);
//生成用户签名(进入视频会才需要用户签名,不需要提前生成)
that.$http('meeting/searchMyUserSig', 'GET', {}, false, function(resp) {
that.appId = resp.appId;
that.userSig = resp.userSig;
that.userId = resp.userId;
});
//创建TrtcClient对象
let client = TRTC.createClient({
mode: 'rtc',
sdkAppId: that.appId,
userId: that.userId + '',
userSig: that.userSig });
that.client = client;
//监听新增远端流事件(用户进入会议室时候触发)
client.on('stream-added', event => {
let remoteStream = event.stream;
//订阅远端流
client.subscribe(remoteStream);
//从远端流获得远程用户userId(创建TrtcClient对象时候的参数)
let userId = remoteStream.getUserId();
//TODO 把新上线的用户添加到页面右侧的在线人员列表中
//把远端流保存到模型层JSON中,将来大屏显示的时候要找到某个远端流停止小窗口播放,切换到大窗口播放
that.stream[userId] = remoteStream;
});
//远端流订阅成功事件
client.on('stream-subscribed', event => {
let remoteStream = event.stream;
let userId = remoteStream.getUserId();
//找到视频墙中某个远端用户的格子,把其中用于显示视频的DIV,置顶覆盖用户信息
$('#' + userId).css({ 'z-index': 1 });
//在这个置顶的DIV中播放远端音视频讯号
remoteStream.play(userId + '');
});
//订阅远端删除流事件(远端用户退出会议室)
client.on('stream-removed', event => {
let remoteStream = event.stream;
//取消订阅该远端流
client.unsubscribe(remoteStream);
let userId = remoteStream.getUserId();
//TODO 在页面右侧的用户列表中删除该用户
//停止播放远端流视频,并且关闭远端流
remoteStream.stop();
remoteStream.close();
//删除模型层JSON中保存的远端流对象
delete that.stream[userId];
//把视频墙中该用户格子的视频DIV控件置底,显示用户基本信息
$('#' + userId).css({ 'z-index': '-1' });
$('#' + userId).html('');
});
client .join({ roomId: that.roomId })
.then(() => {
//TODO 执行签到
//成功进入会议室,然后创建本地流
let localStream = TRTC.createStream({
userId: that.userId + '',
audio: true,
video: true
});
that.localStream = localStream;
localStream.setVideoProfile('480p'); //设置分辨率
//TODO 把自己添加到上线用户列表中
//初始化本地音视频流
localStream .initialize()
.catch(error => {
console.error('初始化本地流失败 ' + error);
})
.then(() => {
console.log('初始化本地流成功');
//视频墙中第一个格子中的视频DIV置顶
$('#localStream').css({ 'z-index': 1 });
//播放本地音视频流
localStream.play('localStream');
//向远端用户推送本地流
client .publish(localStream)
.catch(error => {
console.error('本地流发布失败 ' + error);
})
.then(() => {
console.log('本地流发布成功');
});
});
})
.catch(error => {
console.error('进入房间失败: ' + error);
});
} else {
//TODO 关闭视频会议
}
}
});},假设我们本地电脑被称作A,另一台电脑称作B,我们在B电脑上模拟其他参会人访问A电脑上的前端项目,必然要写A电脑的IP地址和端口号。但是现在有个问题,浏览器的WebRTC只支持HTTPS访问远端网站,我们在B电脑上用HTTP协议连接A电脑的网站是无法使用TRTC的。所以我们要想个办法,给B电脑上的浏览器添加参数,允许在HTTP协议下远程使用TRTC服务。
如果你用的是Windows系统,需要在Chrome浏览器图标上点击右键,在目标的结尾添加上下面这句话,然后把IP和端口改成A主机的。
--unsafely-treat-insecure-origin-as-secure="http://ip:port" --user-data-dir="C:/temp"
共同学习,写下你的评论
评论加载中...
作者其他优质文章
