如何使用 Agora Electron SDK 创建桌面视频通话APP

作为 JavaScript 开发人员,你真的可以仅使用一种语言为任何平台创建APP,而Electron框架可以帮助你创建跨平台的桌面APP。在本教程中,我们将使用适用于 macOS 和 Windows的Agora Electron SDK来逐步创建视频通话桌面APP。
使用 Electron,我们基本可以将网站捆绑为独立的桌面APP。这种方法……有时是有争议的。但它允许 Web 开发人员在数小时内创建桌面APP。因此,作为先决条件,你只需要知道 HTML、CSS 和 JavaScript就可以了。

使用 Agora 创建账户

building-a-desktop-video-calling-app-using-agora-electron-sdk-screenshot-1
在https://console.agora.io注册并登录仪表板。
导航到Project Management 选项卡下的 Project List 选项卡,然后单击蓝色的 Create 按钮创建项目。(当提示使用 App ID + 证书时,只选择 App ID。)检索 App ID。它将在你开发APP时授权你的请求。

注意:本指南不实施令牌身份验证,推荐用于在生产环境中运行的所有 RTE APP。更多关于 Agora 平台基于令牌的认证信息,请参见本指南: 校验用户权限

我们示例的结构
这是我们正在创建的APP的结构:

.
├── src
│ └── index.css
│ └── index.html
│ └── index.js
│ └── render.js
├── package.json
.

运行APP

你需要安装 LTS 版本的 Node.js 和 NPM:
确保有一个 Agora 开发者账号,设置项目,并生成一个 App ID。
从master 分支下载并解压 ZIP 文件。
在 macOS 上运行npm install或在 Windows 上运行npm install — arch=ia32以在解压目录中安装APP依赖项。
导航到./src/render.js并输入我们生成的 App IDappId = “”;
你现在可以在项目根目录中运行npm start 以启动APP。

就是这样。你有一个视频通话桌面APP。该APP用"test” 作频道名称。该项目在引擎盖下使用 electron-forge 轻松开始使用Electron。
building-a-desktop-video-calling-app-using-agora-electron-sdk-screenshot-2

APP运行原理

我们的 Electron APP有四个文件:index.html是我们APP元素的标记、index.css处理APP的样式、render.js包含我们视频通话的APP逻辑以及index.js处理设置 Electron 的引导过程。

<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <title>Agora Electron Quickstart</title>
  <link rel="stylesheet" href="index.css">
  <script defer src="render.js"></script>
</head>
<body>
  <h1>Agora Electron Quickstart</h1>
  <button id="start">Start Call</button>
  <button id="stop">Stop Call</button>
  <div id="video-container">
    Local Feed:
    <div id="local">
    </div>
    Remote Feed(s):
    <div id="remote">
    </div>
  </div>
</body>
</html>

我们正在向 标记中添加一个脚本标记,并将源设置为 render.js,以便我们可以加载APP逻辑。defer 标签在执行 JS 之前需要等待页面加载。

我们有个简单的布局:两个用于开始和结束通话的按钮,以及两个 div,分别是在 video-container div 中包含本地和远程用户的视频。

索引文件
我们APP的样式如下所示:

body {
  font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
  margin: auto;
  max-width: 90vw;
  text-align: center;
  align-items: center;
}
h1 {
  margin-block-start: 0.4em;
  margin-block-end: 0.4em;
}
button {
  background-color: rgb(50, 153, 250); /* Green */
  border: none;
  color: white;
  padding: 8px 24px;
  text-align: center;
  text-decoration: none;
  border-radius: 4px;
  font-size: 16px;
  margin-bottom: 5px;
}
#local canvas {
  margin: 5px 0;
  height: 30vh;
}
#remote {
  flex-direction: row;
  display: flex;
  width: 100%;
  flex-wrap: wrap;
}
#remote div {
  flex: 1;
  margin: 5px;
}
#remote canvas {
  height: 27vh;
  zoom: 1.2 !important;
}

渲染.js
让我们进入正题看看我们的APP逻辑:

const AgoraRtcEngine = require('agora-electron-sdk').default;
const APPID = ""; //Enter App  ID here
if (APPID === "") {
  alert('Please enter APPID in src/render.jsx (line:2)');
}
let rtcEngine = new AgoraRtcEngine();
rtcEngine.initialize(APPID);
rtcEngine.on('joinedChannel', (channel, uid, elapsed) => {
  let localVideoContainer = document.querySelector('#local');
  rtcEngine.setupLocalVideo(localVideoContainer);
})
rtcEngine.on('userJoined', (uid) => {
  let remoteVideoContainer = document.querySelector('#remote')
  rtcEngine.setupViewContentMode(uid, 1);
  rtcEngine.subscribe(uid, remoteVideoContainer)
})
rtcEngine.setChannelProfile(0)
rtcEngine.enableVideo()
document.getElementById('start').onclick = () => {
  rtcEngine.joinChannel(null, "test", null, Math.floor(new Date().getTime() / 1000))
};
document.getElementById('stop').onclick = () => {
  rtcEngine.leaveChannel();
  document.getElementById('local').innerHTML = '';
  document.getElementById('remote').innerHTML = '';
};

我们从 SDK导入AgoraRtcEngine 类。如果用户没有输入 Agora App ID,会出现禁用警报。我们创建类的一个新实例 — rtcEngine,并使用 App ID 来初始化引擎实例。

Agora 使用的 SDK是基于事件的。例如,当我们成功加入一个视频频道时,我们会收到joinedChannel事件,然后我们可以使用它来执行函数。我们正在设置一个调用引擎上的setupLocalVideo 方法事件处理程序,并传入我们的 divlocalVideoContainer以呈现本地用户的视频源。

接下来,我们要为userJoined 设置一个事件,每当用户加入频道时就会触发该事件。我们使用setupViewContentMode方法来设置远程视频源,从事件和1 传入 UID 并使用适合模式。你可以用0将视频裁剪为 div 的大小。然后我们使用subscribe方法,该方法订阅远程用户并通过传入 UID 和 HTML 容器来初始化相应的渲染器。我们现在使用的是remoteVideoContainerdiv。

我们现在正在使用该setChannelProfile方法来使用通信配置文件。你也可以直播。我们正在使用enableVideo方法启用视频模块。

接下来,给按钮设置onClick 功能。开始按钮使用joinChannel方法加入频道:它接受令牌、频道名称、可选信息和 UID。我们为令牌传入 null 。如果你在安全模式下使用APP,则可以使用临时令牌。我们频道名称为“test” ,你也可以使用任何字符串。同一频道的用户可以互相交流。我们为 info 参数传入 null,并使用 Date 函数生成一个随机 UID。频道中的所有用户都应该具有唯一的 UID。
停止按钮调用该leaveChannel方法并清除远程视频。

索引.js
现在让我们创建我们的 Electron APP:

const { app, BrowserWindow } = require('electron');
const path = require('path');
app.allowRendererProcessReuse = false
if (require('electron-squirrel-startup')) { 
  app.quit();
}
const createWindow = () => {
  const mainWindow = new BrowserWindow({
    width: 1200,
    height: 800,
    webPreferences: {
      nodeIntegration: true,
      contextIsolation: false
  },
  });
  mainWindow.loadFile(path.join(__dirname, 'index.html'));
};
app.on('ready', createWindow);
app.on('window-all-closed', () => {
  if (process.platform !== 'darwin') {
    app.quit();
  }
});
app.on('activate', () => {
  if (BrowserWindow.getAllWindows().length === 0) {
    createWindow();
  }
});

我们正在从Electron中导入app和BrowserWindow,以及使用Node中的path。我们通过将allowRendererProcessReuse属性设置为 false 来允许使用非上下文感知模块以使用 Agora SDK。该electron-squirrel-startup模块管理 Windows APP启动逻辑。

我们用Electron中的BrowserWindow 编写了一个新函数createWindow以生成一个新的浏览器窗口。我们在webPreferences 中上传nodeIntegration: true以及contextIsolation: false来支持 集成Agora SDK 。我们使用loadFile方法在主要浏览器窗口上加载index.html 文件。

回到我们 Electron APP上的事件,我们有 ready 事件,它调用createWindow函数。对于 macOS,我们使用关闭窗口时退出APP的window-all-closed 事件。如果没有打开窗口,我们通过activate事件利用createWindow函数创建一个新窗口。

其他资源
使用 Agora SDK 和 Electron 框架创建桌面视频通话应用程序APP的过程很容易。查看Agora Electron Docs和Agora Electron API Reference以快速添加更多功能,例如静音摄像头和麦克风、设置视频配置文件和音频混合。
我也想邀请你加入Agora Developer Slack 社区。如有任何问题,可以在#electron-help-me频道中发布。
更多内容请访问plainenglish.io

原文作者 Author:Ekaansh Arora
原文链接 https://www.agora.io/en/blog/how-to-build-a-desktop-video-calling-app-using-the-agora-electron-sdk/

推荐阅读
作者信息
AgoraTechnicalTeam
TA 暂未填写个人简介
文章
175
相关专栏
SDK 教程
62 文章
本专栏仅用于分享音视频相关的技术文章,与其他开发者和 Agora 研发团队交流、分享行业前沿技术、资讯。发帖前,请参考「社区发帖指南」,方便您更好的展示所发表的文章和内容。