根据本文指导快速集成 Agora Web SDK 并在你自己的 app 里实现音视频互动直播。

本文会详细介绍如何建立一个简单的项目并使用 Agora Web SDK 实现基础的互动直播。我们建议你阅读本文以快速了解 Agora 的核心方法。

互动直播和实时通话的区别在于,直播频道的用户有角色之分。你可以将角色设置为主播,或者观众,其中主播可以收、发流,观众只能收流。

由于浏览器的安全策略对除 127.0.0.1 以外的 HTTP 地址作了限制,Agora Web SDK 仅支持 HTTPS 协议或者 http://localhost(http://127.0.0.1),请勿使用 HTTP 协议部署你的项目。

Demo 体验

在 GitHub 上提供一个开源的基础视频互动直播示例项目,在开始开发之前你可以通过该示例项目体验互动直播效果。点此访问

前提条件

  1. 安装一款 Agora Web SDK 支持的浏览器,如下表所示:

  2. 获得一个有效的 Agora 账号。(免费注册)

    如果你的网络环境部署了防火墙,请根据声网文档中心的「应用企业防火墙限制」打开相关端口。

设置开发环境

你需要准备一个自己的项目并且将 Agora Web SDK 集成到其中。

创建 Web 项目

如果你已经有一个 Web 项目了,跳过该节,直接阅读集成 SDK。

官网提供的示例代码使用了一些第三方的库文件来实现页面的样式和布局,你可以在 Github repo 中查找一下文件,或者使用其他方式实现。

common.css
jquery.min.js
materialize.min.js

  1. 新建一个 HTML 文件。这里我们将文件命名为 index.html(以下简称项目文件)。

  2. 用一个代码编辑器(例如 VS Code)打开该文件。

  3. 复制以下代码,粘贴到项目文件中。
    该步骤会为你的项目创建前端页面的 UI,你也可以自定义你的 UI。以下是示例代码:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="ie=edge"><meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"><title>Basic Live Broadcast</title><link rel="stylesheet" href="./assets/common.css" />
</head>
<body class="agora-theme"><div class="navbar-fixed"><nav class="agora-navbar"><div class="nav-wrapper agora-primary-bg valign-wrapper"><h5 class="left-align">Basic Live Broadcast</h5></div></nav></div><form id="form" class="row col l12 s12"><div class="row container col l12 s12"><div class="col" style="min-width: 433px; max-width: 443px"><div class="card" style="margin-top: 0px; margin-bottom: 0px;"><div class="row card-content" style="margin-bottom: 0px;"><div class="input-field"><label for="appID" class="active">App ID</label><input type="text" placeholder="App ID" name="appID"></div><div class="input-field"><label for="channel" class="active">Channel</label><input type="text" placeholder="channel" name="channel"></div><div class="input-field"><label for="token" class="active">Token</label><input type="text" placeholder="token" name="token"></div>Host: <input id="role" type="checkbox" checked></input><div class="row" style="margin: 0"><div class="col s12"><button class="btn btn-raised btn-primary waves-effect waves-light" id="join">JOIN</button><button class="btn btn-raised btn-primary waves-effect waves-light" id="leave">LEAVE</button><button class="btn btn-raised btn-primary waves-effect waves-light" id="publish">PUBLISH</button><button class="btn btn-raised btn-primary waves-effect waves-light" id="unpublish">UNPUBLISH</button></div></div></div></div></div><div class="col s7"><div class="video-grid" id="video"><div class="video-view"><div id="local_stream" class="video-placeholder"></div><div id="local_video_info" class="video-profile hide"></div><div id="video_autoplay_local" class="autoplay-fallback hide"></div></div></div></div></div></form>
<script src="vendor/jquery.min.js"></script>
<script src="vendor/materialize.min.js"></script>
</body>
</html>

集成 SDK

选择如下任意一种方法获取 Agora Web SDK:

方法 1. 使用 npm 获取 SDK

使用该方法需要先安装 npm,详见 npm 快速入门。

  1. 运行安装命令
npm install agora-rtc-sdk
  1. 在你的项目的 Javascript 代码中添加一行:
import AgoraRTC from 'agora-rtc-sdk'

方法 2. 使用 CDN 方法获取 SDK

该方法无需下载安装包。在项目文件中,将以下代码添加到

<script src="https://cdn.agora.io/sdk/release/AgoraRTCSDK-3.0.0.js"></script>

方法 3. 从官网获取 SDK

  1. 下载最新版 Agora Web SDK 软件包。

  2. 将下载下来的软件包中的 AgoraRTCSDK-3.0.0.js 文件保存到项目文件所在的目录下。

  3. 在项目文件中,将如下代码添加到

<script src="./AgoraRTCSDK-3.0.0.js"></script>

为方便起见,这里我们选择第二种方法,直接使用 CDN 链接。

现在,我们已经将 Agora Web SDK 集成到项目中了。接下来我们要通过调用 Agora Web SDK 提供的核心 API 实现基础的互动直播功能。

实现互动直播

本节介绍如何使用 Agora Web SDK 实现互动直播。

在使用 Agora Web SDK 时,你会经常用到以下两种对象:

1.Client 对象,代表一个本地客户端。Client 类的方法提供了音视频通话的主要功能,例如加入频道、发布音视频流等。
2.Stream 对象,代表本地和远端的音视频流。Stream 类的方法用于定义音视频流对象的行为,例如流的播放控制、音视频的编码配置等。调用 Stream 方法时,请注意区分本地流和远端流对象。

下图展示了基础互动直播的 API 调用。注意图中的方法是对不同的对象调用的。

本文只介绍 Agora Web SDK 最基础的方法和回调。完整的 API 方法和回调详见 Web API 参考。

为方便起见,我们为下面要用到的示例代码定义了两个变量。此步骤不是必须的,你可以根据你的项目有其他的实现。

// rtc object
var rtc = {client: null,joined: false,published: false,localStream: null,remoteStreams: [],params: {}
};// Options for joining a channel
var option = {appID: "Your App ID",channel: "Channel name",uid: null,token: "Your token"
}

初始化客户端

加入频道前,我们需要先创建并初始化一个客户端对象。

 // Create a clientrtc.client = AgoraRTC.createClient({mode: "rtc", codec: "h264"});// Initialize the clientrtc.client.init(option.appID, function () {console.log("init success");}, (err) => {console.error(err);});

在 AgoraRTC.createClient 方法中,需注意 mode 和 codec 这两个参数的设置:

mode 用于设置频道模式。一对一或多人通话中,建议设为 "rtc" ,使用通信模式;互动直播中,建议设为 "live",使用直播模式。codec 用于设置浏览器使用的编解码格式。如果你需要使用 Safari 12.1 及之前版本,将该参数设为 "h264";如果你需要在手机上使用 Agora Web SDK,请参考移动端使用 Web SDK。

你需要在该步骤中填入项目的 App ID。请参考如下步骤在控制台创建 Agora 项目并获取 App ID。

  1. 登录控制台,点击左侧导航栏的项目管理图标。
  2. 点击创建,按照屏幕提示设置项目名,选择一种鉴权机制,然后点击提交。
  3. 在项目管理页面,你可以获取该项目的 App ID。

设置用户角色

直播频道有两种用户角色:主播和观众,其中默认的角色为观众。设置频道模式为直播后,你可以在 App 中参考如下步骤设置用户角色:

  1. 让用户选择自己的角色是主播(“host”)还是观众(“audience”)。

  2. 调用 setClientRole 方法,传入用户选择的角色。

// The value of role can be "host" or "audience".
rtc.client.setClientRole(role);

直播频道内的用户,只能看到主播的画面、听到主播的声音。加入频道后,如果你想切换用户角色,也可以调用 setClientRole 方法。

加入频道

在 Client.init 的 onSuccess 回调中调用 Client.join 加入频道。

 // Join a channelrtc.client.join(option.token ? option.token : null, option.channel, option.uid ? +option.uid : null, function (uid) {console.log("join channel: " + option.channel + " success, uid: " + uid);rtc.params.uid = uid;}, function(err) {console.error("client join failed", err)})

在 Client.join 中注意以下参数的设置:

  1. token: 该参数为可选。如果你的 Agora 项目开启了 App 证书,你需要在该参数中传入一个 Token,详见 使用 Token。

    在测试环境,我们推荐使用控制台生成临时 Token,详见获取临时 Token。在生产环境,我们推荐你在自己的服务端生成 Token,详见 生成 Token.
    
  2. channel: 频道名,长度在 64 字节以内的字符串。

  3. uid: 用户 ID,频道内每个用户的 UID 必须是唯一的。如果你将 uid 设为 null,Agora 会自动分配一个 UID 并在 onSuccess 回调中返回。

更多的参数设置注意事项请参考 Client.join 接口中的参数描述。

发布本地流

如果用户角色设置为主播,我们需要创建并发布本地流。

  1. 在Client.join 的 onSuccess 回调中调用 AgoraRTC.createStream 方法创建一个本地音视频流。

    在创建流时,通过设置 audio 和 video 参数来控制是否发布音频和视频。
    
// Create a local stream
rtc.localStream = AgoraRTC.createStream({streamID: rtc.params.uid,audio: true,video: true,screen: false,
})
  1. 调用 Stream.init 方法初始化创建的流。
// Initialize the local stream
rtc.localStream.init(function () {console.log("init local stream success");
}, function (err) {console.error("init local stream failed ", err);
})

在初始化流时,浏览器会跳出弹窗要求摄像头和麦克风权限,请确保授权。

  1. 在 Stream.init 的 onSuccess 回调中调用 Client.publish 方法,发布本地流。
// Publish the local stream
rtc.client.publish(rtc.localStream, function (err) {console.log("publish failed");console.error(err);
})

订阅远端流

当远端流加入频道时,会触发 stream-added 事件,我们需要通过 Client.on 监听该事件并在回调中订阅新加入的远端流。

建议在创建客户端对象之后立即监听事件。

  1. 监听 “stream-added” 事件,当有远端流加入时订阅该流。
rtc.client.on("stream-added", function (evt) {  var remoteStream = evt.stream;var id = remoteStream.getId();if (id !== rtc.params.uid) {rtc.client.subscribe(remoteStream, function (err) {console.log("stream subscribe failed", err);})}console.log('stream-added remote-uid: ', id);
});
  1. 监听 “stream-subscribed” 事件,订阅成功后播放远端流。
rtc.client.on("stream-subscribed", function (evt) {var remoteStream = evt.stream;var id = remoteStream.getId();// Add a view for the remote stream.addView(id);// Play the remote stream.remoteStream.play("remote_video_" + id);console.log('stream-subscribed remote-uid: ', id);
})

受浏览器策略影响,在 Chrome 70+ 和 Safari 浏览器上,Stream.play 方法必须由用户手势触发,详情请在声网文档中心搜索、参考 Autoplay Policy Changes。

  1. 监听 “stream-removed” 事件,当远端流被移除时(例如远端用户调用了 Stream.unpublish), 停止播放该流并移除它的画面。
rtc.client.on("stream-removed", function (evt) {var remoteStream = evt.stream;var id = remoteStream.getId();// Stop playing the remote stream.remoteStream.stop("remote_video_" + id);// Remove the view of the remote stream. removeView(id);console.log('stream-removed remote-uid: ', id);
})

你需要自己实现 addView 和 removeView 的功能,可以参考以下示例代码。

function addView (id, show) {if (!$("#" + id)[0]) {$("<div/>", {id: "remote_video_panel_" + id,class: "video-view",}).appendTo("#video");$("<div/>", {id: "remote_video_" + id,class: "video-placeholder",}).appendTo("#remote_video_panel_" + id);$("<div/>", {id: "remote_video_info_" + id,class: "video-profile " + (show ? "" :  "hide"),}).appendTo("#remote_video_panel_" + id);$("<div/>", {id: "video_autoplay_"+ id,class: "autoplay-fallback hide",}).appendTo("#remote_video_panel_" + id);}
}
function removeView (id) {if ($("#remote_video_panel_" + id)[0]) {$("#remote_video_panel_"+id).remove();}
}

离开频道

调用 Client.leave 方法离开频道。

// Leave the channel
rtc.client.leave(function () {// Stop playing the local streamrtc.localStream.stop();// Close the local streamrtc.localStream.close();// Stop playing the remote streams and remove the viewswhile (rtc.remoteStreams.length > 0) {var stream = rtc.remoteStreams.shift();var id = stream.getId();stream.stop();removeView(id);}console.log("client leaves channel success");
}, function (err) {console.log("channel leave failed");console.error(err);
})

运行你的 app

我们建议在本地 Web 服务器上测试你的 app。这里我们用 npm 的 live-server 设置一个本地服务器。

在本地服务器(localhost)运行 web app 仅作为测试用途。部署生产环境时,请确保使用 HTTPS 协议。

  1. 安装 live-server。
npm i live-server -g
  1. 在命令行中进入你的项目所在的目录。

  2. 运行 app。

live-server .

现在你的浏览器应该会自动打开你的 web app 页面。

  1. 输入频道名,选择用户角色,点击 JOIN 开始通话。
    你可能需要给浏览器摄像头和麦克风权限。如果在创建本地流时打开了视频且选择主播角色,你现在应该可以看到自己的视频画面。

  2. 在浏览器中打开另一个页面,输入相同的 URL 地址。点击 JOIN 按钮。现在你应该可以看到两个视频画面。

如果页面没有正常工作,可以打开浏览器的控制台查看错误信息进行排查。常见的错误信息包括:

INVALID_VENDOR_KEY:App ID 错误,检查你填写的 App ID。

ERR_DYNAMIC_USE_STATIC_KE:你的 Agora 项目启用了 App 证书,需要在加入频道时填写 Token。

Media access:NotFoundError:检查你的摄像头和麦克风是否正常工作。

MEDIA_NOT_SUPPORT:请使用 HTTPS 协议 或者 localhost。

如开发中遇到问题,可访问 RTC 开发者社区发帖提问

RTC 开发者社区链接: https://rtcdeveloper.com.

基于 Agora SDK 实现 Web 端的多人视频互动相关推荐

  1. 基于 Agora SDK 实现 Android 端的多人视频互动

    本系列教程将分为三期,分享基于 Agora SDK 在各系统平台应用中实现一对一视频通话.多人互动直播,以及结合跨平台技术进行开发.本期推送在 Android.iOS.Windows.Web.macO ...

  2. 基于 Agora SDK 实现 Windows 端的多人视频互动(基于3.6.2版本)

    本文介绍如何通过 Agora SDK 在 Windows 平台快速实现互动直播.互动直播和实时通话的区别就在于,直播频道的用户有角色之分.你可以将角色设置为主播或者观众,其中主播可以收.发流,观众只能 ...

  3. 基于 Agora SDK 实现 iOS 端的多人视频互动

    本文介绍如何使用 Agora SDK 快速实现互动直播. 互动直播和实时通话的区别就在于,直播频道的用户有角色之分.你可以将角色设置为主播,或者观众,其中主播可以收.发流,观众只能收流. Demo 体 ...

  4. 基于 Agora SDK 实现 macOS 端的一对一视频通话

    本文介绍基于 Agora SDK 在 macOS 端实现一对一视频通话. 前提条件 Xcode 9.0 或以上版本 支持 macOS 10.10 或以上版本的 macOS 设备 有效的 Agora 账 ...

  5. 基于 Agora SDK 实现 Windows 端的一对一视频通话

    前提条件 Microsoft Visual Studio 2017 或以上版本 支持 Windows 7 或以上版本的 Windows 设备 有效的 Agora 账户(免费注册) 注:如果你的网络环境 ...

  6. Android 集成 Agora SDK 快速体验 RTC 版多人视频聊天|掘金技术征文

    RTC (Real-Time Communication) 作为实时通讯领域的"新贵",在互动直播.远程控制.多人视频会议.屏幕共享等领域广受好评,如果你还不了解 RTC ,Tak ...

  7. bim 模型web页面展示_一种基于BIM模型的Web端轻量化展示方法与流程

    本发明涉及基坑结构模型技术领域,尤其涉及一种基于bim模型的web端轻量化展示方法. 背景技术: 建筑信息模型(buildinginformationmodeling,bim)技术在土木工程领域快速推 ...

  8. 基于JAVA实现的WEB端UI自动化 - WebDriver高级篇 - 关联

    文章目录 关联 (公共变量传递一些值) 基于JAVA实现的WEB端UI自动化 -自动化测试简单介绍 基于JAVA实现的WEB端UI自动化 - WebDriver基础篇 - 实现简单的浏览器操作 基于J ...

  9. Web端直接播放 .ts 视频及mux.js播放ts视频没有声音

    最近项目中需要前端播放 .ts 格式视频,捣鼓了几天学习到很多知识,也发掘了一种优秀的解决方案,分享给有同样需求的同学. 常见方案 在网上查找的大部分解决方案都是用诸如videojs等网页播放器,接收 ...

最新文章

  1. 高等数学思维导图_直击高数重点!这份思维导图请收下
  2. linux shell 布尔运算
  3. Linux 线程与进程,以及通信
  4. 判断用户是否存在再进行新增_4招教你判断抖音真假粉,快速分辨抖音号的真实度!...
  5. SynchronousQueue队列
  6. voting设计模式
  7. 怎样判断ios app 第一次启动
  8. React开发(202):react代码分割之import导入导出
  9. 蔬菜基地售卖系统stage1
  10. LeetCode(118)——杨辉三角(JavaScript)
  11. Git之路——配置SSH免密码登录
  12. 好用的PC端wifi分析工具NetSpot免费版
  13. eds能谱图分析实例_如何使用EDS对材料进行定性定量分析?
  14. linux ssd做raid1,linux 磁盘阵列 raid1搭建教程
  15. 计算一个数的二进制中一的个数(三种方法)
  16. Scala编程语言入门(3)
  17. SitePoint播客#71:不断发展的互联网
  18. 点线面的特点_夯实基础!点线面的基本特点与表现
  19. 如何选择合适的无线网桥
  20. Java项目中利用钉钉机器人Webhook向钉钉群推送告警通知

热门文章

  1. python用opencv实现图片的美白磨皮_图像美颜篇(磨皮、锐化、美白)
  2. Failed to write core dump. Core dumps have been disabled. To enable core dumping, try ulimit -c unl
  3. Android视频编解码
  4. PCB板子螺钉孔大小参考
  5. 【Python】更改matplotlib绘图样式,要创建一个后缀名为mplstyle的样式清单,如何实现?
  6. xna api大全(二)
  7. 《Communication-Efficient Learning of Deep Networks from Decentralized Data》论文阅读
  8. 从《C++ Primer 第四版》入手学习 C++
  9. 大专计算机结业考试试题,失业人员计算机培训考试结业试题.doc
  10. 数据翻译——Easy_Trans的简单使用