Vue3_对接声网实时音视频_多人视频会议

news2024/11/15 17:18:41

目录

一、声网

1.注册账号

2.新建项目

二、实时音视频集成

1.声网CDN集成

2.iframe嵌入html

3.自定义UI集成

4.提高进入房间速度


web项目需要实现一个多人会议,对接的声网的灵动课堂。在这里说一下对接流程。

一、声网

声网成立于2014年,是全球实时互动云服务开创者和引领者。开发者只需简单调用声网 API,即可在应用内构建多种实时音视频互动场景。声网 API 已经赋能社交直播、教育、游戏电竞、IoT、AR/VR、金融、保险、医疗、企业协作等 20 余行业赛道,共计 200 多种场景。2020年6月26日,声网母公司 Agora, Inc. 成功登陆纳斯达克,股票代码为“API”。截至2023年12月31日,声网全球注册应用数超过74.2万。 

声网的实时互动技术服务覆盖全球 200 多个国家和地区。声网的客户包括小米、陌陌、斗鱼、哔哩哔哩、小红书、Yalla等巨头、独角兽及创业企业。

1.注册账号

声网官网icon-default.png?t=N7T8https://sso.shengwang.cn/cn/v4/signup/with-sms点击链接,注册账号。

注册后,登录,进入声网首页:

2.新建项目

首先实名认证,然后创建项目。

     

每个月有免费的10000分钟。

我的项目用的灵动课堂,你可以选择通用项目。

创建完成后,首页左上角选择创建好的项目,如果有多个项目,在这个切换。

查看当前项目信息:

二、实时音视频集成

我的项目是vue3框架的。

我们这个是后端创建了声网会议房间,前端直接使用cdn进入房间。只要cdn接入了,创建房间也是一样的,换成文档中相应的方法即可。

先说一下实现方式。使用html引入声网cdn,然后用iframe嵌入到vue页面。传参使用window。

1.声网CDN集成

在vue项目的public文件夹下新建一个文件,videoSW.html 

videoSW.html 

<!DOCTYPE html>
<html lang="">

<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width,initial-scale=1.0">

    <!-- 请把 script的src 的版本号替换为你的灵动课堂版本号,例如 2.9.40。你可以通过发版说明或 GitHub 仓库分支查看最新版本号。 -->
    
    <script
        src="https://download.agora.io/edu-apaas/release/edu_sdk@2.9.40.bundle.js"></script>
</head>

<body>
    <div class="videoContainer"></div>
    <style>
        .videoContainer {
            width: 100%;
            height: 100%;
        }
    </style>
    <script type="text/javascript">
        AgoraEduSDK.config({
            appId: window.appidB,
            region: 'cn'
        });
        // 启动在线课堂。
        AgoraEduSDK.launch(document.querySelector('.videoContainer'), {
            userUuid: window.userUuid,
            userName: window.userName,
            roomUuid: window.roomUuid,
            roleType: Number(window.roleType), // 用户角色:1 为老师,2 为学生, 3助教。
            roomType: Number(window.roomType), // 房间类型:0 为一对一,2 为大班课,4 为小班课。
            roomName: window.roomName,
            pretest: true, // 是否开启课前设备检测。
            rtmToken: window.rtmToken,
            language: 'zh', // 课堂界面的语言。如需界面为英文,设为 'en' 即可。
            duration: 60 * 30, // 课程时间,单位为秒。
            // recordUrl: 'https://teaching-research-1314823014.cos.ap-nanjing.myqcloud.com/js/shengwang/edu_sdk.bundle.gz.js',
            courseWareList: [],
            webrtcExtensionBaseUrl: 'https://solutions-apaas.agora.io/static', // WebRTC 插件部署地址
            uiMode: 'light', // 设置课堂界面为明亮模式。如需界面为暗黑模式,设为 'dark' 即可。
            mediaOptions: {  //(选填)媒体流相关设置,包含媒体流加密、摄像头视频流编码参数配置和屏幕共享视频流编码参数配置。
                cameraEncoderConfiguration: {
                    width: 160,
                    height: 120,
                    frameRate: 10,
                    bitrate: 100,
                },
                lowStreamCameraEncoderConfiguration:{
                    width: 160,
                    height: 120,
                    frameRate: 10,
                    bitrate: 100,
                }
            },
            // 课堂启动状态:ready: 课堂准备完毕 destroyed: 课堂已销毁
            listener: (evt, args) => {
                if (evt == 2) {
                    //教室已销毁,传参给父元素,也就是index.vue,然后在index.vue里面进行一些路由跳转。
                    window.parent.postMessage(2)
                }
                if (evt == 101) {
                    //被踢出房间
                    window.parent.postMessage(101)
                }
                if (evt == 202 && args == 3) {
                    //课堂已结束
                    window.parent.postMessage(202)
                }
            },
        });
    </script>
</body>

</html>

 window.userUuid等这些参数值都是后端传过来的。如果直接前端创建房间,那么直接按照文档填入即可。

集成声网灵动课堂icon-default.png?t=N7T8https://doc.shengwang.cn/doc/flexible-classroom/javascript/get-started/integrate

2.iframe嵌入html

新建一个vue页面,在里面请求需要后端传过来的数据。并且嵌入iframe。

idnex.vue

<template>
  <div class="append">
    <iframe id="iframeEvent" src="videoSW.html" width="100%" height="100%"></iframe>
  </div>
</template>
<script setup>
import { onMounted, reactive, watchEffect, toRefs, computed, onUnmounted } from "vue";

//如果前端直接新建会议房间,则不需要从后端请求数据

//如果后端已经新建会议房间,前端直接进入房间,则需要从后端获得数据。
//需要这些数据 userUuid、userName、roomUuid、rtmRole、rtmToken、theme(房间名名称)、roomType、appid

//以下数据是你从后端请求得到的数据,或者前端直接进入房间,则不需要进行这些数据传递。
let userId = userUuid;
let user = userName;
let roomId = roomUuid;
let role = rtmRole;
let token = rtmToken;
let room = theme;
let eduId = eduId;
let type = roomType;
let appidA = appid;

const event = (e) => {
  if (e.data == 2) {
    //教室已销毁,填入你的逻辑,进行页面跳转
  } else if (e.data == 101) {
   //被踢出房间
  } else if (e.data == 202) {
   //课堂已结束
  }
};

onMounted(() => {
  // 房间参数,传给videoSW.html,然后好进入会议房间
  document.querySelector("#iframeEvent").contentWindow.userUuid = userId;
  document.querySelector("#iframeEvent").contentWindow.userName = user;
  document.querySelector("#iframeEvent").contentWindow.roomUuid = roomId;
  document.querySelector("#iframeEvent").contentWindow.roleType = role;
  document.querySelector("#iframeEvent").contentWindow.rtmToken = token;
  document.querySelector("#iframeEvent").contentWindow.roomName = room;
  document.querySelector("#iframeEvent").contentWindow.roomType = type;
  document.querySelector("#iframeEvent").contentWindow.appidB = appidA;
  
  window.addEventListener("message", event, false);

});

onUnmounted(() => {
  window.removeEventListener("message", event, false);
});
</script>

<style lang="less" scoped>
.append {
  width: 100vw;
  height: 100vh;
}
</style>

 document.querySelector("#iframeEvent").contentWindow.userUuid = userId;

contentWindow这个属性:

此时即可进入多人会议了。

 你的界面可能和这个不一样,这个是声网的一个低代码产品_灵动课堂,右侧中间部分为白板,也是他们的产品。如果你想更改他的UI,下面介绍一下自定义UI方式集成。

3.自定义UI集成

具体步骤文档写的很详细。

自定义UI集成灵动课堂icon-default.png?t=N7T8https://doc.shengwang.cn/doc/flexible-classroom/javascript/get-started/integrate#%E4%BD%BF%E7%94%A8%E8%87%AA%E5%AE%9A%E4%B9%89-ui-%E7%9A%84%E6%96%B9%E5%BC%8F%E9%9B%86%E6%88%90如果你不是灵动课堂产品,你就找他相应的文档,按照上面操作即可。

按照文档改完UI后,进行打包:

 

 把 edu_sdk.bundle.js ,放到可以访问的服务器就可以,比如阿里oss或者腾讯云cos存储桶也可以。

4.提高进入房间速度

如果想让进入房间时访问速度加快,就需要使用CDN,步骤如下:

①压缩代码

② 阿里云oss设置

上传文件至阿里云OSS
如果使用阿里云OSS,可以使用管理界面上传。上传文件至OSS后,通过管理界面增加 content-encoding 响应头:

    

 修改引用文件
修改页面中引入的 sdk 文件路径:<script src="path/to/your/oss-bucket/edu_sdk.bundle.gz.js" /></script>

验证是否生效
上传成功后,在页面加载时打开开发者工具,检查此文件的网络请求:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1965556.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

知乎信息流广告怎么投?一文读懂知乎广告开户及投放!

作为中国领先的问答社区&#xff0c;知乎以其高质量的内容和活跃的用户群体成为了众多品牌青睐的营销阵地。为了帮助企业更高效地利用知乎平台进行品牌推广&#xff0c;云衔科技提供了全方位的知乎广告开户及代运营服务&#xff0c;助力您的品牌在知乎上实现快速增长。 一、知…

提单和提货单有什么区别❓一文读懂‼️

提货单与提单的区别 在国际贸易和物流领域中&#xff0c;提货单&#xff08;D/O&#xff09;和提单&#xff08;B/L&#xff09;是两个关键的单据&#xff0c;它们在货物清关和提货过程中扮演着重要角色。以下是对这两个单据的详细解释和它们之间的区别。 提货单&#xff08;…

pdf文件怎么删除页面?看完就能学会的四种删除pdf页面方法!

pdf文件怎么删除页面&#xff1f;在日常使用PDF文档的过程中&#xff0c;我们时常会遇到一些没必要存在的页面&#xff0c;保留这些页面可能带来多重不利影响&#xff0c;首先它们会打断阅读的流畅性&#xff0c;这会让人在阅读时感到突兀与不适&#xff0c;其次&#xff0c;这…

CentOS7下搭建配置SVN服务器

1、通过yum安装subversion&#xff0c;根据提示完成安装 <span style"color:#333333"><span style"background-color:#f5f5f5">sudo yum install subversion</span></span> subversion安装在/bin目录 <span style"colo…

蓝桥杯 Python 研究生组-2023-省赛-工作时长

蓝桥账户中心https://www.lanqiao.cn/problems/3494/learning/ 问题描述 小蓝手里有一份 20222022 年度自己的上班打卡记录文件&#xff0c;文件包含若干条打卡记录&#xff0c;每条记录的格式均为“yyyy-MM-dd HH:mm:ssyyyy-MM-dd HH:mm:ss”&#xff0c;即按照年-月-日 时:…

专业级翻译解决方案:2024年商务翻译工具精选

现在科技发达了&#xff0c;不会外语也不怕了&#xff08;因为可以借助很多翻译工具解决这个头疼的问题啦&#xff09;。如果说到翻译你想到的还是百度翻译&#xff0c;那你可以拓宽一些翻译工具待用库啦。现在有不少多功能&#xff0c;好用的翻译软件咯。 1.福昕在线翻译 链…

矿用综采工作面软件开发

故障诊断算法软件界面设计实时监测故障机理分析实时故障诊断 1.软件原型图 2.通信协议

SpringBoot集成GraalVM创建高性能原生镜像

1. GraalVM 原生镜像的介绍 GraalVM原生镜像为部署和运行Java应用程序提供了一种新的方式。与Java虚拟机相比&#xff0c;原生镜像可以以更小的内存占用和更快的启动时间运行。 它们非常适用于使用容器镜像部署的应用程序&#xff0c;当与 "功能即服务"&#xff08…

vue3 主页面 跳转到子页面后 ,再次切换到主页面后 主页面及其它的所有页面 竟然不显示了的解决。

1、child 子页面是这样写的&#xff0c;先上个代码图&#xff0c;template里面包含了Tabs,还有一个Modal(这个是后来加的&#xff09; 2、然后从parent跳转到了这个child&#xff0c;再次切换到parent页面时&#xff0c;什么页面的视图都不显示出来了 3、然后我们可以看到chi…

MySQL:初识数据库初始SQL创建数据库

目录 1、初始数据库 1.1 什么是数据库 1.2 什么是MySQL 2、数据库 2.1 数据库服务&数据库 2.2 C/S架构 3、 初始SQL 3.1 什么是SQL 3.2 SQL分类 4、使用SQL 4.1 查看数据库 4.1.2 语句解析 4.2 创建数据库 4.2.1 if not exists校验 4.2.2 手动明确字符集和排…

GPT 和 BERT 系列论文阅读总结

文章目录 1. GPT1.1 GPT的目的和任务1.2 GPT的实现1.2.1 Unsupervised pre-training1.2.2 Supervised fine-tuning1.2.3 特定任务的输入格式 2. BERT2.1 BERT的目的和任务2.2 BERT的实现2.2.1 Masked Language Model2.2.2 Next Sentence Prediction (NSP) 3. GPT-23.1 初见 pro…

HCL实验2:VLAN

目的&#xff1a;让PC_3和PC_5处于vlan1, PC_4和PC_6处于vlan2 SW1的配置命令: vlan 2 port GigabitEthernet 1/0/2 quit int g1/0/3 port link-type trunk port trunk permit vlan all quit SW2的配置命令&#xff1a; vlan 2 port GigabitEthernet 1/0/2 quit int g1/0/3 p…

黑马Java零基础视频教程精华部分_8_学生管理系统

系列文章目录 文章目录 系列文章目录一、业务分析二、结合业务流程图编写代码1、Student.java代码&#xff1a;2、StudentSystem.java代码&#xff1a;3、标号&#xff08;‌label&#xff09;‌ 三、学生管理系统升级版 一、业务分析 需求文档如图所示&#xff1a; 根据需求…

在线招投标系统在线编辑Word且兼容微软Office和金山WPS

随着信息技术的不断发展&#xff0c;电子政务已经非常普及&#xff0c;电子招投标行业市场规模不断扩大&#xff0c;电子招投标不仅可以减少繁琐的人工操作&#xff0c;提高工作效率&#xff0c;还能保证公开透明的招标流程&#xff0c;制作招标文件过程中&#xff0c;由于微软…

pikachu:XXE

判断是否有xxe漏洞&#xff0c;如果返回了 xxe 就是有 <?xml version "1.0"?> <!DOCTYPE a [<!ENTITY b "xxe">]><c>&b;</c> 读取敏感文件 <?xml version "1.0"?> <!DOCTYPE ANY [ <!ENT…

Hbuilder x 解决打开内置终端或者控制台空白

文章目录 目录 文章目录 流程 小结 概要教程技术细节小结 概要 解决方式有3种 问题展示&#xff0c;如图所示&#xff1a; 其实忽略了一个本身的问题&#xff0c;小问题。打开控制终端没有显示可能是你还没有点击 以上细节没有问题还是没有解决的话&#xff0c;请根据二种方式…

Express基于Node.js基础知识【2】全面总结 推荐

最近在用基于node.js平台的web应用开发做项目&#xff0c;梳理了下关于Express框架的相关知识&#xff0c;方便自己以后查看&#xff0c;希望也能帮助证字啊学习express相关知识的同学&#xff0c;欢迎大家参考&#xff0c;有问题评论区留言&#xff0c;谢谢。 Node.js下载安装…

Java答题系统练习模拟考试系统小程序源码

&#x1f31f;【提分神器】答题系统练习&#xff0c;模拟考试新体验&#x1f4da; &#x1f680;【开篇引入&#xff1a;解锁高效学习新方式】&#x1f680; Hey小伙伴们&#xff0c;是不是每次临近考试都紧张得手心冒汗&#xff0c;生怕知识点掌握不牢固&#xff1f;别怕&am…

【C语言】C语言期末突击/考研--选择、循环语句

目录 一、知识点 1、关系表达式与逻辑表达式 2、if-else语句 3、while循环 4、for循环 5、continue语句 6、break语句 二、练习题 解析&#xff1a; 一、知识点 1、关系表达式与逻辑表达式 我们控制程序执行逻辑运算需要选择和循环结构&#xff0c;那么我们首先来讲选…

24年保研暑假:编程细节和方法(1.二分查找 2.快速幂 3.领接矩阵 4.有序集合的范围查找 5.查找容器内最大最小值 6.含边界位置遍历方案)

文章目录 1.二分查找mid防溢出2.快速幂扩展3.vector实现领接矩阵4.有序集合的范围查找5.查找容器内最大最小值6.含边界位置遍历方案 1.二分查找mid防溢出 我们通常写二分求mid&#xff0c;一般这样写&#xff1a; int mid (right - left >> 1) left;原因在于两个正整…