用了 Fabric.js 後突然想到了...
交代背景
我們公司有一個線上導播臺的產品,是利用騰訊雲音視訊提供的介面自行封裝的一個線上推流工具。
用過騰訊雲這個產品的小夥伴肯定都知道,再 TRTC 的產品中,提供了一個雲端混流的功能,騰訊雲提供了幾種混流模板,除了幾種固定模板,還提供了一種自定義模板的方式。再自定義模板裡,使用者可以自行編輯推流視窗的佈局風格。
在之前,我們使用這個自定義模板的時候,都是自己再開發環境人力來試,通過繁瑣的除錯,配置好相關引數後,然後把配置資訊做固化儲存,最後線上系統直接呼叫。
這樣做的痛點就是每次如果想用新的佈局,就得一點點的耐心調參,非常苦逼。
直到昨天,我終於忍不了了。。。
必須要做一個視覺化的操作介面來解放雙手!

邂逅 Fabric.js
由於有幾次苦逼調參的經歷,所以我的腦海裡對整個過程其實是有畫面感的。
大體思路就是需要有一個背景畫布,然後再畫布上可以新增任意色塊來代表混流畫面,同時色塊可以任意縮放和移動。設定完成後,可以將配置好的畫面序列化成 json 結構的配置文字,當然在讀取的時候也可以方便的反序列化。
簡單總結一下,具體的需求就是一下 4 點
-
支援設定背景
-
支援自由新增圖形
-
支援自由縮放和平移
-
支援序列化和反序列化
這時候,就該主角兒登場啦!(邂逅過程,略!)
以上幾點需求,遇上 Farbic.js,純純就是小 case。
老規矩,先上官方文件:point_right::http://fabricjs.com/,
再來看一下我這邊的應用場景,我這邊主要用到的是上述幾個需求,直接看程式碼吧
載入圖片
function loadImage(url) {
new fabric.Image.fromURL(url, function (oImg) {
imgBack = oImg;
imgBack.url = url;
imgBack.lockMovementX = true
imgBack.lockMovementY = true
// 禁止水平縮放
imgBack.lockScalingX = true
// 禁止垂直縮放
imgBack.lockScalingY = true
imgBack.scaleX = 0.5;
imgBack.scaleY = 0.5;
canvas.add(imgBack);
})
}
複製程式碼
建立圖形
這裡只用到了矩形,同時疊加了文字顯示,以組合形式新增
function makeRect() {
let num = $("#number").val();
if (num > 9) {
TT.error("最多建立9個畫面")
return;
}
clearRect();
for (let i = 0; i < num; i++) {
var rect = new fabric.Rect({
left: 100 * i,
top: 100 * i,
fill: colors[i],
width: 100,
height: 100
});
var text = new fabric.Text((i + 1).toString(), {
left: 100 * i + 50,
top: 100 * i + 50,
fontSize: 30,
originX: 'center',
originY: 'center',
fill: 'white'
});
var group = new fabric.Group([rect, text], {
left: 100 * i,
top: 100 * i,
width: 100,
height: 100
});
rectArr.push(group);
// 將矩形新增到canvas裡
canvas.add(group);
}
}
複製程式碼
上述兩個步驟完成後,就可以看到預覽圖了

儲存/讀取配置(序列化和反序列化)
Fabric 提供了序列化和反序列化的介面,可以非常方便的把自己構造的最終圖形儲存起來,同時讀取也十分方便
根據實際場景,可以使用“canvas.toJSON()”方法把內容生成結構化的資料儲存,也可以直接通過”JSON.stringfiy(canvas)“把資料結構轉換成字串儲存。
同樣,讀取的時候直接“canvas.loadFromJSON(data)”就可以了。
推流效果
當可以視覺化的編輯推流模板之後,就可以看一下最終的推流效果了,這裡我放個小視訊看一眼吧
如此,便完成了我全部的需求。
結束了?不!
以上幾段程式碼根本不值一提,貼出來只是給還沒用過 Fabric 的小夥伴簡單參考,實際的案例還是要到官方的文件去看,那裡可不止我這點東西,你還會看到,Fabric 還支援,漸變,裁剪,各種事件的監聽,動畫,分組等等。總之就是你能想到的在圖形軟體裡能做的事情,用 Fabric 幾乎都可以很輕易的完成。
那寫到這裡,我還想說,大家再用這種線上會議的元件時,應該都會看到類似“互動白板”之類的產品。之前我還說,這個白板真是不賴,開發起來肯定不容易,倒不是說“互動”的部分有多難,而是真的像“白板”一樣可以隨意揮灑,圖文混排,手工書寫等等,這個部分應該更加困難。
用完 Fabric,我感覺這個部分好像也可以很順利的解決了,因為白板提供的所有自由定義的東西,用 Fabric 幾乎都可以完成。
雖然都知道原理是基於 canvas 元件的,但正如它的官方教程所說:point_down:
如今,Canvas 使我們能夠在網路上建立一些絕對令人驚歎的圖形。但它提供的 API 低階令人失望。如果我們只是想在畫布上繪製一些基本形狀而忘記它們,那是一回事。但是,一旦需要進行任何型別的互動、隨時更改圖片或繪製更復雜的形狀,情況就會發生巨大變化。
Fabric 旨在解決這個問題。
其實“互動白板”這個產品的主要的邏輯點在“互動”的部分,這一趴應該是業務邏輯複雜,但技術難度不高,而我本以為技術難度高的“白板”部分,在有了 Fabric 之後,也把門檻降低了許多
到這裡,就可以大膽設想一下,結合即使通訊技術,是不是可以 DIY 一個自己的“互動白板”出來!
有機會一定要試試。今天就到這啦!
最後,祝大家中秋節快樂啊!!
- 那些 Go 語言發展歷史上的重大決策
- 從趨勢到挑戰,一站式解讀作業系統運維和可觀測性
- 百萬級 Topic,騰訊雲的 Apache Pulsar 穩定性實踐
- Apache Doris 在思必馳的應用優化實踐:海量語音通話資料下,實時、離線一體的數倉架構設計實踐
- 愛數正式開源認知智慧開發框架 KWeaver
- 運維智慧化的三大關鍵技術
- “抄我的還‘反捅’我一刀”,Gary Marcus 發文駁斥圖靈獎得主 Yann LeCun
- 當出海成為必選項,企業如何構建全場景全生態技術底座?
- 數智底座必備能力三:快速構建創新應用
- Docker 多階段構建實戰 (multi-stage builds)
- 工作筆記之 SELECT 語句在 SAP ABAP 中的用法總結(上)
- 經久不衰的設計定律是不要讓我思考的設計
- 不要指望下一個像 GPT 這樣的大型語言模型會民主化
- Java 近期新聞:Helidon Níma、Spring Framework、MicroProfile、MicroStream、Kotlin 和 Piranha
- 一文入門 jQuery
- C 學習 ---__libc_open 函式的原理
- 監控系統工作原理
- 甲骨文新微服務框架 Helidon Níma:使用虛擬執行緒實現高效能
- 【雲原生 | 從零開始學 Kubernetes】二、使用 kubeadm 搭建 K8S 叢集
- Elasticsearch 聚合學習之四:結果排序