1 多人視頻通話功能
本文展示了如何使用 即構實時音視頻SDK ZEGO Express SDK 構造多人視頻通話場景,即實作多對多實時音視頻互動,用戶可在房間內與其余用戶進行實時視頻通話,互相推拉流,該場景可用于多人實時視頻聊天、視頻會議等,

2 多人語音通話的前提條件
在應用多人視頻語音通話場景之前,請確保:
- 已在專案中集成 ZEGO Express SDK,實作基本的實時音視頻功能,詳情請參考 快速開始 - 集成 和 快速開始 - 實作視頻通話,
- 已在 ZEGO 控制臺 創建專案,并申請有效的 AppID 和 AppSign,詳情請參考 控制臺 - 專案管理 中的“專案資訊”,
3 安卓端多人語音通話的示例原始碼下載
請參考 下載示例原始碼 獲取原始碼,
相關原始碼請查看 “/ZegoExpressExample/Scenes/src/main/java/im/zego/Scenes/VideoForMultipleUsers” 目錄下的檔案,
4 即構多人語音通話SDK的使用步驟
本節將介紹如何使用 ZEGO Express SDK 實作多人視頻通話,流程圖如下:

4.1 多人語音聊天SDK創建引擎
定義 SDK 引擎物件,呼叫 createEngine 介面,將申請到的 AppID 和 AppSign 傳入引數 “appID” 和 “appSign”,創建引擎單例物件,
如果需要注冊回呼代理,可將實作了 IZegoEventHandler 的物件傳入引數 “eventHandler”,如果不需要注冊回呼代理,可將 “null” 傳入引數 “eventHandler”,創建引擎后仍需要注冊回呼時可通過呼叫 setEventHandler 介面設定回呼代理,
/** 定義 SDK 引擎物件 */
ZegoExpressEngine engine;
ZegoEngineProfile profile = new ZegoEngineProfile();
/** 請通過官網注冊獲取,格式為 123456789L */
profile.appID = appID;
/** 64個字符,請通過官網注冊獲取,格式為"0123456789012345678901234567890123456789012345678901234567890123" */
profile.appSign = appSign;
/** 通用場景接入 */
profile.scenario = ZegoScenario.GENERAL;
/** 設定app的application 物件 */
profile.application = getApplication();
/** 創建引擎 */
engine = ZegoExpressEngine.createEngine(profile, null);
4.2 多人視頻通話功能開啟房間內用戶變化通知
開發者需在每位用戶登錄房間時將 ZegoRoomConfig 中的 “isUserStatusNotify” 設為 “true”,用于接收其他用戶進出房間的回呼通知,
ZegoRoomConfig RoomConfig = new ZegoRoomConfig();
RoomConfig.isUserStatusNotify = true;
// 登錄房間
engine.loginRoom(roomID, user, RoomConfig);
4.3 多人視頻通話預覽自己的畫面,并推送到遠端
在用戶呼叫 loginRoom 之后,可以呼叫 startPublishingStream 介面,傳入 “streamID”,將自己的音視頻流推送到 ZEGO 音視頻云,您可通過回呼 setEventHandler 監聽 onPublisherStateUpdate 回呼知曉推流是否成功,
如果希望看到自己的畫面,可呼叫 startPreview 介面設定預覽視圖,并啟動本地預覽,
“streamID” 由您本地生成,但是需要保證:同一個 AppID 下,“streamID” 全域唯一,如果同一個 AppID 下,不同用戶各推了一條 “streamID” 相同的流,會導致后推流的用戶推流失敗,
//進行預覽和推流
engine.startPreview(new ZegoCanvas(preview));//preview 為一個View 物件,開發者可以根據業務自定義,一般常用的是TextureView物件
engine.startPublishingStream("YOUR_STREAM_ID");//用戶本端的StreamID
4.4 多人視頻通話拉取音視頻流
4.4.1 多人視頻聊天拉取其他用戶的音視頻
進行視頻通話時,我們需要拉取到其他用戶的音視頻,
onRoomStreamUpdate :在同一房間內的其他用戶將音視頻流推送到 ZEGO 音視頻云時,我們會在此回呼中收到音視頻流新增的通知,
我們可以在該回呼中,呼叫 startPlayingStream,傳入 “streamID” 拉取播放該用戶的音視頻,您可通過監聽 onPlayerStateUpdate 回呼知曉是否成功拉取音視頻,
4.4.2 多人語音聊天展示用戶進出房間的資訊
onRoomUserUpdate 回呼可以用于監聽房間內的用戶變化,房間內其他用戶進入或退出都會觸發該回呼,
房間人數大于 500 人的情況下 onRoomUserUpdate 回呼不保證有效,若業務場景存在房間人數大于 500 的情況,不應依賴于該回呼設計業務邏輯,若有在房間人數大于 500 時使用該回呼的需求,請聯系 ZEGO 技術支持,
4.4 的代碼示例如下:
engine.setEventHandler(new IZegoEventHandler() {
@Override
public void onRoomUserUpdate(String roomID, ZegoUpdateType updateType, ArrayList<ZegoUser> userList) {
super.onRoomUserUpdate(roomID, updateType, userList);
//房間用戶變化回呼,本示例是以toast為展示示例,實際業務流程需開發者按需設計
if(updateType == ZegoUpdateType.ADD){
// 當 “updateType” 為 “ZegoUpdateTypeADD” 時,用戶可以拉取 userList 里的用戶進行處理
for(ZegoUser user : userList){
//進行Toast展示
Toast.makeText(myActivity,user.userID+"加入房間",Toast.LENGTH_SHORT).show();//myActivity為一個content物件,若在activity中可使用該Activity為引數
}
}else{
// 當 “updateType” 為 “ZegoUpdateTypeDelete” 時,用戶可以拉取 userList 里的用戶進行處理
for(ZegoUser user : userList){
//進行Toast展示
Toast.makeText(myActivity,user.userID+"加入房間",Toast.LENGTH_SHORT).show();//myActivity為一個content物件,若在activity中可使用該Activity為引數
}
}
}
@Override
public void onRoomStateUpdate(String roomID, ZegoRoomState state, int errorCode, JSONObject extendedData) {
//房間狀態回呼
super.onRoomStateUpdate(roomID, state, errorCode, extendedData);
if(state == ZegoRoomState.CONNECTED){
//可以根據實際業務進行設計
}
}
@Override
public void onRoomStreamUpdate(String roomID, ZegoUpdateType
updateType, ArrayList< ZegoStream > streamList, JSONObject extendedData) {
// 流變化回呼
super.onRoomStreamUpdate(roomID, updateType, streamList, extendedData);
// 在這里更新 UI 或執行其他操作
if(updateType == ZegoUpdateType.ADD){
// 當 “updateType” 為 “ZegoUpdateTypeADD” 時,用戶可以拉取 streamList 里各條音視頻流以展示房間內其他用戶的畫面和聲音
for(ZegoStream stream : streamList){
//進行拉流,preview 為一個View 物件,開發者可以根據業務自定義,一般常用的是TextureView物件;在展示多人視頻的時候,開發者需要使用不同的 View 承載不同音視頻流的畫面,保證不同用戶的視頻不會重疊在一起;此處的示例代碼會覆寫當前正在拉流的畫面
engine.startPlayingStream( stream.streamID,new ZegoCanvas(preview));
}
}else{
// 當 “updateType” 為 “ZegoUpdateTypeDELETE” 時,用戶可以停止拉取相應的音視頻流
for(ZegoStream stream : streamList){
//停止拉流
engine.stopPlayingStream( stream.streamID);
}
}
}
});
多人語音聊天SDK的 API 呼叫時序圖參考

5 獲取 Java 多人語音聊天SDK 更多幫助
獲取本文Java 多人語音聊天SDK的開發檔案、技術支持,訪問即構檔案中心,可實作視頻會議和直播場景下多人視頻語音聊天功能;
近期有開發規劃的開發者可上即構官網查看,恰逢即構七周年全線音視頻產品1折的優惠,聯系商務獲取產品優惠;
音視頻場景解決方案分享,更多詳情可搜索官網(https://zegoguanwang.datasink.sensorsdata.cn/t/pB)轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/502623.html
標籤:其他
上一篇:Shell 第二章《流控》
