基于 Agora SDK 实现 Web 端的多人视频互动

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

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

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

Demo 体验

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

前提条件

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

image

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

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

设置开发环境

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

创建 Web 项目

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

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

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

这个项目只需要用到一个 HTML 文件。

  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. 运行安装命令
    image
  2. 在你的项目的 Javascript 代码中添加一行:
    image
    方法 2. 使用 CDN 方法获取 SDK

该方法无需下载安装包。在项目文件中,将以下代码添加到 <style> 上一行:
image

方法 3. 从官网获取 SDK

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

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

  3. 在项目文件中,将如下代码添加到 <style> 上一行:
    image
    为方便起见,这里我们选择第二种方法,直接使用 CDN 链接。

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

实现互动直播

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

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

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

下图展示了基础互动直播的 API 调用。注意图中的方法是对不同的对象调用的。
image
image
为方便起见,我们为下面要用到的示例代码定义了两个变量。此步骤不是必须的,你可以根据你的项目有其他的实现。
image

初始化客户端

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

AgoraRTC.createClient 方法中,需注意 modecodec 这两个参数的设置:

  • 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 方法,传入用户选择的角色。
    image
    直播频道内的用户,只能看到主播的画面、听到主播的声音。加入频道后,如果你想切换用户角色,也可以调用 setClientRole 方法。

加入频道

Client.initonSuccess 回调中调用 Client.join 加入频道。

// Join a channel
 rtc.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 中注意以下参数的设置:

  • token : 该参数为可选。如果你的 Agora 项目开启了 App 证书,你需要在该参数中传入一个 Token,详见 使用 Token。
    • 在测试环境,我们推荐使用控制台生成临时 Token,详见获取临时 Token。
    • 在生产环境,我们推荐你在自己的服务端生成 Token,详见 生成 Token.
  • channel : 频道名,长度在 64 字节以内的字符串。
  • uid : 用户 ID,频道内每个用户的 UID 必须是唯一的。如果你将 uid 设为 null ,Agora 会自动分配一个 UID 并在 onSuccess 回调中返回。

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

发布本地流

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

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

在创建流时,通过设置 audiovideo 参数来控制是否发布音频和视频。
image
2. 调用 Stream.init 方法初始化创建的流。
image

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

  1. Stream.initonSuccess 回调中调用 Client.publish 方法,发布本地流。
    image

订阅远端流

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

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

  1. 监听 "stream-added" 事件,当有远端流加入时订阅该流。
    image

  2. 监听 "stream-subscribed" 事件,订阅成功后播放远端流。
    image
    受浏览器策略影响,在 Chrome 70+ 和 Safari 浏览器上, Stream.play 方法必须由用户手势触发,详情请在声网文档中心搜索、参考 Autoplay Policy Changes。

  3. 监听 "stream-removed" 事件,当远端流被移除时(例如远端用户调用了 Stream.unpublish ), 停止播放该流并移除它的画面。
    image
    你需要自己实现 addViewremoveView 的功能,可以参考以下示例代码。

离开频道

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

运行你的 app

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

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

  1. 安装 live-server。
    image

  2. 在命令行中进入你的项目所在的目录。

  3. 运行 app。
    image
    现在你的浏览器应该会自动打开你的 web app 页面。

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

  5. 在浏览器中打开另一个页面,输入相同的 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。
    image
推荐阅读
相关专栏
SDK 教程
167 文章
本专栏仅用于分享音视频相关的技术文章,与其他开发者和声网 研发团队交流、分享行业前沿技术、资讯。发帖前,请参考「社区发帖指南」,方便您更好的展示所发表的文章和内容。