写点什么

Agora 教程:结合 Electron 与 Agora SDK 实现视频会议

2020 年 2 月 25 日

Agora 教程:结合 Electron 与 Agora SDK 实现视频会议

对于在线教育、医疗、视频会议等场景来讲,开发面向 Windows、Mac 的跨平台客户端是必不可少的一步。在过去,每个操作系统的应用需用特定的编程语言编写,每个客户端都需要单独开发。而现在我们可以利用多种工具、框架进行跨平台开发。Electron 就是其中最热门的一个。


Electron 的前身是 Atom Shell,是基于 Node.js 和 Chromium 开源项目。它让前端开发者也可以使用 JavaScript,HTML 和 CSS 构建跨平台的桌面应用程序。


Electron 兼容 Mac、Windows 和 Linux。利用它构建的应用可在这三个操作系统上面运行。我们在很多著名项目中都能看到它的身影,比如 Slack、Cocos Creator、Visual Studio Code 等 500 多个项目。


本文将为大家分析利用 Electron 做视频会议应用的几种实现思路及其优缺点,同时结合 demo 实例,分享如何基于 Electron 与声网 Agora Web SDK 开发一个视频会议应用。


实现视频会议的思路

如何利用 Electron 实现一个视频会议应用?这主要取决于使用什么技术来实现作为业务核心的 RTC 部分。



我们使用 C++ SDK 就可以实现。我们可以通过 NodeJS 插件 node-gyp 将 C++ 的库编译成 NodeJS 可以直接使用的文件,界面部分则通过 Web 来实现,最后 RTC 业务部分则使用编译的插件直接调用 C++ 接口。


这种方式的优点是直接调用 C++ 接口,在性能和稳定性上有一定优势。但是,缺点是 Native 模块与 Web 模块的交互会相对复杂。


尽管 NodeJS 可以直接调用 C++ 的接口,但若 C++ 要通过回调向 Node 部分传递数据,则需要确保数据传输到 Electron 所在的线程上, Electron 才可以收到回调。又比如,若 C++ SDK 使用了具有平台差异的动态库依赖,则在使用 node-gyp 编译的过程中必须在不同平台上编译不同的版本才可以在 Electron 中正常使用。


基于 Agora Web SDK 实现音视频通话

我们需要在 Electron 环境中创建一个名为 web-app 的目录,在里面创建基本的 Web 部分内容并快速实现一个视频通话通能。


创建 AgoraRTC 实例并加入频道:


1let client = AgoraRTC.CreateClient({mode:"interop"}) 
复制代码


初始化 appid 并加入频道:


1 client.init(options.key, () => {2                console.log("AgoraRTC client initialized")3                client.join(options.key, options.channel, options.uid, (uid) => {4                    console.log("User " + uid + " join channel successfully")5                    console.log(new Date().toLocaleTimeString())6                    // create localstream7                    resolve(uid)8                })9            })
复制代码


创建本地流并推送:


1let stream = AgoraRTC.creatStream(merge(defaultConfig.config))2localStream.init(() =>{3           client.publish(localStream, err => {4                  console.log("Publish local stream error: " + err);5                  localStream.play("element_id")6           })7},
复制代码


在完成上面的步骤后,你应该就能看到自己的视频画面了,下一步我们要让这部分代码在 Electron 的 App 容器中跑起来。


创建 BrowserWindow 实例并读取 web-app 目录中的内容:


 1const electron = require('electron') 2// Module to control application life. 3const app = electron.app 4// Module to create native browser window. 5const BrowserWindow = electron.BrowserWindow 6let mainwindow 7function createWindow () { 8  // Create the browser window. 9mainWindow = new BrowserWindow({width: 800, height: 600})10 // and load the index.html of the app.11  mainWindow.loadURL(url.format({12    pathname: path.join(__dirname, './web-app/dist/index.html'),13    protocol: 'file:',14    slashes: true15  }))16mainWindow.webContents.openDevTools()17//Open the DevTools18//mainWindow.webContents.openDevTools()19//Emitted when the window is closed.20mainWindow.on('closed',function(){21  // Dereference the window object, usually you would store windows22  // in an array if your app supports multi windows, this is the time23  // when you should delete the corresponding element.24   mainWindow = null25})
复制代码


完成后使用 npm start 启动 Electron 即可。


最后附上 demo 源码:https://github.com/AgoraIO/Agora-Web-Electron-Demo


作者介绍:张乾泽,声网 Agora Web 研发工程师


本文转载自声网 Agora 公众号。


原文链接:https://mp.weixin.qq.com/s/DEysouDRmWsnH8Y2mdb_7Q


2020 年 2 月 25 日 17:48354

评论

发布
暂无评论
发现更多内容

低代码开发不靠谱?看低代码开发在物联网APP开发中的应用

华为云开发者社区

技术 软件开发 代码

谈谈敏捷开发概念和迭代开发方案

Philips

敏捷开发 快速开发

区块链钱包APP开发服务商,数字货币钱包开发价格

135深圳3055源中瑞8032

USDT承兑支付系统开发技术,搭建商户USDT支付系统

135深圳3055源中瑞8032

合约跟单模式开发,合约跟单系统平台

135深圳3055源中瑞8032

阿里P8对Thread核心源码讲解

Java架构师迁哥

Redis最常见的16道面试题与详解

Java架构师迁哥

训练营第三周总结

大脸猫

极客大学架构师训练营

华为发布5GtoB核心网建设白皮书

华为云开发者社区

5G 边缘技术

“软件教父”花费20年,教你如何在应用层混迹的风生水起

小Q

Java 学习 架构 面试 应用

快快使用ModelArts,零基础小白也能玩转AI!

华为云开发者社区

人工智能 开发者 开发

http请求中get和post方法的区别

测试人生路

HTTP post GET

架构师训练营 -week07-作业

大刘

极客大学架构师训练营

数字资产交易平台开发,场外交易所开发搭建

135深圳3055源中瑞8032

ViewportFrame demo

katichar

隐私计算S2赛季 谁是真正的王者?

hellompc

学习 隐私计算

字节跳动HR:3年从4000人招到10万人,我经历了什么

Java架构师迁哥

从技术到应用实践 揭秘京东区块链布局全景

京东科技开发者

区块链 区块链方案 供应链

LeetCode题解:231. 2的幂,递归,JavaScript,详细注释

Lee Chen

算法 LeetCode 前端进阶训练营

25个小众的Java库

GuoYaxiang

Java 开发工具

LeetCode题解:231. 2的幂,迭代,JavaScript,详细注释

Lee Chen

算法 LeetCode 前端进阶训练营

HTTP2协议及websocket协议总结

江龙

架構師訓練營第 1 期 - 第 07 周作業

Panda

架構師訓練營第 1 期

MySQL中特别实用的几种SQL语句送给大家

陈哈哈

SQL优化 实用SQl语句 高性能SQL

诈骗?通证项目方的危局

CECBC区块链专委会

区块链 法律

我去!三面字节竟全败在Redis上,带薪摸鱼刷1949页进阶笔记

996小迁

Java redis 架构 面试 程序人生

字节跳动大神亲自总结SpringBoot手册,让你可以在简历上写精通SpringBoot!

Java架构追梦

Java 架构 面试 微服务 springboot

NPC Follow

katichar

TCP梳理总结

江龙

“十三五”收官,区块链赋能能源电力路在何方?

CECBC区块链专委会

区块链 电力 能源

啥是数据库范式

Simon

MySQL 数据库 数据库设计

2021年全国大学生计算机系统能力大赛操作系统设计赛 技术报告会

2021年全国大学生计算机系统能力大赛操作系统设计赛 技术报告会

Agora 教程:结合 Electron 与 Agora SDK 实现视频会议-InfoQ