这是一篇关于TRTC的Web应用的初级入门文章,高手请略过。经过一段时间对腾讯云的TRTC的Web端和安卓端SDK学习和摸索,分几个周末把这个学习过程给大家整理成为笔记,如有错漏的地方,欢迎指正。
在建立这个在线课堂应用过程中,可能会使用到腾讯云的IM、云直播等服务,以及对应安卓端SDK,下面将通过三篇文章来记录这个过程,本文为第一篇。
# 安装VUEJS开发手脚架
npm install -g @vue/cli
# 创建新项目
vue create ClassRoomVue
# 进入工程目录
cd ClassRoomVue
# 引入base64 模块 生成转码URI
npm install --save js-base64
# 引入md5 模块 生产房间ID摘要
npm install --save js-md5
# 启动VUE开发服务程序
npm run serve
打开浏览器访问 http://localhost:8080,可以看到正确渲染的页面。
使用Visual Studio Code 或者其他代码编辑器打开 ClassRoomVue目录,如下图所示:
#
npm install trtc-js-sdk
# 在index.html文件中插入以下代码
<script src="js/GenerateTestUserSig.js"></script>
<script src="js/lib-generate-test-usersig.min.js"></script>
<script src="js/trtc.js"></script>
1. 在工程的components 目录下创建以下文件
AppTitleBar.vue // 标题栏组件 (通用)
ClassRoom.vue // 教师房间UI组件 (通用)
LoginBox.vue // 登录组件 (通用)
MessageBox.vue //消息发送框组件 (通用)
StudentVideo.vue // 学生视频显示组件 (教师端)
TeacherLocalVideo.vue //教师本地视频显示组件 (教师端)
TeacherVideo.vue // 教师远程视频显示组件 (学生端)
TeacherWhiteBoard.vue // 教师白板 (教师端)
登录界面
2 . 在工程目录创建TRTC服务模块 TRTC.Sevice.js,方便各组件调用TRTC的api
import TRTC from 'trtc-js-sdk';
import { genTestUserSig } from "./GenerateTestUserSig";
export let roomId = null;
export let userSig = null;
export const streamInfo = {};
export const userInfo = {name:"MyName"};
export let sdkAppId = null;
export let client = null;
export const createLocalStream = function(userId,callback){
console.log("create local stream "+userId);
streamInfo.localStream = TRTC.createStream({ userId:userId, audio: true, video: true });
streamInfo.localStream.setVideoProfile('480p');
streamInfo.localStream.initialize().then(() => {
callback(streamInfo.localStream);
});
return streamInfo.localStream;
};
export const createNewLiveClient = function(userId){
return TRTC.createClient({ sdkAppId, userId, userSig, mode: 'live'});
};
// 房间控制器
export const RoomControl = {
//创建课堂房间
createClassRoom : function( roomId_,callback){
console.log("createClassRoom "+roomId_);
roomId = roomId_;
const UserSig = genTestUserSig(roomId);
sdkAppId = UserSig.sdkAppID;
userSig = UserSig.userSig;
client = TRTC.createClient({
'mode': 'rtc',
'sdkAppId':sdkAppId,
'userId':roomId,
'userSig':userSig
});
callback(client);
return client;
},
// 进入课堂
enterClassRoom:function(roomId,callback){
client.join({ 'roomId':roomId })
.catch(error => {
console.error('进房失败 ' + error);
})
.then(() => {
console.log('进房成功 '+roomId+" "+userSig);
callback(client);
});
},
exitClassRoom : function(callback){
if(window.confirm("确定退出课堂吗?")){
callback();
}
}
}
3. 在LoginBox.vue 模块编写用户登录页面,收集教师用户的名字、手机等信息,为后面创建课堂的唯一URI做准备。
<template>
<div>
<el-row>
<el-col :span="12" :offset="6">
<el-card click="alert('aa');userInfo.role=0" :body-style="{ padding: '0px' }" :shadow="userInfo.role==0?'always':'never'">
<img style="height:200px" src="teacher.jpeg" class="image">
<div style="padding: 14px;">
<span>我是老师,准备开课。</span>
<div class="bottom clearfix">
</div>
</div>
</el-card>
</el-col>
</el-row>
<el-form style="margin:36px" label-width="80px" :model="userInfo">
<el-form-item label="我的名字">
<el-input v-model="userInfo.name"></el-input>
</el-form-item>
<el-form-item label="手机号">
<el-input v-model="userInfo.phone"></el-input>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="enterRoom()"> 进入课堂 </el-button>
</el-form-item>
</el-form>
</div>
</template>
<script>
import {RoomControl} from './../TRTC.Service';
import {userInfo} from './../TRTC.Service';
export default {
name: 'LoginBox',
props: {
msg: String
},
data:function(){
return {
userInfo:{role:0,name:"My Name",phone:"0001"}
};
},
created:function(){
userInfo.name = this.userInfo.name;
},
methods:
{
enterRoom:function(){
userInfo.name = this.userInfo.name;
userInfo.phone = this.userInfo.phone;
RoomControl.createClassRoom(this.userInfo.phone,()=>{
this.$emit("enterroom");
});
}
}
}
</script>
<style scoped>
</style>
4. 在ClassRoom.vue 模块里编写课堂的实现逻辑代码,流程如下,进入房间,显示本地视频流,然后通过client.publish() 把本地音视频流推送到TRTC。
import Vue from 'vue';
import WhiteBoard from './TeacherWhiteBoard.vue';
import TeacherLocalVideo from './TeacherLocalVideo.vue';
import StudentVideo from './StudentVideo.vue';
import {createLocalStream} from './../TRTC.Service';
import {RoomControl} from './../TRTC.Service';
import {userInfo} from './../TRTC.Service';
import {roomId} from './../TRTC.Service';
import {client} from './../TRTC.Service';
let Base64 = require('js-base64').Base64;
export default {
name: 'TeacherClassRoom',
components: {
WhiteBoard,
TeacherLocalVideo,
StudentVideo
},
props: {
},
created:function(){
// 房间内容有新链路加入事件
client.on('stream-added', event => {
console.log('stream added ');
this.students.push(event);
this.onStudentEnterRoom(event);
});
// 房间内容有新链路退出事件
client.on('stream-removed', event => {
console.log('stream removed ');
this.onStudenExitRoom(event);
});
RoomControl.enterClassRoom(roomId,()=>{
this.visitURI = window.location.href+"#"+ Base64.encode( roomId+"|"+userInfo.name);
createLocalStream(roomId,(stream)=>{
Vue.nextTick(()=>{
stream.play("local_stream");
client.publish(stream).then(() => {
console.log('publish');
callback(stream);
});
});
});
});
},
methods:{
onStudenExitRoom:function(event){
console.log('onStudenExitRoom ');
},
onStudentEnterRoom:function(event){
console.log('onStudentEnterRoom ');
}
},
data:function(){
return {
visitURI:"",
students:[]
};
}
}
开发好教师端课堂相关模块后,可以看到音视频流成功地发送出去,下一步是在TRTC仪表盘看一下,刚刚发布的数据是否真的已经被TRTC服务器所接收。
从仪表盘看,老师端的音视频数据已经进入TRTC的服务器,并显示终端设备的一些信息。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。