在 Web 应用中接入语音通话能力

Agora.io 在其官网文档中有一些基础的说明,但对于一些具体的细节,我认为描述的并不够清楚,因此这里给出一个 MVP 版本的接入指南。

1. 安装 SDK

根据你的开发经验不同,你可以选择使用包管理器安装 Agora 的 SDK, 或者直接加载 CDN 的 JS 文件来快速接入。

1.1 使用包管理器接入

安装 SDK

npm install agora-rtc-sdk-ng --save
# yarn add agora-rtc-sdk-ng

在项目中引入依赖文件

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

1.2 使用 CDN 接入

使用 CDN 接入相对简单,你只需要将如下代码放在你的项目 HTML 中即可

<script src="https://download.agora.io/sdk/release/AgoraRTC_N-4.3.0.js"></script>

2. 接入 Agora

如下这段代码是接入语音聊天的最简代码,你可以先大体看一下,理解一下逻辑,稍后我们详细讲解其中的一些细节。

var rtc = {
  // 用来放置本地客户端。
  client: null,
  // 用来放置本地音频轨道对象。
  localAudioTrack: null,
};

var options = {
  // 替换成你自己项目的 App ID。
  appId: "<YOUR APP ID>",
  // 传入目标频道名。
  channel: "demo_channel_name",
  // 如果你的项目开启了 App 证书进行 Token 鉴权,这里填写生成的 Token 值。
  token: null,
};

async function startBasicCall() {
    
  // 初始化代码逻辑,必需
  rtc.client = AgoraRTC.createClient({ mode: "rtc", codec: "vp8" });
  const uid = await rtc.client.join(options.appId, options.channel, options.token, null);
  
  /**
   * 以下逻辑用于订阅频道中的用户音轨,从而可以收听其他用户的声音,必需
   */
  rtc.client.on("user-published", async (user, mediaType) => {
    // 开始订阅远端用户。
    await rtc.client.subscribe(user, mediaType);
    console.log("subscribe success");

    // 表示本次订阅的是音频。
    if (mediaType === "audio") {
        // 订阅完成后,从 `user` 中获取远端音频轨道对象。
        const remoteAudioTrack = user.audioTrack;
        // 播放音频因为不会有画面,不需要提供 DOM 元素的信息。
        remoteAudioTrack.play();
    }
  });

  /**
   *  以下部分代码用于发布自己的音轨到频道中,一般应用于发言人的逻辑,非必需,根据实际业务需求来完成
   */
  
  // 通过麦克风采集的音频创建本地音频轨道对象。
  rtc.localAudioTrack = await AgoraRTC.createMicrophoneAudioTrack();
  // 将这些音频轨道对象发布到频道中。
  await rtc.client.publish([rtc.localAudioTrack]);
  console.log("publish success!");

  
}
async function leaveCall() {
  // 销毁本地音频轨道。
  rtc.localAudioTrack.close();

  // 离开频道。
  await rtc.client.leave();
}

startBasicCall();
leaveCall();

在上述这段代码中,最为核心的是 startBasicCall 中的三块代码,我们按照顺序来看。

第一段代码用于初始化一个 AgoraRTC 的客户端,并使用 Appid、Channel、Token 等信息,加入到频道中,从而获得后续和频道交互的能力。这部分代码为必需的代码,无论你的应用是什么样的,都首先需要完成初始化,才能进行后续的操作。

这里的 token 根据你选择的不同的项目鉴权方式,可以选择性的传递。

rtc.client = AgoraRTC.createClient({ mode: "rtc", codec: "vp8" });
const uid = await rtc.client.join(options.appId, options.channel, options.token, null);

第二段代码则是用于订阅频道音频。在实际开发过程中,无论你的业务是什么样的,每一个人一定都需要先订阅频道,收听其他人的声音。因此,这部分代码也需要放在前面,且必需加入相关代码。

rtc.client.on("user-published", async (user, mediaType) => {
    // 开始订阅远端用户。
    await rtc.client.subscribe(user, mediaType);
    console.log("subscribe success");

    // 表示本次订阅的是音频。
    if (mediaType === "audio") {
        // 订阅完成后,从 `user` 中获取远端音频轨道对象。
        const remoteAudioTrack = user.audioTrack;
        // 播放音频因为不会有画面,不需要提供 DOM 元素的信息。
        remoteAudioTrack.play();
    }
  });

第三段代码则是发布自己的声音,你可以通过下面的两行代码,实现使用麦克风采集音频,并发布到频道中,从而实现让用户说话的能力。这部分功能在实际的业务开发过程中,会根据不同的业务类型,选择性开启,因此,非必需的,这里放在了最后。

  // 通过麦克风采集的音频创建本地音频轨道对象。
  rtc.localAudioTrack = await AgoraRTC.createMicrophoneAudioTrack();
  // 将这些音频轨道对象发布到频道中。
  await rtc.client.publish([rtc.localAudioTrack]);
  console.log("publish success!");

3. 实现你自己的业务逻辑

当你完成了上述的代码逻辑后,你就实现了在页面中接入 Agora 的功能,接下来你要做的就是实现自己的业务逻辑即可。