如何在uni-app平臺快速實現(xiàn)一對一音視頻通話應用

“一套代碼,多端運行”是很多開發(fā)團隊的夢想鳄乏。ZEGO SDK基于uni-app跨平臺框架支持iOS跷车、Android、Windows橱野、macOS姓赤、HarmonyOS、Web仲吏、小程序并支持平臺間互通不铆,快速實現(xiàn)搭建多端音視頻通話,大大降低開發(fā)和學習成本裹唆。

本文將引導快速創(chuàng)建和運行第一個uni-app+RTC項目誓斥,適合想要快速完成多端共用音視頻項目的開發(fā)者;


1 準備環(huán)境

在開始集成 ZEGO Express SDK 前许帐,請確保開發(fā)環(huán)境滿足以下要求:
HBuilderX 3.0.0 或以上版本劳坑。
準備 iOS / Android 設備,版本要求如下:
iOS 9.0 或以上版本且支持音視頻的 iOS 設備成畦。
Android 4.4 或以上版本且支持音視頻的 Android 設備距芬。
iOS / Android 設備已經連接到 Internet。


2 項目準備

2.1 創(chuàng)建項目

進入即構官網循帐,在【ZEGO控制臺】創(chuàng)建項目框仔,并申請有效的 AppID,這一步很關鍵拄养,appid為應用的唯一標識离斩,如身份證號,是應用的身份證明,用于明確你的項目及組織身份跛梗。zego提供的服務也是基于APP ID寻馏;

App ID的獲取方式很簡單,只需3~5分鐘核偿,在即構官網-我的項目-創(chuàng)建即可诚欠。創(chuàng)建的項目信息可用于SDK的集成和配置;

2.2 Token 鑒權

登錄房間時必須 使用 Token 鑒權 漾岳,可參考 Token 鑒權教程
為了方便開發(fā)階段的調試聂薪,開發(fā)者可直接在 ZEGO 控制臺獲取臨時 Token(有效期為 24 小時) 來使用,詳情請參考 控制臺(新版) - 項目管理 中的 “項目信息”蝗羊。


3 集成

3.1 項目設置

開始集成前,可參考如下步驟設置你的項目仁锯;
如已有項目耀找,本步驟可忽略。
如需新建項目业崖,可按照以下步驟創(chuàng)建你的新項目:

1.啟動 HBuilderX野芒,選擇“文件 > 新建 > 項目”菜單。


2.在出現(xiàn)的表單中双炕,選擇 “uni-app” 平臺狞悲,并填寫項目名稱。


3.單擊“創(chuàng)建”妇斤,即可創(chuàng)建項目摇锋。

3.2 導入 SDK

在 ZEGO 官網下載 SDK

1.下載 Express-Video SDK 到本地,解壓縮 “zego-ZegoExpressUniAppSDK” 文件站超。
2.將解壓縮后的文件夾直接復制到項目工程根目錄下的 “nativeplugins” 文件夾荸恕,如果沒有該目錄,請手動創(chuàng)建死相。


3.3 在 uni-app 項目中導入插件

1.單擊項目目錄的 “manifest.json” 文件后融求,單擊“App原生插件配置”中的“選擇本地插件”或“選擇云端插件”。


2.在彈出的選擇框中算撮,選擇 “ZegoExpress 音視頻 SDK” 后生宛,單擊“確認”,即添加成功肮柜。


3.4 自定義調試基座

2.4.1 制作自定義調試基座
1.選擇“運行 > 運行到手機或模擬器 > 制作自定義調試基座”菜單陷舅。

2.在彈出的界面中,按照 uni-app 教程审洞,填寫相關信息蔑赘,并單擊“打包”進行云打包。


打包成功后,控制臺會收到 uni-app 的相關提示缩赛。

3.4.2 切換運行基座為自定義調試基座
自定義調試基座選擇“運行 > 運行到手機或模擬器 > 運行基座選擇 > 自定義調試基座”菜單耙箍。



4 集成 JS 封裝層

1.導入 JS 封裝層。
在插件市場的 ZegoExpressEngine 音視頻插件(JS) 界面單擊右側的“使用 HBuilderX導入插件”酥馍。

導入的 JS 封裝層將存儲在 “components” 目錄中辩昆。

1.導入后可以在業(yè)務代碼中引入 JS 封裝層,并調用 Express 相關接口旨袒,示例如下:

import ZegoExpressEngine from '@/components/zego-ZegoExpressUniApp-JS/lib/ZegoExpressEngine';


5 實現(xiàn)流程

用戶通過 ZEGO Express SDK 進行視頻通話的基本流程為:
用戶 A汁针、B 加入房間,用戶 B 預覽并將音視頻流推送到 ZEGO 云服務(推流)砚尽,用戶 A 收到用戶 B 推送音視頻流的通知之后施无,在通知中播放用戶 B 的音視頻流(拉流)。


整個音視頻通話推拉流過程的 API 調用時序如下圖:


5.1 創(chuàng)建引擎

1. 創(chuàng)建界面
在創(chuàng)建引擎之前必孤,ZEGO 推薦開發(fā)者添加以下界面元素猾骡,方便實現(xiàn)基本的實時音視頻功能。

  • 本地預覽窗口
  • 遠端視頻窗口
  • 結束按鈕

2. 創(chuàng)建引擎
調用 createEngineWithProfile 接口敷搪,將申請到的 AppID 傳入參數(shù) “appID”兴想,創(chuàng)建引擎單例對象。
如果需要注冊回調方法赡勘,開發(fā)者可根據(jù)實際需要嫂便,實現(xiàn) ZegoEventListener 中的某些方法,創(chuàng)建引擎后可通過調用 on 接口設置回調闸与。

// 導入
import ZegoExpressEngine from '@/components/zego-ZegoExpressUniApp-JS/lib/ZegoExpressEngine';

// 采用通用場景
const profile = {
appID : xxx,
scenario : 0
};

ZegoExpressEngine.createEngineWithProfile(profile)

5.2 登錄房間

1. 登錄
你可以調用 loginRoom 接口登錄房間毙替。roomID 和 user 的參數(shù)由您本地生成,但是需要滿足以下條件:

  • 同一個 AppID 內践樱,需保證 “roomID” 全局唯一蔚龙。
  • 同一個 AppID 內,需保證 “userID” 全局唯一映胁,建議開發(fā)者將 “userID” 與自己業(yè)務的賬號系統(tǒng)進行關聯(lián)木羹。
let roomConfig = {};
//token 由用戶自己的服務端生成,為了更快跑通流程解孙,也可以通過即構控制臺獲取臨時的音視頻 token
roomConfig.token = "xxxx";
// 只有傳入 “isUserStatusNotify” 參數(shù)取值為 “true” 的 ZegoRoomConfig坑填,才能收到 onRoomUserUpdate 回調。
roomConfig.isUserStatusNotify = true;
// 登錄房間
// 開始登錄房間
ZegoExpressEngine.instance().loginRoom('room1', {'userID': 'id1', 'userName': 'user1'}, roomConfig);

2. 監(jiān)聽登錄房間后的事件回調

可根據(jù)實際應用需要弛姜,在登錄房間后監(jiān)聽想要關注的事件通知脐瑰,比如房間狀態(tài)更新、用戶狀態(tài)更新廷臼、流狀態(tài)更新等苍在。

  • roomStateUpdate:房間狀態(tài)更新回調绝页,登錄房間后,當房間連接狀態(tài)發(fā)生變更(如出現(xiàn)房間斷開寂恬,登錄認證失敗等情況)续誉,SDK 會通過該回調通知。
  • roomUserUpdate:用戶狀態(tài)更新回調初肉,登錄房間后酷鸦,當房間內有用戶新增或刪除時,SDK 會通過該回調通知牙咏。
  • 只有調用 loginRoom 接口登錄房間時傳入 ZegoRoomConfig 配置臼隔,且 “isUserStatusNotify”參數(shù)取值為 “true” 時,用戶才能收到 roomUserUpdate 回調妄壶。
  • roomStreamUpdate:流狀態(tài)更新回調摔握,登錄房間后,當房間內有用戶新推送或刪除音視頻流時丁寄,SDK 會通過該回調通知氨淌。
// 以下為常用的房間相關回調

ZegoExpressEngine.instance().on('roomStateUpdate', (roomID, state, errorCode, extendedData) => {
  // 房間狀態(tài)更新回調,登錄房間后狡逢,當房間連接狀態(tài)發(fā)生變更(如出現(xiàn)房間斷開,登錄認證失敗等情況)拼卵,SDK會通過該回調通知
}); ;

ZegoExpressEngine.instance().on('roomUserUpdate', (roomID, updateType, userList) => {
  // 用戶狀態(tài)更新奢浑,登錄房間后,當房間內有用戶新增或刪除時腋腮,SDK會通過該回調通知
});

ZegoExpressEngine.instance().on('roomStreamUpdate', (roomID, updateType, streamList) => {
  // 流狀態(tài)更新雀彼,登錄房間后,當房間內有用戶新推送或刪除音視頻流時即寡,SDK會通過該回調通知
});

5.3 推流

1. 開始推流
調用 startPublishingStream 接口徊哑,傳入流 ID 參數(shù) “streamID”,向遠端用戶發(fā)送本端的音視頻流聪富。

/** 開始推流 */
ZegoExpressEngine.instance().startPublishingStream("streamID");

2. 啟動本地預覽
如果希望看到本端畫面莺丑,可使用 <zego-local-view> 標簽設置預覽視圖,并調用 startPreview 接口啟動本地預覽墩蔓。

<template>
    <zego-local-view style="height: 403.84rpx;flex: 1;"></zego-local-view>
</template>

js部分:
/** 開始預覽 */
ZegoExpressEngine.instance().startPreview()

3. 監(jiān)聽推流后的事件回調
根據(jù)實際應用需要梢莽,在推流后監(jiān)聽想要關注的事件通知,比如推流狀態(tài)更新等奸披。
publisherStateUpdate:推流狀態(tài)更新回調昏名,調用推流接口成功后,當推流狀態(tài)發(fā)生變更阵面,如出現(xiàn)網絡中斷導致推流異常等情況轻局,SDK 在重試推流的同時,會通過該回調通知。

ZegoExpressEngine.instance().on("publisherStateUpdate", (streamID, state, errorCode, extendedData) => {
    // 調用推流接口成功后襟士,當推流器狀態(tài)發(fā)生變更跪呈,如出現(xiàn)網絡中斷導致推流異常等情況,SDK在重試推流的同時夫壁,會通過該回調通知
    //....
});

5.4 拉流

1. 開始拉流
使用 <zego-remote-view> 標簽設置遠端視頻流視圖拾枣,調用 startPlayingStream 接口,根據(jù)傳入的流 ID 參數(shù) “streamID”盒让,拉取遠端推送的音視頻流梅肤。

<template>
    <zego-remote-view :streamID="playStreamID" style="height: 403.84rpx;flex: 1"></zego-remote-view>
</template>

js部分:
/** 開始拉流 */
this.playStreamID = "StreamID_1"
ZegoExpressEngine.instance().startPlayingStream(this.playStreamID)

2. 監(jiān)聽拉流后的事件回調
根據(jù)實際應用需要,在拉流后監(jiān)聽想要關注的事件通知邑茄,比如拉流狀態(tài)更新等姨蝴。
playerStateUpdate:拉流狀態(tài)更新回調,調用拉流接口成功后肺缕,當拉流狀態(tài)發(fā)生變更左医,如出現(xiàn)網絡中斷導致推流異常等情況,SDK 在重試拉流的同時同木,會通過該回調通知浮梢。

ZegoExpressEngine.instance().on("playerStateUpdate", (streamID, state, errorCode, extendedData) => {
    /** 調用拉流接口成功后,當拉流器狀態(tài)發(fā)生變更彤路,如出現(xiàn)網絡中斷導致推流異常等情況秕硝,SDK在重試拉流的同時,會通過該回調通知 */
    //....
});


5.5 體驗實時音視頻功能

在真機中運行項目洲尊,運行成功后远豺,可以看到本端視頻畫面。
為方便體驗坞嘀,ZEGO 提供了一個 Web 端調試示例躯护,在該頁面下,輸入相同的 AppID丽涩、RoomID棺滞、Server 地址和 Token,即可加入同一房間與真機設備互通矢渊。當成功開始音視頻通話時检眯,可以聽到遠端的音頻,看到遠端的視頻畫面昆淡。

5.6 停止推拉流

1. 停止推流/預覽
調用 stopPublishingStream 接口停止發(fā)送本地的音視頻流锰瘸,結束通話。

/** 停止推流 */
ZegoExpressEngine.instance().stopPublishingStream();

如果啟用了本地預覽昂灵,開發(fā)者可以在停止推流后根據(jù)業(yè)務需要調用 stopPreview 接口停止預覽避凝。

/** 停止本地預覽 */
ZegoExpressEngine.instance().stopPreview();

2. 停止拉流

調用 stopPlayingStream 接口舞萄,停止拉取遠端的音視頻流。

/** 停止拉流 */
ZegoExpressEngine.instance().stopPlayingStream("streamID");

3. 退出房間
調用 logoutRoom 接口退出房間管削,本端會收到 roomStateUpdate 回調通知調用結果倒脓,并停止其所有推拉流以及本地預覽。

/** 退出房間 */
ZegoExpressEngine.instance().logoutRoom('room1');

5.7 銷毀引擎
調用 destroyEngine 接口銷毀引擎含思,用于釋放 SDK 使用的資源崎弃。

/** 銷毀引擎 */
ZegoExpressEngine.destroyEngine();


結語:

你已經完成了第一個uni-app+RTC項目了,可以與小伙伴多端進行音視頻通話測試含潘。

即構助力企業(yè)一周快速搭建音視頻通話饲做、秀場直播、語聊房遏弱、K歌房等場景盆均,提供多種解決方案,同時即構每月贈送10000分鐘免費時長漱逸。

獲取更多文檔泪姨、Demo、技術幫助

獲取本文的Demo饰抒、開發(fā)文檔肮砾、技術支持,訪問即構文檔中心
了解商務活動袋坑、熱門產品仗处,??點擊聯(lián)系商務;
注冊即構ZEGO開發(fā)者帳號咒彤,快速開始疆柔。

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末咒精,一起剝皮案震驚了整個濱河市镶柱,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌模叙,老刑警劉巖歇拆,帶你破解...
    沈念sama閱讀 211,743評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異范咨,居然都是意外死亡故觅,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,296評論 3 385
  • 文/潘曉璐 我一進店門渠啊,熙熙樓的掌柜王于貴愁眉苦臉地迎上來输吏,“玉大人,你說我怎么就攤上這事替蛉」峤Γ” “怎么了拄氯?”我有些...
    開封第一講書人閱讀 157,285評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長它浅。 經常有香客問我译柏,道長,這世上最難降的妖魔是什么姐霍? 我笑而不...
    開封第一講書人閱讀 56,485評論 1 283
  • 正文 為了忘掉前任鄙麦,我火速辦了婚禮,結果婚禮上镊折,老公的妹妹穿的比我還像新娘胯府。我一直安慰自己,他們只是感情好腌乡,可當我...
    茶點故事閱讀 65,581評論 6 386
  • 文/花漫 我一把揭開白布盟劫。 她就那樣靜靜地躺著,像睡著了一般与纽。 火紅的嫁衣襯著肌膚如雪侣签。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,821評論 1 290
  • 那天急迂,我揣著相機與錄音影所,去河邊找鬼。 笑死僚碎,一個胖子當著我的面吹牛猴娩,可吹牛的內容都是我干的。 我是一名探鬼主播勺阐,決...
    沈念sama閱讀 38,960評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼卷中,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了渊抽?” 一聲冷哼從身側響起蟆豫,我...
    開封第一講書人閱讀 37,719評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎懒闷,沒想到半個月后十减,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 44,186評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡愤估,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,516評論 2 327
  • 正文 我和宋清朗相戀三年帮辟,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片玩焰。...
    茶點故事閱讀 38,650評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡由驹,死狀恐怖,靈堂內的尸體忽然破棺而出昔园,到底是詐尸還是另有隱情蔓榄,我是刑警寧澤闹炉,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布,位于F島的核電站润樱,受9級特大地震影響渣触,放射性物質發(fā)生泄漏。R本人自食惡果不足惜壹若,卻給世界環(huán)境...
    茶點故事閱讀 39,936評論 3 313
  • 文/蒙蒙 一嗅钻、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧店展,春花似錦养篓、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,757評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至概说,卻和暖如春碧注,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背糖赔。 一陣腳步聲響...
    開封第一講書人閱讀 31,991評論 1 266
  • 我被黑心中介騙來泰國打工萍丐, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人放典。 一個月前我還...
    沈念sama閱讀 46,370評論 2 360
  • 正文 我出身青樓逝变,卻偏偏與公主長得像,于是被迫代替她去往敵國和親奋构。 傳聞我的和親對象是個殘疾皇子壳影,可洞房花燭夜當晚...
    茶點故事閱讀 43,527評論 2 349

推薦閱讀更多精彩內容