视频直播场景的主要结构及流程如下图所示:
请注意:
除了上述基本功能,开发者如果想使用 ZegoLiveRoom SDK 实现更高级的功能,例如混音、音频录制、外部滤镜等,请直接参考 互动视频-高级功能指南,本文不再赘述。
为了便于开发者更快理解 LiveDemo5 中的逻辑,下述每节会将功能核心源码片段挑出来并加以讲解。开发者亦可直接阅读 LiveDemo5 源码,两者是一致的。
1 单主播直播
单主播直播时,一个房间内仅有一个主播,不支持主播与观众的连麦互动。单主播模式下,发布直播时,需要声明 mPublishFlag 为 ZegoConstants.PublishFlag.SingleAnchor。
1.1 主播推流
主播向观众推送自己的画面,需先推流(即发布直播)。如何使用 SDK 实现推流请参考:初级功能指南-推流
LiveDemo5 中推流相关源码片段演示如下,仅供参考:
// SingleAnchorPublishActivity.java
@Override
protected void doBusiness(Bundle savedInstanceState) {
super.doBusiness(savedInstanceState);
mRoomID = ZegoRoomUtil.getRoomID(ZegoRoomUtil.ROOM_TYPE_SINGLE);
// 登录房间
mZegoLiveRoom.loginRoom(mRoomID, mPublishTitle, ZegoConstants.RoomRole.Anchor, new IZegoLoginCompletionCallback() {
@Override
public void onLoginCompletion(int errorCode, ZegoStreamInfo[] zegoStreamInfos) {
if(errorCode == 0){
handleAnchorLoginRoomSuccess(zegoStreamInfos);
}else {
handleAnchorLoginRoomFail(errorCode);
}
}
});
// 设置推流相关回调
mZegoLiveRoom.setZegoLivePublisherCallback(new IZegoLivePublisherCallback() {
@Override
public void onPublishStateUpdate(int stateCode, String streamID, HashMap streamInfo) {
//推流状态更新
if (stateCode == 0) {
handlePublishSucc(streamID, streamInfo);
} else {
handlePublishStop(stateCode, streamID);
}
}
@Override
public void onJoinLiveRequest(final int seq, String fromUserID, String fromUserName, String roomID) {
}
@Override
public void onPublishQualityUpdate(String streamID, ZegoStreamQuality streamQuality) {
// 推流质量回调
handlePublishQualityUpdate(streamID, streamQuality.quality, streamQuality.videoFPS, streamQuality.videoBitrate);
}
@Override
public AuxData onAuxCallback(int dataLen) {
return handleAuxCallback(dataLen);
}
@Override
public void onCaptureVideoSizeChangedTo(int width, int height) {
}
@Override
public void onMixStreamConfigUpdate(int errorCode, String streamID, HashMap streamInfo) {
}
});
// 设置房间回调
mZegoLiveRoom.setZegoRoomCallback(new IZegoRoomCallback() {
@Override
public void onKickOut(int reason, String roomID) {
}
@Override
public void onDisconnect(int errorCode, String roomID) {
handleDisconnect(errorCode, roomID);
}
@Override
public void onStreamUpdated(final int type, final ZegoStreamInfo[] listStream, final String roomID) {
if (listStream != null && listStream.length > 0) {
switch (type) {
case ZegoConstants.StreamUpdateType.Added:
handleStreamAdded(listStream, roomID);
break;
case ZegoConstants.StreamUpdateType.Deleted:
handleStreamDeleted(listStream, roomID);
break;
}
}
}
@Override
public void onStreamExtraInfoUpdated(ZegoStreamInfo[] zegoStreamInfos, String s) {
}
@Override
public void onRecvCustomCommand(String userID, String userName, String content, String roomID) {