中文字幕无码久久精品,13—14同岁无码A片,99热门精品一区二区三区无码,菠萝菠萝蜜在线观看视频高清1

您當前的位置是:  首頁 > 新聞 > 國內 >
 首頁 > 新聞 > 國內 >

Flutter + WebRTC:Agora Flutter SDK 設計實踐

2019-02-20 09:24:37   作者:郝陽,聲網Agora Web工程師   來源:CTI論壇   評論:0  點擊:


  應開發(fā)者們的需求,我們在上周推出了 Agora Flutter SDK,它以Flutter Plugin的形式為Flutter App增添實時音視頻能力。考慮到Flutter對于部分開發(fā)者來講,仍是個新鮮事物。所以,我們也分享了來自RTC開發(fā)者社區(qū)作者的Flutter開發(fā)經驗。其實,在開發(fā)AgoraFlutterSDK之初,我們的技術團隊也就如何基于Flutter實現實時音視頻,深入做過一番調研。本文將就調研的過程和成果,為大家分享一些我們的經驗。
  Flutter如何調用原生代碼
  我們要做的是在Flutter上實現實時音視頻。那么在開始具體的工作之前,首先需要了解Flutter是如何調用諸如“獲取媒體設備”這類原生平臺API的。
  上方來自官方的架構圖已經足夠清晰了,Flutter通過MethodChannel發(fā)起某一方法的調用,然后原生平臺收到消息后執(zhí)行相應的實現(Java/Kotlin/Swift/Object-C)并異步地返回結果,以getUserMedia為示例,首先在Flutter層中聲明這一方法,具體實現則是通過MethodChannel發(fā)送一條攜帶調用方法名和相應參數的信息。
  Future表示一個異步的調用,類似Javascript的Promise;async/await類似,在一個async函數中,會類似同步地按順序去執(zhí)行await方法,盡管await后面的是異步方法。
  當平臺在MainActivity中同樣注冊MethodChannel,通過MethodChannel收到方法調用的消息和參數后,基于本平臺實現相應邏輯,并返回執(zhí)行結果,此處僅以Android平臺為例:

  更多詳細的信息可以參考Flutter官方示例與解釋:
  https://flutter.io/docs/development/platform-integration/platform-channels
  實現音視頻SDK的思路
  了解上述Flutter調用原生平臺方法的原理后,我們就有兩種思路來實現一個音視頻SDK。
  1.先在原生平臺實現音視頻SDK,后Flutter通過MethodChannel直接調用SDK提供的方法。
  具體的方案為直接通過MethodChannel調用已有的聲網AgoraSDK,并在Flutter層抹去可能存在的差異,諸如參數不同、部分方法名不同。
  這種做法的主要優(yōu)點在于可以最大程度復用已有的SDK,類似于建立了一層橋接。
  2.先基于原生平臺實現WebRTC標準,然后在Flutter層通過MethodChannel調用WebRTC接口,再實現音視頻SDK邏輯。
  這種方案先利用原生平臺實現WebRTC標準(前一節(jié)實現的getUserMedia就是此標準的一部分),然后在Flutter層注冊為WebRTCPlugin。在這個FlutterWebRTCPlugin的基礎上參照聲網音視頻SDK,連接到AgoraSD-RTN?全球虛擬通訊網絡。
  這種方案相比前一點,相當于實現一個全新的Dart語言的SDK,需要用到更多Dart的標準庫(諸如math、io、convert之類)與第三方生態(tài)(如(flutter_webrtc)。假設要支持更多的平臺時(比如Windows),只需要該平臺實現WebRTC標準就可以直接使用。
  熟悉WebRTC的同學們可能知道在實現瀏覽器WebRTC應用的時候有一個Adapter的概念,目的就是為了掩藏幾大主流瀏覽器WebRTC接口的些許差異,和本方案的思路是類似的,只不過適配的平臺從Firefox/Chrome/Safari變?yōu)榱薟indows/iOS/Android等。
  最終出于調研的目的,同時也是為了更加迎合Flutter一套代碼,多平臺通用的思想(理論上SDK就是一層設計完備的客戶端邏輯,在WebRTC受良好支持的情況下,工作的內容就變?yōu)椋喝绾问褂肈art語言在WebRTC的標準上實現音視頻通信邏輯),我們選擇采用這個方案,因此讀者可能會發(fā)現這個FlutterSDK整體上不少概念上更接近于聲網Web平臺的音視頻SDK一些。
  3.SDK的結構
  SDK的主要功能大致包含了音視頻采集與播放,與AgoraGateway建立P2P連接并管理,以及與Gateway之間的消息交換和處理。
  雖然Flutter社區(qū)相對較新,但是Dart的標準庫可以算得上是非常完備了,同時也已經有不少優(yōu)秀的第三方Plugin。
  代碼可以主要拆分為以下模塊:
  基于dart:io中Websocket相關的方法實現與Gateway之間的消息通信(比如publish/subscribe這類消息和回復)
  基于開源社區(qū)的flutter_webrtc項目實現音視頻采集以及p2p連接等WebRTC相關功能
  基于dartStream對象或是簡單的Map來實現EventEmitter這些SDK所需的輔助類(當然也可以直接采用Dart的Stream/Sink概念進行替代)。
  這些模塊完成后,在此之上就可以實現類似聲網WebSDK中的Client與Stream對象。
  其中值得一說的是視頻流的播放,可以借助flutter_webrtcplugin中的RTCVideoView對象來實現,想要深入了解具體原理的可以學習一下Flutter外接紋理(Texture)相關概念。
  到此SDK就已經基本形成了,之后便是UI層的開發(fā),Flutter這一部分很大程度上受到了React框架的啟發(fā),熟悉該框架的Web開發(fā)者可以基于此SDK輕松的實現一個可運行在Android/iOS平臺的視頻通話App。我們此前分享過的demo已經成功和已有的聲網Android/iOS/WebSDK進行互通,相應的代碼也許將在不久未來進行開源。
  4.總結
  盡管Flutter社區(qū)仍然很年輕,但是已經逐漸有不少優(yōu)秀的第三方插件涌現出來,加上Dart相對全面的標準庫,實現這樣一個音視頻SDK或是類似的功能并不需要自己大量地去造輪子,加上Flutter本身環(huán)境搭建/構建/調試都非常的方便,因此整個開發(fā)過程中幾乎沒有遇到什么坑。
  此外在應用層的開發(fā)過程中,風格非常接近于使用React進行Web開發(fā),加上Flutter亞秒級的HotReload等特性,在開發(fā)體驗與效率上相比原生開發(fā)確實有著不小的優(yōu)勢。
  再考慮到逐漸完善的跨平臺特性(桌面端的flutter-desktop-embedding項目與瀏覽器端的hummingbird項目)以及可能會到來的谷歌新操作系統Fuchsia,對于無論是想要接觸到原生開發(fā)的Web開發(fā)者,還是追求更高的開發(fā)效率和更好的開發(fā)體驗的原生開發(fā)者來說,Flutter都是一個非常適宜的切入角度,值得在新的一年里加入自己的技術棧中。
【免責聲明】本文僅代表作者本人觀點,與CTI論壇無關。CTI論壇對文中陳述、觀點判斷保持中立,不對所包含內容的準確性、可靠性或完整性提供任何明示或暗示的保證。請讀者僅作參考,并請自行承擔全部責任。

專題

CTI論壇會員企業(yè)