基於 Electron 作視頻會議的兩種實現方式

做者簡介:張乾澤,聲網 Agora Web 研發工程師html

對於在線教育、醫療、視頻會議等場景來說,開發面向 Windows、Mac 的跨平臺客戶端是必不可少的一步。在過去,每一個操做系統的應用需用特定的編程語言編寫,每一個客戶端都須要單獨開發。而如今咱們能夠利用多種工具、框架進行跨平臺開發。Electron 就是其中最熱門的一個。前端

Electron 的前身是Atom Shell,是基於Node.js 和 Chromium 開源項目。它讓前端開發者也可使用 JavaScript,HTML 和 CSS 構建跨平臺的桌面應用程序。node

Electron 兼容 Mac、Windows 和 Linux。利用它構建的應用可在這三個操做系統上面運行。咱們在不少著名項目中都能看到它的身影,好比 Slack、Cocos Creator、Visual Studio Code 等 500 多個項目。git

本文將爲你們分析利用 Electron 作視頻會議應用的幾種實現思路及其優缺點,同時結合 demo 實例,分享如何基於 Electron 與聲網 Agora Web SDK 開發一個視頻會議應用。github

實現視頻會議的幾種思路

如何利用 Electron 實現一個視頻會議應用?這主要取決於使用什麼技術來實現做爲業務核心的 RTC 部分。web

第一種思路是使用 C++ SDK 來實現。咱們能夠經過 NodeJS 插件 node-gyp 將 C++ 的庫編譯成 NodeJS 能夠直接使用的文件,界面部分則經過 Web 來實現,最後 RTC 業務部分則使用編譯的插件直接調用 C++ 接口。npm

這種方式的優勢是直接調用 C++ 接口,在性能和穩定性上有必定優點。可是,缺點是 Native 模塊與 Web 模塊的交互會相對複雜。編程

儘管 NodeJS 能夠直接調用 C++ 的接口,但若 C++ 要經過回調向 Node 部分傳遞數據,則須要確保數據傳輸到 Electron 所在的線程上, Electron 才能夠收到回調。又好比,若 C++ SDK 使用了具備平臺差別的動態庫依賴,則在使用 node-gyp 編譯的過程當中必須在不一樣平臺上編譯不一樣的版本才能夠在 Electron 中正常使用。windows

第二種思路是使用 WebRTC,即界面部分和 RTC 業務部分都經過 Web 來實現。瀏覽器

這種方法的優勢是集成和調試十分簡單,大部分工做能夠在瀏覽器中完成後直接近乎無縫移植到 Electron。

不過,因爲 WebRTC 缺乏服務端設計和部署方案,咱們首先還須要將 WebRTC 與 Janus 等開源項目結合,解決服務器的部署、NAT 穿透等問題,實現 RTC 部分,這也是這種實現方法的難點。但若是經過 Agora Web SDK 來實現 RTC 部分,則不須要擔憂以上問題,也是目前最快速簡便的實現方法。

經過與 WebRTC 技術結合,Agora Web SDK 實現了網頁端多方音視頻通信,能夠快速實現 RTC 部分的開發。WebRTC 用戶的音視頻數據經由 Agora.io 的 SD-RTN 實時雲傳輸,能夠最大程度上保證公網的傳輸質量,結合 WebRTC 自有的丟包/丟幀重傳,以及帶寬預測,動態碼率調整等策略,能夠達到很是良好的多方通話用戶體驗。

針對這方面的集成,咱們也已經在 Github 上提供了一個開源的 demo 項目。咱們下面來簡要梳理一下 demo 中如何實現核心音視頻通話功能。

基於 Agora Web SDK 實現音視頻通話

咱們須要在 Electron 環境中建立一個名爲 web-app 的目錄,在裏面建立基本的 Web 部份內容並快速實現一個視頻通話通能。

建立 AgoraRTC 實例並加入頻道:

let client = AgoraRTC.CreateClient({mode:"interop"}) 
複製代碼

初始化 appid 並加入頻道:

client.init(options.key, () => {

                console.log("AgoraRTC client initialized")

                client.join(options.key, options.channel, options.uid, (uid) => {

                    console.log("User " + uid + " join channel successfully")

                    console.log(new Date().toLocaleTimeString())

                    // create localstream

                    resolve(uid)

                })

            })

複製代碼

建立本地流並推送:

let stream = AgoraRTC.creatStream(merge(defaultConfig.config))
localStream.init(() =>{
           client.publish(localStream, err => {
                  console.log("Publish local stream error: " + err);
                  localStream.play("element_id")
           })
},
複製代碼

在完成上面的步驟後,你應該就能看到本身的視頻畫面了,下一步咱們要讓這部分代碼在 Electron 的 App 容器中跑起來。

建立 BrowserWindow 實例並讀取 web-app 目錄中的內容:

const electron = require('electron')
// Module to control application life.
const app = electron.app
// Module to create native browser window.
const BrowserWindow = electron.BrowserWindow

let mainwindow

function createWindow () {

  // Create the browser window.

mainWindow = new BrowserWindow({width: 800, height: 600})
 // and load the index.html of the app.
  mainWindow.loadURL(url.format({
    pathname: path.join(__dirname, './web-app/dist/index.html'),
    protocol: 'file:',
    slashes: true
  }))
mainWindow.webContents.openDevTools()

//Open the DevTools
//mainWindow.webContents.openDevTools()

//Emitted when the window is closed.
mainWindow.on('closed',function(){
  // Dereference the window object, usually you would store windows

  // in an array if your app supports multi windows, this is the time

  // when you should delete the corresponding element.
   mainWindow = null

})
複製代碼

完成後使用 npm start 啓動 Electron 便可。

最後 點擊這裏 查看 demo 源碼,同時可經過網站瞭解SDK接口。

如對咱們的方案感興趣,或遇到開發問題,歡迎訪問,發帖與聲網工程師交流。

相關文章
相關標籤/搜索