Web音视频通话解决方案 —— Agora Web SDK NG 版接入教程

article/2025/10/13 5:52:48

引言

随着社会的发展,人们对实时音视频的需求越来越多。在线会议,电商直播,在线教育等相关产品不断涌现。但是对于个人开发者或者小团队来说,自己实现一个实时音视频服务并且要保障服务稳定,满足低延时等要求,难度非常大。为此我们需要寻找一个合适的解决方案。功能强大且可靠的声网Agora就成为了极佳的选择。

今年声网推出了下一代 Agora Web SDK (Agora Web SDK NG),基于 TypeScript 开发,使用 Promise 来管理异步操作,灵活易用。今天我就来分享一下如何快速接入该SDK并实现一些简单的实时音视频通话。

前期准备

首先我们需要注册一个声网账号(注册地址),注册成功后会进入控制台,完成实名认证,在左侧进入项目管理页面,开始创建项目:

在这里插入图片描述

输入项目名称,选择鉴权机制。为了项目安全性考虑,这里推荐使用安全模式。提交后进入项目信息页面,记录一下AppID和证书我们之后在代码中会用到。由于我们选择了安全模式,在使用SDK时我们需要生成token,在本地开发调试时可以在项目信息页面下方点击生成临时token,然后拷贝到代码中使用。

在这里插入图片描述
在这里插入图片描述

在项目发布时,可以参考文档和官方仓库编写对应的token生成代码,部署到自己的服务器上通过调用接口的形式来获取token。

新建项目并集成SDK

前期准备工作已经完成,大家根据自己的实际情况来新建一个web项目,完成后,我们开始通过npm安装SDK。

npm install agora-rtc-sdk-ng --save

你也可以通过script标签的形式引入SDK。

<script src="https://download.agora.io/sdk/web/AgoraRTC_N-4.1.0.js"></script>
<!-- or -->
<script src="./AgoraRTC_N-4.1.0.js"></script>

之后我们只需要在项目代码中引入agora-rtc-sdk-ng就可以直接使用了。

import AgoraRTC from "agora-rtc-sdk-ng";

实现基础的1对1视频通话

现在我们开始来按步骤实现基础的1对1视频通话。

1. 创建本地客户端对象

首先我们需要创建一个本地客户端对象,由于我们不是直播,mode我们选择rtc,编码有H.264和VP8两种,我这里没有兼容性要求,所以选用推荐的VP8,参考官方文档。

const rtcClient = AgoraRTC.createClient({ mode: "rtc", codec: "vp8" });

2. 加入频道

加入频道这里需要传入4个参数:声网的项目appid,频道名称,如果鉴权开启了安全模式需要传入token,最后传入uid,uid为null时SDK会自动生成一个uid返回给你。

如果你是用app证书通过自己的代码生成token,需要保证频道名称和uid与生成token时保持一致,否则加入频道会失败。

const uid = await rtcClient.join(<appid>, <channel name>, <token>, <uid>);

3. 创建本地音视频轨道

加入完频道我们开始创建本地音视频轨道,调用createMicrophoneAudioTrack()通过本地麦克风采集的音频创建音频轨道对象,调用
createCameraVideoTrack()通过本地摄像头采集的视频创建视频轨道对象。你也可以在调用时传入参数来调整编码、前置\后置摄像头等配置。同时这里还需要注意浏览器提示或相关的设置,允许浏览器访问摄像头、麦克风等设备,必要时对用户进行引导和提示。

const localAudioTrack = await AgoraRTC.createMicrophoneAudioTrack();
const localVideoTrack = await AgoraRTC.createCameraVideoTrack();

4. 播放本地音视频轨道

创建完本地音视频轨道对象后,我们可以调用play()进行播放,预览一下音频和视频。播放音频轨道时不需要传入任何参数,播放视频轨道时需要指定一个DOM元素,你可以传入一个元素对象,也可以传入元素的id值。之后SDK会自动在该元素内部生成一个video元素播放视频轨道。

<div id="video-container"></div>
// 播放视频轨道
localVideoTrack.play(document.getElementById('video-container'));
// or
localVideoTrack.play('video-container');// 播放音频轨道
localAudioTrack.play();

效果如图:

在这里插入图片描述

5. 发布本地音视频轨道

现在我们需要调用publish()将我们本地的音视频轨道发布到频道中,一个本地客户端对象可以发布多个音频轨道,比如:背景音乐、麦克风声音等,SDK会自动将其合并为一个音频轨道发布到频道中去,但是一个本地客户端对象只能发布一个视频轨道,如果有发布多个视频轨道的需求,你可以创建多个本地客户端对象加入同一个频道,然后发布不同的视频轨道,但是需要注意区分2个client使用的uid,并在本地订阅时过滤掉,防止重复订阅,参考文档。

await rtcClient.publish([localAudioTrack,localVideoTrack
]);

6. 订阅远端用户并播放远端音视频

现在我们需要监听user-published事件,当同一频道的其他用户调用publish()发布音视频轨道时,SDK会触发该事件,我们需要监听这个事件并在回调中订阅其他用户发布的音视频轨道,并调用play()进行播放

<div id="remote-user"></div>
rtcClient.on("user-published", async (user, mediaType) => {await rtcClient.subscribe(user, mediaType);if (mediaType === "video") {console.log("subscribe video success", user);user.videoTrack.play(document.getElementById('remote-user'));}if (mediaType === "audio") {console.log("subscribe audio success");user.audioTrack.play();}
});

效果如下图,上方是我们本地的摄像头画面,下方为远端的摄像头画面,到这里为止一个基础的1对1视频通话已经完成了!

在这里插入图片描述

通话质量监测

对于实时音视频来说,保障通话质量是很重要的一环,在SDK中提供了相关的api供我们查询当前的通话质量,文档,通过使用这些api,客户端可以及时采取措施,给予用户及时的提示和反馈。避免影响用户的使用体验。

声网控制台还有水晶球面板,里面提供了丰富的通话质量数据查询功能,开发者可以使用这个工具更全面的掌握通话质量状况。

在这里插入图片描述

小拓展

多个音频轨道

上文中有提到,一个客户端对象可以发布多个音频轨道,没有先后顺序,可以多次通过调用publish()进行发布,SDK会自动合并为一个音频轨道发布到频道中。下面我们就通过自定义音频采集以及MediaStreamTrack API往通话中播放一个本地音频文件作为背景音乐。

1. 创建HTMLAudioElement

我们在前面基础音视频通话代码的基础上进行修改,首先创建一个button,让用户点击后再播放音频文件,确保用户与页面有一个交互行为。并监听对应的点击事件。

<button id="addMusic">添加音乐</button>
document.getElementById("addMusic").addEventListener("click", () => {const audio = new Audio("./music.ogg");audio.play();
});

2. 获取音频轨道并发布

调用captureStream()获取MediaStream对象,监听addtrack事件,触发时调用getAudioTracks()获取MediaStreamTrack对象的集合,由于我的音频文件只有一个音轨,所以这里直接取第1个元素。使用createCustomAudioTrack()将获取到的MediaStreamTrack转换为一个可以用于SDK的音频轨道,最后使用客户端对象的publish()发布。结合之前的音视频通话,此时在远端已经能正常收听到2个音轨的声音了(麦克风和音乐文件)。

document.getElementById("addMusic").addEventListener("click", () => {const audio = new Audio("./music.ogg");audio.play();const musicStream = audio.captureStream();const musicStream.onaddtrack = async () => {const musicMediaStreamTrack = musicStream.getAudioTracks()[0];const musicCustomAudioTrack = AgoraRTC.createCustomAudioTrack({mediaStreamTrack: musicMediaStreamTrack});await rtClient.publish([musicCustomAudioTrack])        };
});

自定义视频采集

和音频一样,SDK也支持你使用自定义的视频轨道来实现如屏幕录制,播放本地视频文件等功能。屏幕录制在官方文档中有介绍,这里我分享一下如何获取并发布一个本地视频文件的视频轨道。

一个客户端对象只支持发布一个视频轨道,同时发布多个(比如录屏+摄像头画面)需要创建2个客户端对象分别进行发布。

1. 创建video元素

首先我们创建一个video元素用于播放视频文件,并获取到HTMLVideoElement对象。

<video id="videoFile" src="./video.mp4" control>
const video = document.getElementById('video');

2. 获取并发布视频文件的媒体流

这一步和获取音频文件媒体流类似,我们分别发布了视频和音频轨道后的效果如图。画面上方的A端播放的视频文件,画面下方是B端的摄像头画面

视频文件包含视频轨道和音频轨道,我们需要分别获取对应的轨道进行发布,如果只发布了视频轨道会导致远端没有视频声音

const stream = video.captureStream();
stream.onaddtrack = async () => {const videoMediaStreamTrack = stream.getVideoTracks()[0];const audioMediaStreamTrack = stream.getAudioTracks()[0];const videoTrack = AgoraRTC.createCustomVideoTrack({mediaStreamTrack: videoMediaStreamTrack});const audioTrack = AgoraRTC.createCustomAudioTrack({mediaStreamTrack: audioMediaStreamTrack});await this.rtc.client!.publish([videoTrack,audioTrack]);
};

在这里插入图片描述

结尾

声网的Agora Web SDK NG 版接入是十分便捷的,简单易上手,功能强大,文档清晰。SDK也在github上开源。每个月还有10000分钟的免费额度,他们也会不定期举办一些套餐包优惠活动。通话质量也有可靠的保障。对于个人或小团队来说实现音视频通话不再是很困难的一件事了。总结一下就是:真香。如果你和你的团队有这方面的需求,不妨也来试试使用声网。

「本文为个人原创,首发于声网开发者社区」


http://chatgpt.dhexx.cn/article/xCWjNHaG.shtml

相关文章

基于声网 SDK 实现 iOS 端的一对一视频通话

在很多产品&#xff0c;加入实时视频通话已经不是新鲜事情了&#xff0c;尤其是近几年的疫情影响&#xff0c;个人公司国家对于实时音视频的需求一直在快速的增长。例如视频会议、社交应用、实时游戏&#xff0c;甚至也可能出现在一些元宇宙的场景中。 本文将教你如何通过声网…

web端视频通话sdk集成和功能实现流程(实时视频系列五)

本文介绍的是在wed端如何集成即构音视频SDK&#xff0c;以实现在wed端一对一&#xff0c;一对多及多人实时视频通话的功能。 一、SDK集成指引 1、安装 请从 jZego-RTC-SDK 下载 SDK。 npm下载包支持typescript语言(推荐)&#xff1a; npm i webrtc-zego 2、集成SDK 可使用s…

《保姆级教程》基于Agora SDK实现音视频通话及屏幕共享

&#x1f604;作者简介&#xff1a; 小曾同学.com,一个致力于测试开发的博主⛽️&#xff0c;主要职责&#xff1a;测试开发、CI/CD 如果文章知识点有错误的地方&#xff0c;还请大家指正&#xff0c;让我们一起学习&#xff0c;一起进步。&#x1f60a; 座右铭&#xff1a;不想…

保姆级教程!基于声网 Web SDK实现音视频通话及屏幕共享

前言 大家好&#xff0c;我是 小曾同学&#xff0c;小伙伴们也可以叫我小曾&#xff5e; 如果你想实现一对一音视频通话和屏幕共享功能&#xff0c;不妨来看看这篇文章&#xff0c;保姆级教程&#xff0c;不需要从零实现&#xff0c;直接集成声网 SDK 即可轻松上手。 本文也…

Android设备实现语音视频通话

一、背景 有智慧社区相关的项目&#xff0c;需要门禁开发门禁机APP以及用户端APP&#xff0c;要求实现门禁设备呼叫业主APP&#xff0c;业主接通后可以通话、可以开门。这里主要要做的就是语音和视频通话功能&#xff0c;以及远程开门。至于业务逻辑那就是正常的需求处理了。 …

基于 Web SDK 实现视频通话场景 | 声网 SDK 教程

声网视频 SDK 被广泛应用于多种实时互动场景中&#xff0c;例如视频会议、视频通话、音视频社交、在线教育等。为了让刚刚接触声网 SDK 的开发者&#xff0c;可以更顺畅地实现基础的视频通话功能&#xff0c;我们基于声网 Web SDK 4.x 版本梳理了本篇教程。 在本文末&#xff0…

如何基于 Agora Android SDK 在应用中实现视频通话?

在很多产品&#xff0c;实时视频通话已经不是新鲜的功能了&#xff0c;例如视频会议、社交应用、在线教育&#xff0c;甚至也可能出现在一些元宇宙的场景中。 本文将教你如何通过声网Agora 视频 SDK 在 Android 端实现一个视频通话应用。声网 SDK 每个月会提供 10000 分钟的免…

Android uni-app实现音视频通话

前言 上一篇讲解了怎么实现Android uni-app封装原生插件&#xff0c;这篇讲解一下&#xff0c;把anyRTC的RTC&#xff08;音视频通讯&#xff09;封装uni-app 实现音视频通话。 不了解anyRTC的小伙伴&#xff0c;可以点击下面链接&#xff1a; 开发者官网 1.效果图 先上图&a…

使用 Agora SDK 开发 React Native 视频通话 App

在 React Native 的应用中&#xff0c;从头开始添加视频通话功能是很复杂的。要保证低延迟、负载平衡&#xff0c;还要注意管理用户事件状态&#xff0c;非常繁琐。除此之外&#xff0c;还必须保证跨平台的兼容性。 当然有个简单的方法可以做到这一点。在本次的教程中&#xf…

MySQL联合索引底层数据结构是怎样的

目录 1. 联合索引数据结构图 2.联合索引是如何进行排序的 3. 联合索引查询特点 1. 联合索引数据结构图 如下图所示联合索引的数据结构, 通过name&#xff0c;age&#xff0c;position三个字典进行一个联合索引&#xff0c;构建B树索引结构。 2.联合索引是如何进行排序的 B树…

MySQL联合索引在B+树如何存储以及寻址

文章目录 引入Innodb B树联合索引存储以及寻址总结 引入 最近找工作&#xff0c; 去一家三方支付公司面试&#xff0c;前面得过程还挺好&#xff0c;所有的提都回答对了&#xff08;心里暗自窃喜应该能拿到高工资offer&#xff0c;迎娶白富美&#xff0c;然后走向人生巅峰&…

MySQL联合索引生效规则

最近项目中一张表数量测试达到千万级别&#xff0c;考虑加索引&#xff0c;对于单列索引及联合索引&#xff08;复合索引&#xff09;简单学习了下&#xff0c;做一下笔记。 联合索引生效前提&#xff1a;因为联合索引有顺序讲究&#xff0c;联合索引的第一个字段是引导列&…

mysql联合索引的数据结构

一、本文主要讲解的内容有&#xff1a; 联合索引在B树上的存储结构联合索引的查找方式为什么会有最左前缀匹配原则 在分享这篇文章之前&#xff0c;我在网上查了关于MySQL联合索引在B树上的存储结构这个问题&#xff0c;翻阅了很多博客和技术文章&#xff0c;其中有几篇讲述的…

mysql联合索引有效和失效的情况分析

关于mysql的索引&#xff0c;是mysql优化一个非常重要的方面。那么关于索引是否有效就是非常关键了。很多人设计了索引&#xff0c;但是发现依旧很慢。那么这个时候就判断sql的索引执行情况非常重要了。网上有大量的博主也写过不少类似的文章&#xff0c;但是关于联合索引的具体…

MySQL联合索引(abc)命中规则

1.建表 mysql创建一张表&#xff0c;表名&#xff1a;‘test_models’ id列为 主键&#xff0c;int类型 &#xff0c;自增a,b,c,d,e 全部是int&#xff08;11&#xff09;为&#xff08;a,b,c&#xff09;添加一个联合索引 index_abc 执行语句&#xff1a; CREATE TABLE te…

mysql联合索引

mysql联合索引的使用 命名规则&#xff1a;表名_字段名 1、需要加索引的字段&#xff0c;要在where条件中 2、数据量少的字段不需要加索引 3、如果where条件中是OR关系&#xff0c;加索引不起作用 4、符合最左原则 以下是我的建表语句 CREATE TABLE test ( id int(11) uns…

mysql 联合索引结构与索引匹配原则

联合索引结构与索引匹配原则 最左前缀匹配原则&#xff1a;在MySQL建立联合索引时会遵守最左前缀匹配原则&#xff0c;即最左优先&#xff0c;在检索数据时从联合索引的最左边开始匹配。 要想理解联合索引的最左匹配原则&#xff0c;先来理解下索引的底层原理。索引的底层是一…

详解MySQL联合索引

引言 本文预计分为两个部分:(1)联合索引部分的基础知识 在这个部分&#xff0c;我们温习一下联合索引的基础(2)联合索引部分的实战题 在这个部分&#xff0c;列举几个我认为算是实战中的代表题&#xff0c;挑出来说说。 正文 基础 讲联合索引&#xff0c;一定要扯最左匹配!…

mysql联合索引的使用

这篇笔记主要记录联合索引的使用 设置了shopId、userId、relationId三个字段&#xff0c;作为联合索引&#xff0c;这三个字段&#xff0c;都是long类型的&#xff0c;也就是bigint 分别验证以下几个场景&#xff1a; 场景一&#xff1a;explain select * from testIndex wher…

MySQL联合索引的原理

面试中被问到了联合索引&#xff0c;突然就涉及到了知识盲区&#xff0c;对不起&#xff0c;我只知道B树&#xff0c;B树&#xff0c;哈希索引&#xff0c;聚簇索引&#xff0c;非聚簇索引&#xff0c;联合索引的原理&#xff1f;。。 对不起涉及到了我的知识盲区了。 这里对联…