客户端实现(基于 NERoom)
更新时间: 2025/06/03 16:12:03
本文为您展示通过网易云信 房间组件(NERoom) 实现直播房场景的相关方案,帮助您在业务中实现语音互动等能力。
方案说明
网易云信直播房场景实现方案分为基于 NERoom 和 RTC 两种方案。NERoom 和 RTC 之间的关系可参考《语聊房》集成方案选型指引。相较于 基于 RTC 的实现方案,基于 NERoom 实现直播房场景适用于开发排期紧、需快速上线、且有一定的定制化需求的用户。
方案架构
直播房场景实现方案架构说明如下:
- 主播、连麦者和观众加入同一个 NERoom 房间。
- 主播和连麦者在音视频房间内进行音频流的实时发布和订阅。
- 普通观众在音视频房间内仅使用播放器播放拉流内容。
准备工作
根据本文操作前,请确保您已经完成了以下设置:
- 在 网易云信控制台 上,完成创建应用,并获取到应用密钥。详情请参考 创建应用并获取 AppKey。
- 开通音视频通话 2.0、旁路推流功能、和 NERoom 房间组件。详情请参考 开通产品。
- 集成 CDN 播放器,用以实现观众观看直播。详情请参考 集成 SDK。
接口参考
直播房场景实现方案涉及的接口或功能如下所示:
一:初始化
以下流程图介绍了如何实现初始化:
sequenceDiagram
autonumber
LiveActivity ->> NERoomKit: initialize
NERoomKit -->> LiveActivity: onSuccess
AudienceActivity ->> NERoomKit: initialize
NERoomKit -->> AudienceActivity: onSuccess
二:登录
以下流程图介绍了如何实现登录:
sequenceDiagram
autonumber
LiveActivity ->> NEAuthService: login
NEAuthService -->> LiveActivity: onSuccess
AudienceActivity ->> NEAuthService: login
NEAuthService -->> AudienceActivity: onSuccess
三:主播预览
以下流程图介绍了如何实现主播预览:
sequenceDiagram
autonumber
LiveActivity ->> LiveActivity: requestPermission(audio、video)
LiveActivity -->> LiveActivity: onSuccess
LiveActivity ->> NERoomRtcController: setupLocalVideoCanvas
LiveActivity ->> NERoomRtcController: enableLocalVideo
LiveActivity ->> NERoomRtcController: startVideoPreview
四:主播开播
以下流程图介绍了如何实现主播开播:
sequenceDiagram
autonumber
participant LiveActivity as 主播
participant AppServer as 业务服务器
participant NERoomKit_Server
participant NERoomService
participant NERoomRtcController
participant NERoomChatController
LiveActivity ->> AppServer: createLiveRoom
AppServer ->> NERoomKit_Server: createRoom
NERoomKit_Server -->> AppServer: onSuccess
AppServer -->> LiveActivity: liveRoomInfo<br>(包含 roomUuid)
LiveActivity ->> NERoomService: joinRoom(roomUuid)
NERoomService ->> LiveActivity: onSuccess(包含 pushUrl)
LiveActivity ->> NERoomChatController: joinChatroom
NERoomChatController -->> LiveActivity: onSuccess
LiveActivity ->> NERoomRtcController: setParameters(KEY_AUTO_SUBSCRIBE_VIDEO = true)
LiveActivity ->> NERoomRtcController: joinChannel
NERoomRtcController -->> LiveActivity: onSuccess
rect rgb(191, 223, 255)
note right of LiveActivity: 开始推流任务
LiveActivity ->> NERoomRtcController: addLiveStreamTask(pushUrl)
NERoomRtcController -->> LiveActivity: onSuccess
end
LiveActivity ->> LiveActivity: updateUI
设置视频自动订阅:
JavartcController.setParameters("key_auto_subscribe_video", true)
五:观众观看直播间
以下流程图介绍了如何实现观众观看直播间:
sequenceDiagram
autonumber
participant AudienceActivity as 观众
participant AppServer as 业务服务器
participant NERoomService
participant NERoomChatController
participant NELivePlayer
note right of AudienceActivity: 观众获取直播间列表
AudienceActivity ->> AppServer: fetchLiveRoomList(获取直播列表)
AppServer -->> AudienceActivity: liveRoomInfoList(包含包含 roomUuid 等信息)
note right of AudienceActivity: 观众进入直播间
AudienceActivity ->> NELivePlayer: init
AudienceActivity ->> AppServer: getLiveRoom
AppServer -->> AudienceActivity: liveRoomInfo(包含 roomUuid)
AudienceActivity ->> NERoomService: joinRoom(roomUuid)
NERoomService ->> AudienceActivity: onSuccess(包含 pullRtmpUrl)
AudienceActivity ->> NERoomChatController: joinChatroom
NERoomChatController -->> AudienceActivity: onSuccess
rect rgb(191, 223, 255)
note right of AudienceActivity: 开始拉流播放
AudienceActivity ->> NELivePlayer: start(pullRtmpUrl)
NELivePlayer -->> AudienceActivity: onSuccess
end
AudienceActivity ->> AudienceActivity: updateUI
六:观众连线
观众和主播连线
以下流程图介绍了如何实现观众和主播连线:
sequenceDiagram
autonumber
participant AudienceActivity as 观众
participant NERoomKit as NERoomKit_client
participant NERoomRtcController
participant NERoomVideoView
participant NELivePlayer
note right of AudienceActivity: 观众开始连麦
AudienceActivity ->> AudienceActivity: requestPermission(audio、video)
AudienceActivity ->> NERoomKit: submitSeatRequest
NERoomKit ->> AudienceActivity: onSeatRequestApproved
rect rgb(191, 223, 255)
note right of AudienceActivity: 加入 RTC
AudienceActivity ->> NERoomRtcController: joinRtcChannel
NERoomRtcController -->> AudienceActivity: onSuccess
NERoomKit ->> AudienceActivity: onMemberJoinRtcChannel
AudienceActivity ->> NERoomRtcController: subscribeRemoteVideoStream(userUuid)
AudienceActivity ->> NERoomRtcController: unmuteMyAudio
AudienceActivity ->> NERoomRtcController: unmuteMyVideo
end
rect rgb(191, 223, 255)
note right of AudienceActivity: 从 CDN 流播放器<br>更改为 RTC 播放器
NERoomKit ->> AudienceActivity: onMemberJoinRtcChannel
AudienceActivity ->> NERoomVideoView: show
AudienceActivity ->> NERoomRtcController: setupLocalVideoCanvas(NERtcVideoView)
AudienceActivity ->> NERoomRtcController: setupRemoteVideoCanvas(新加入的 userUuid 画布)
AudienceActivity ->> NELivePlayer: stop
end
主播和观众连线
以下流程图介绍了如何实现主播和观众连线:
sequenceDiagram
autonumber
participant LiveActivity as 主播
participant NERoomKit as NERoomKit_client
participant NERoomRtcController
participant NERoomLiveController
participant NERoomVideoView
NERoomKit ->> LiveActivity: onSeatRequestApproved
rect rgb(191, 223, 255)
note right of LiveActivity: 显示连麦观众
NERoomKit ->> LiveActivity: onMemberJoinRtcChannel
LiveActivity ->> NERoomVideoView: show
LiveActivity ->> NERoomRtcController: setupRemoteVideoCanvas(新加入的 userUuid 画布)
end
rect rgb(191, 223, 255)
note right of LiveActivity: 更新推流任务,将<br>单人布局,更新<br>为两人布局
LiveActivity ->> NERoomLiveController: updateLiveStreamTask
NERoomLiveController -->> LiveActivity: onSuccess
end
主播结束连线
以下流程图介绍了如何实现主播结束连线:
sequenceDiagram
autonumber
participant LiveActivity as 主播
participant NERoomKit as NERoomKit_client
participant NERoomRtcController
participant NERoomLiveController
participant NERoomVideoView
LiveActivity ->> NERoomKit: kickSeat
NERoomKit -->> LiveActivity: onSuccess
rect rgb(191, 223, 255)
note right of LiveActivity: 不显示连麦观众
NERoomKit ->> LiveActivity: onMemberLeaveRtcChannel
LiveActivity ->> NERoomVideoView: dismiss
LiveActivity ->> NERoomRtcController: setupRemoteVideoCanvas(null)
LiveActivity ->> NERoomRtcController: unsubscribeRemoteVideoStream(新加入的 userUuid)
end
rect rgb(191, 223, 255)
note right of LiveActivity: 更新推流任务,将<br>多人布局,更新<br>为单人布局
LiveActivity ->> NERoomLiveController: updateLiveStreamTask
NERoomLiveController -->> LiveActivity: onSuccess
end
观众结束连线
以下流程图介绍了如何实现观众结束连线:
sequenceDiagram
autonumber
participant AudienceActivity as 观众
participant NERoomKit as NERoomKit_client
participant NERoomRtcController
participant NERoomVideoView
participant NELivePlayer
AudienceActivity ->> NERoomKit: leaveSeat
NERoomKit ->> AudienceActivity: onSuccess
rect rgb(191, 223, 255)
note right of AudienceActivity: 从 RTC 流播放器<br>更改为 CDN 播放器
AudienceActivity ->> NERoomVideoView: dismiss
AudienceActivity ->> NERoomRtcController: setupRemoteVideoCanvas(null)
AudienceActivity ->> NELivePlayer: play rtmpUrl
end
rect rgb(191, 223, 255)
note right of AudienceActivity: 离开 RTC
AudienceActivity ->> NERoomRtcController: leaveRtcChannel
NERoomRtcController -->> AudienceActivity: onSuccess
end
七:主播连麦
主播和主播连麦
以下流程图介绍了如何切到连麦公共房间:
sequenceDiagram
autonumber
LiveActivity ->> AppServer: submitLinkHostRequest
AppServer ->> NERoomKit_Server: createRoom<br>(PK 房间)
NERoomKit_Server -->> AppServer: onSuccess
AppServer ->> LiveActivity: onLinkHostRequestApproved
LiveActivity ->> NERoomLiveController: removeLiveStreamTask
LiveActivity ->> NERoomKit: leaveRTC
LiveActivity ->> NERoomKit: joinRoom(PK 房间)
NERoomKit ->> LiveActivity: roomContext_pk
LiveActivity ->> NERoomKit: roomContext_pk.joinRtcChannel
NERoomKit ->> LiveActivity: roomContext_pk.onMemberJoinRtcChannel
LiveActivity ->> NERoomLiveController: roomContext_pk.addLiveStreamTask
NERoomLiveController -->> LiveActivity: onSuccess
LiveActivity ->> NERoomVideoView: show
LiveActivity ->> NERoomRtcController: roomContext_pk.setupRemoteVideoCanvas(新加入的 userUuid 画布)
LiveActivity2 ->> NERoomLiveController: removeLiveStreamTask
LiveActivity2 ->> NERoomKit: leaveRTC
LiveActivity2 ->> NERoomKit: joinRoom(PK 房间)
NERoomKit ->> LiveActivity2: roomContext_pk
LiveActivity2 ->> NERoomKit: roomContext_pk.joinRtcChannel
NERoomKit ->> LiveActivity2: roomContext_pk.onMemberJoinRtcChannel
LiveActivity2 ->> NERoomLiveController: roomContext_pk.addLiveStreamTask
NERoomLiveController -->> LiveActivity2: onSuccess
LiveActivity2 ->> NERoomVideoView: show
LiveActivity2 ->> NERoomRtcController: roomContext_pk.setupRemoteVideoCanvas<br>(新加入的 userUuid 画布)
主播和主播结束连麦
以下流程图介绍了主播和主播如何结束连麦:
sequenceDiagram
autonumber
LiveActivity ->> NERoomLiveController: roomContext_pk.removeLiveStreamTask
LiveActivity ->> NERoomKit: roomContext_pk.leaveRTC
LiveActivity ->> NERoomKit: roomContext_pk.leaveRoom(PK 房间)
LiveActivity ->> NERoomKit: roomContext.joinRtcChannel
LiveActivity ->> NERoomLiveController: addLiveStreamTask
LiveActivity2 ->> NERoomLiveController: roomContext_pk.removeLiveStreamTask
LiveActivity2 ->> NERoomKit: roomContext_pk.leaveRTC
LiveActivity2 ->> NERoomKit: roomContext_pk.leaveRoom(PK 房间)
LiveActivity2 ->> NERoomKit: roomContext.joinRtcChannel
LiveActivity2 ->> NERoomLiveController: addLiveStreamTask
常见问题
如何实现静音直播间
调节本地播放的所有远端用户的信号音量。通过 adjustPlaybackSignalVolume 可以实现调节所有远端用户在本地播放的混音音量。
JavaNERtcEx.getInstance().adjustPlaybackSignalVolume(intvolume)
如何实现主播 PK 时关闭对方主播的声音
实现主播 PK 时关闭对方主播的声音需要两步:
-
使用
adjustUserPlaybackSignalVolume接口,将对方的音量调整为0,实现自己听不到对方的声音。Java
NERtcEx.getInstance().adjustUserPlaybackSignalVolume(uid, volume); -
调整推流任务,不再推送音频,实现主播自己的观众听不到对方主播的声音。
JavaNERtcLiveStreamLayout liveStreamLayout = new NERtcLiveStreamLayout(); NERtcLiveStreamUserTranscoding userTranscoding = new NERtcLiveStreamUserTranscoding(); userTranscoding.uid = getSelfUid(); userTranscoding.x = 0; userTranscoding.y = 320; userTranscoding.width = 360; userTranscoding.height = 640; userTranscoding.audioPush = true; userTranscoding.videoPush = true; userTranscoding.adaption = NERtcLiveStreamUserTranscoding.NERtcLiveStreamVideoScaleMode.kNERtcLsModeVideoScaleCropFill; NERtcLiveStreamUserTranscoding userTranscodingOnSeat1 = new NERtcLiveStreamUserTranscoding(); userTranscodingOnSeat1.uid = onSeatUserUids.get(0).uid; userTranscodingOnSeat1.x = 360; userTranscodingOnSeat1.y = 320; userTranscodingOnSeat1.width = 360; userTranscodingOnSeat1.height = 640; userTranscodingOnSeat1.audioPush = false; userTranscodingOnSeat1.videoPush = true; userTranscodingOnSeat1.adaption = NERtcLiveStreamUserTranscoding.NERtcLiveStreamVideoScaleMode.kNERtcLsModeVideoScaleCropFill; ArrayList<NERtcLiveStreamUserTranscoding> streamUserTranscodingArrayList = new ArrayList<>(); streamUserTranscodingArrayList.add(userTranscoding); streamUserTranscodingArrayList.add(userTranscodingOnSeat1); liveStreamLayout.width = 720; liveStreamLayout.height = 1280; liveStreamLayout.userTranscodingList = streamUserTranscodingArrayList; NERtcLiveStreamTaskInfo taskInfo = new NERtcLiveStreamTaskInfo(); taskInfo.config = liveConfig; taskInfo.taskId = taskID; taskInfo.url = pushUrl; taskInfo.layout = layout; taskInfo.liveMode = NERtcLiveStreamTaskInfo.NERtcLiveStreamMode.kNERtcLsModeVideo; NERtcEx.getInstance().updateLiveStreamTask(taskInfo, new UpdateLiveTaskCallback() {}
普通观众如何获取麦上观众的音视频状态
主播通过发送 媒体补充增强信息 SEI 给观众,观众解析 SEI 获取主播的音视频状态。
把播放器的日志放在 neroom 子目录下
使用了 PlayerKit:
JavaSDKOptions config = new SDKOptions();
config.logDir = NIMClient.getSdkStorageDirPath() + "/extra_log";
PlayerManager.init(mContext, config);




