Electron & C++ 快速開(kāi)發(fā)桌面Web "混合"應(yīng)用

最近要做個(gè)小東西,接入網(wǎng)易直播 SDK,但有一個(gè)比較蛋疼的問(wèn)題就是 web 推流一般都用 Flash,F(xiàn)lash 音頻只能用 speex,然而接收端如果是蘋(píng)果,一般都會(huì)選 HLS,而 HLS 只能用 AAC 音頻。這樣一來(lái),要么服務(wù)端再做一次轉(zhuǎn)碼和重新分發(fā)(延遲+成本,所以豬廠直接不支持),要么只能選擇推流端本地先編好 AAC(iOS/Mac/PC). 只能請(qǐng) C++ 大哥出馬了。

這活又需要對(duì)接現(xiàn)有的網(wǎng)站,包括用戶、頻道、互動(dòng)啥的,又要得急。咋辦捏?去翻了翻 SDK 提供的 Demo, 我的媽呀竟然是 QT 做的,那咋改嘛…想起了從前被 QT 和 MFC 支配的恐懼,還是換個(gè)思路吧。

前一陣子看過(guò) Electron,正好嵌網(wǎng)頁(yè)方便,放狗搜了一圈,發(fā)現(xiàn)了node-gyp這高科技??梢灾苯诱{(diào)用 C++ 模塊,好!就你了!

然后就開(kāi)始了漫長(zhǎng)的 Visual Studio 安裝過(guò)程…話說(shuō) VS 這貨是越來(lái)越大了,以前去食堂吃頓飯的功夫就能裝完,后來(lái)去吃個(gè)烤串才能裝完,再后來(lái)…好像得喝上幾輪才能裝完…

后來(lái)才發(fā)現(xiàn)似乎不裝也行…… 直接這樣就好了


npm install -g --production windows-build-tools

npm install -g node-gyp

然后就可以放心大膽地寫(xiě) C++ 啦,按照套路來(lái)就好了(來(lái)自 node 官網(wǎng)文檔


#include <node.h>

namespace demo {

using v8::FunctionCallbackInfo;

using v8::Isolate;

using v8::Local;

using v8::Object;

using v8::String;

using v8::Value;

void Method(const FunctionCallbackInfo& args) {  

    Isolate* isolate = args.GetIsolate();  

    args.GetReturnValue().Set(String::NewFromUtf8(isolate, "world"));

}

void init(Localexports) {

    NODE_SET_METHOD(exports, "hello", Method);

}

NODE_MODULE(addon, init)

}  // namespace demo

這樣就完成了一個(gè)可供 node 調(diào)用的 C++ 模塊,只需要再加個(gè)配置文件binding.gyp

{
  "targets": [{
    "target_name": "addon",
    "sources": [ "hello.cc"]
  }]
}

然后

node-gyp configure
npm install

然后直接開(kāi)個(gè)js

var addon = require("./build/Release/addon");
console.log(addon.hello());

哇 就可以了 是不是很神奇……

接入 SDK 的時(shí)候有個(gè)坑,網(wǎng)易直播 SDK 只提供了 32bit 的庫(kù),如果是 win64 系統(tǒng),默認(rèn)編譯也是 64位??赡軙?huì)出現(xiàn)一個(gè)奇怪的錯(cuò)誤提示The system cannot find message text for message number 0x%1 in the message file for %2 你就不能直接告訴我Wrong Architecture么……
Don't panic, 坐和放寬,你需要node-gyp rebuild -target=1.4.13 -arch=ia32 -dist-url=https://atom.io/download/atom-shell (1.4.13 是你用的 Electron 版本號(hào))

網(wǎng)易直播 SDK 給的 demo 代碼還比較靠譜了,照著文檔寫(xiě)出來(lái)能編譯過(guò),這就比你們某些開(kāi)源項(xiàng)目不知高到哪里去了 23333。
但有些細(xì)節(jié)地方還是需要處理的,

比如主播通常會(huì)外接麥克風(fēng)啥的,那就需要獲取音視頻設(shè)備列表然后讓用戶選擇;

還有本地要做個(gè)預(yù)覽窗口,如果偷懶可以直接嵌個(gè)網(wǎng)易提供的 web player 直接拉流回來(lái),但這樣一來(lái)肯定有延遲啦,感覺(jué)上就會(huì)怪怪的。所以還是需要本地來(lái)播放一下。demo 里提供的方法是 QPaint, 我們既然不用 QT 就得另想辦法啦,比如 VLC/FFMpeg 之類的總得嵌一個(gè)吧?

然后還有多線程之類的也要做的吧?C++ 做東西就是要考慮比較多

還得處理跟 web 的整合,比如通過(guò) API 獲取推流的地址、界面布局的整合

還得考慮到客戶的業(yè)務(wù)是培訓(xùn)/在線教育,以后有可能還要接入其他的比如屏幕共享啦 PPT 播放啦 白板啦之類的,這就得折騰另外一套SDK了,目前還沒(méi)看,還不知道能不能支持,只能開(kāi)腦洞了,比如白板直接轉(zhuǎn)成 HTML5 Canvas?

哦 還有 Electron 自己的幾個(gè)問(wèn)題,代碼不能讓人直接扒了,可以通過(guò) asar 之類的打個(gè)包,體積太大,估計(jì)還得用 UPX 之類的壓一下,壓完了還得測(cè)測(cè)什么XX衛(wèi)士 XX助手 會(huì)不會(huì)報(bào)毒…

有人估計(jì)要問(wèn)了這么麻煩你為啥不直接用原生…說(shuō)了?。∥液?pia 嘛!
而且客戶那邊的工程師估計(jì) web 居多,界面你們就可以隨便折騰了啊,我只需要維護(hù) C++ 這一塊就夠了…

嗯嗯 基本就是這樣,我繼續(xù)搬磚去了…

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容