11月7日,即構和上海GDG技術社區聯合舉辦了實時音視頻雲上技術分享專場,來自即構科技和Bilibili的資深技術專家進行了深度分享。大會吸引了眾多開發人員交流、觀看,並在活動過程中與分享嘉賓進行了熱烈互動。下面我們將整理嘉賓們分享的核心內容,錯過活動直播的小夥伴可以繼續觀看學習。
本文是即構科技李展鵬帶來的主題為《Flutter實時音視頻應用場景實踐》的技術分享。以下為主要的分享內容:
大家好,我是來自即構科技的李展鵬,目前負責參與即構音視頻平臺SDK的建設工作。本人從內測版本開始接觸Flutter,較早開始處理Flutter應用於音視頻業務的場景,今天我將和大家一起交流一下Flutter在實時音視頻場景下的應用實戰。
01
Flutter系統架構
首先,給大家簡單介紹一下 Flutter 的整體架構。大家可以看下面這張圖:
圖中綠色區域是基於 Dart 語言的Framework層,包含兩大類UI樣式、控制項、動畫、手勢等等,是Flutter開發者們直接對接的一層。
藍色區域則為 Flutter 的引擎層,使用C++實現,這一層是Flutter實現跨平臺的關鍵所在。核心模塊主要包括與原生交互的Channel機制、skia圖形渲染框架,還有 Dart 虛擬機等等。
橙色區域主要是一些平臺特定模塊。就算 Flutter 擁有跨平臺的特性,但底層還是離不開原生的支持。當某些特定功能無法直接使用 Flutter 實現時,那麼開發者還可以通過編寫原生插件的形式進行支持。即構在Flutter中實現音視頻服務也是主要從這一層進行切入。
基於這張圖,我們大概可以看出Flutter的一些優缺點。
優點
Flutter的優點是跨平臺,擁有雙端一致的體驗,性能強大;基於自研引擎渲染,易於上手。Dart 語言當初用於對標 JS 語言,在設計上更靠近腳本語言風格,相比於原生語言來說更加容易入門。
缺點
Flutter 作為一個相對來說比較新興的框架,相比於其他框架來說避免不了存在生態不完善的問題。不少功能還需要開發者自己造輪子,使用原生語言進行雙端開發。
另外,Flutter 在 Github 上的 issue 相對較多,存在較多的已知bug。例如,在音視頻場景下,視頻渲染這塊的優化問題相比原生還是稍微遜色一些,但是我們可以看到 Flutter 團隊一直都在積極修復各種問題,我們相信未來會越來越穩定。
02
Flutter 實時音視頻快速接入
即構作為專業的音視頻雲服務商,我們很早就開始了對Flutter技術框架的研究,下面我們來介紹 Flutter 實時音視頻的快速接入。
即構SDK快速接入流程包括這幾步:初始化SDK、登錄房間伺服器、用戶推送自己的本地音視頻流,然後拉取遠端的音視頻流。
感興趣的開發者可以掃碼體驗Express Flutter SDK,裡面會有比較詳細的接入指南和示例Demo。
我們看到,當我們需要使用即構Flutter SDK 的時候,需要在工程根目錄下的配置文件裡,添加zego_engine_engine的依賴聲明,然後通過運行flutter pub get的命令,即可從遠端pub倉庫把SDK下載下來。
在圖示的代碼裡,我們可以看到使用即構 Flutter SDK進行快速接入主要包括以下幾步。
第一步,初始化SDK。這個步驟先要從即構官網(www.zego.im)上申請唯一專屬的 AppID 和 App sign。
第二步,登錄房間。
第三步,推送本地音視頻流。在推流前如果需要對視頻流進行本地預覽,那麼還需要使用即構 SDK 基於 Flutter 提供的外接紋理模塊封裝好的接口,創建一個視頻紋理渲染對象,獲取一個 TextureID。
拿到 TextureID 後,通過使用 Flutter 提供的 Texture 控制項,即可進行本地播放。
在這裡,Flutter 對音視頻場景提供了兩種視頻渲染方案,分別是Texture和Platform View。即構同時提供兩種渲染方案的接口,但基於兼容性和穩定性考慮,我們更推薦開發者使用 Texture 方案。
然後,拉流的步驟和推流類似,在這裡不重複贅述。
到這裡,開發者就可以實現簡單的實時音視頻場景了。
03
Flutter自定義視頻採集方案
視頻採集是整條實時音視頻鏈路中的起點。即構SDK內置了對攝像頭的視頻採集,可以直接將採集到的數據進行編碼推流。
但如果開發者需要在採集環節進行一些定製化操作,如,採集完攝像頭原始數據後還需要對接第三方的美顏前處理;或者應用場景中有多種不同的輸入源,如屏幕分享、播放一段視頻推流等,那麼就需要使用到自定義視頻採集功能。
下圖是Native 框架下自定義視頻採集的實現框架:
那麼,Flutter框架下是否可以沿用相同的方案呢?