最近要做個(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ù)搬磚去了…