一、前提條件
在實現Java直播前,請確保:
二、實現流程
本文所介紹的Java直播實現流程,是基於ZEGO Express SDK 來實現的,以下是API調用時序圖:

1、創建引擎
1)創建界面(可選)
在開始之前,推薦開發者添加以下界面元素,方便實現基本的實時音視頻功能。
2)創建引擎
定義 SDK 引擎對象,調用 createEngine 接口,將申請到的 AppID 和 AppSign 傳入參數 “appID” 和 “appSign”,創建引擎單例對象。
如果需要注冊回調代理,可將實現了 IZegoEventHandler 的對象傳入參數 “eventHandler”。如果不需要注冊回調代理,可將 “null” 傳入參數 “eventHandler”,創建引擎后仍需要注冊回調時可通過調用 setEventHandler 接口設置回調代理。
Plain Text
/** 定義 SDK 引擎對象 */
ZegoExpressEngine engine;
/** 填寫 appID 和 appSign */
long appID = ; /** 請通過官網注冊獲取,格式為 123456789L */
String appSign = ; /** 64個字符,請通過官網注冊獲取,格式為"0123456789012345678901234567890123456789012345678901234567890123" */
/** 創建引擎,使用測試環境,通用場景接入 */
engine = ZegoExpressEngine.createEngine(appID, appSign, true, ZegoScenario.GENERAL, getApplication(), null);
2、登錄房間
1)登錄
傳入用戶 ID 參數 “userID” 創建 ZegoUser 用戶對象后,調用 loginRoom 接口,傳入房間 ID 參數 “roomID” 和用戶參數 “user”,登錄房間。
需要注意的是:
- 同一個 AppID 內,需保證 “roomID” 全局唯一。
- 同一個 AppID 內,需保證 “userID” 全局唯一,建議開發者將其設置成一個有意義的值,可將 “userID” 與自己業務賬號系統進行關聯。
- ZegoUser 的構造方法
public ZegoUser(String userID) 會將 “userName” 設為與傳的參數 “userID” 一樣。“userID” 與 “userName” 不能為 “null” 否則會導致登錄房間失敗。
Plain Text
/** 創建用戶 */
ZegoUser user = new ZegoUser("user1");
/** 開始登錄房間 */
engine.loginRoom("room1", user);
2)監聽事件回調(可選)
根據實際應用需要,在登錄房間后監聽想要關注的事件通知,比如房間狀態更新、用戶狀態更新、流狀態更新等。
Plain Text
engine.setEventHandler(new IZegoEventHandler() {
/** 以下為常用的房間相關回調 */
/** 房間狀態更新回調 */
@Override
public void onRoomStateUpdate(String roomID, ZegoRoomState state, int errorCode, JSONObject extendedData) {
/** 根據需要實現事件回調 */
}
/** 用戶狀態更新回調 */
@Override
public void onRoomUserUpdate(String roomID, ZegoUpdateType updateType, ArrayList<ZegoUser> userList) {
/** 根據需要實現事件回調 */
}
/** 流狀態更新回調 */
@Override
public void onRoomStreamUpdate(String roomID, ZegoUpdateType updateType, ArrayList<ZegoStream> streamList, JSONObject extendedData){
/** 根據需要實現事件回調 */
}
});
3、推流
1)開始推流
調用 startPublishingStream 接口,傳入流 ID 參數 “streamID”,向遠端用戶發送本端的音視頻流。
需要注意的是:
同一個 AppID 內,需保證 “streamID” 全局唯一。如果同一個 AppID 內,不同用戶各推了一條 “streamID” 相同的流,會導致后推流的用戶推流失敗。
Plain Text
/** 開始推流 */
engine.startPublishingStream("stream1");
2)啟用本地預覽(可選)
如果希望看到本端的畫面,可調用 startPreview 接口設置預覽視圖,並啟動本地預覽。
Plain Text
/**
* 啟動預覽,設置本地預覽視圖,視圖模式采用 SDK 默認的模式,等比縮放填充整個 View
* 如下 preview_view 為 UI 界面上的 SurfaceView/TextureView/SurfaceTexture 對象
*/
engine.startPreview(new ZegoCanvas(preview_view));
3)監聽事件回調(可選)
根據實際應用需要,在推流后監聽想要關注的事件通知,比如推流狀態更新等。
onPublisherStateUpdate:推流狀態更新回調,調用推流接口成功后,當推流狀態發生變更,如出現網絡中斷導致推流異常等情況,SDK 在重試推流的同時,會通過該回調通知。
Plain Text
engine.setEventHandler(new IZegoEventHandler() {
/** 常用的推流相關回調 */
/** 推流狀態更新回調 */
@Override
public void onPublisherStateUpdate(String streamID, ZegoPublisherState state, int errorCode, JSONObject extendedData){
/** 根據需要實現事件回調 */
}
});
4、拉流
1)開始拉流
調用 startPlayingStream 接口,根據傳入的流 ID 參數 “streamID”,拉取遠端推送的音視頻流。
遠端用戶推送的 “streamID” 可以從 IZegoEventHandler 代理中的 onRoomStreamUpdate 回調中獲得。
支持以下類型的控件進行拉流播放:SurfaceView、TextureView 和 SurfaceTexture。
Plain Text
/**
* 開始拉流,設置遠端拉流渲染視圖,視圖模式采用 SDK 默認的模式,等比縮放填充整個 View
* 如下 play_view 為 UI 界面上的 SurfaceView/TextureView/SurfaceTexture 對象
*/
engine.startPlayingStream("stream1", new ZegoCanvas(play_view));
2)監聽事件回調(可選)
根據實際應用需要,在拉流后監聽想要關注的事件通知,比如拉流狀態更新等。
onPlayerStateUpdate:拉流狀態更新回調,調用拉流接口成功后,當拉流狀態發生變更,如出現網絡中斷導致推流異常等情況,SDK 在重試拉流的同時,會通過該回調通知。
Plain Text
engine.setEventHandler(new IZegoEventHandler() {
/** 常用的拉流相關回調 */
/** 拉流狀態相關回調 */
@Override
public void onPlayerStateUpdate(String streamID, ZegoPlayerState state, int errorCode, JSONObject extendedData){
/** 根據需要實現事件回調 */
}
});
5、停止推拉流
1)停止推流預覽
調用 stopPublishingStream 接口停止向遠端用戶發送本端的音視頻流。
Plain Text
/** 停止推流 */
engine.stopPublishingStream();
如果啟用了本地預覽,調用 stopPreview 接口停止預覽。
Plain Text
/** 停止本地預覽 */
engine.stopPreview();
2)停止拉流
調用 stopPlayingStream 接口停止拉取遠端推送的音視頻流。
Plain Text
/** 停止拉流 */
engine.stopPlayingStream(streamID);
6、退出房間
調用 logoutRoom 接口退出房間。
Plain Text
/** 退出房間 */
engine.logoutRoom("room1");
7、銷毀引擎
調用 destroyEngine 接口銷毀引擎,用於釋放 SDK 使用的資源。
根據實際需要,可在銷毀引擎時傳入參數 “callback”,監聽回調以確保設備硬件資源被釋放完成。該回調只用於發送通知,開發者不可以在回調內釋放與引擎相關的資源。如果開發者不需要監聽回調,可將 “null” 傳入 “callback”。
Plain Text
/** 銷毀 SDK */
ZegoExpressEngine.destroyEngine(null);
以上就是Java直播實現的全流程,看完后大家不妨自己創建一個新項目實際操作下,有任何問題也可以私信或者是評論與我討論哦~~~~