客户端实现(基于 NERoom)

更新时间: 2025/06/03 16:12:03

本文为您展示通过网易云信 房间组件(NERoom) 实现直播房场景的相关方案,帮助您在业务中实现语音互动等能力。

方案说明

网易云信直播房场景实现方案分为基于 NERoom 和 RTC 两种方案。NERoom 和 RTC 之间的关系可参考《语聊房》集成方案选型指引。相较于 基于 RTC 的实现方案,基于 NERoom 实现直播房场景适用于开发排期紧、需快速上线、且有一定的定制化需求的用户。

方案架构

直播房场景实现方案架构说明如下:

  • 主播、连麦者和观众加入同一个 NERoom 房间。
  • 主播和连麦者在音视频房间内进行音频流的实时发布和订阅。
  • 普通观众在音视频房间内仅使用播放器播放拉流内容。

准备工作

根据本文操作前,请确保您已经完成了以下设置:

接口参考

直播房场景实现方案涉及的接口或功能如下所示:

一:初始化

以下流程图介绍了如何实现初始化:

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 时关闭对方主播的声音需要两步:

  1. 使用 adjustUserPlaybackSignalVolume 接口,将对方的音量调整为 0,实现自己听不到对方的声音。

    JavaNERtcEx.getInstance().adjustUserPlaybackSignalVolume(uid, volume);
    
  2. 调整推流任务,不再推送音频,实现主播自己的观众听不到对方主播的声音。

    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);

其他事项

此文档是否对你有帮助?
有帮助
去反馈
  • 方案说明
  • 方案架构
  • 准备工作
  • 接口参考
  • 一:初始化
  • 二:登录
  • 三:主播预览
  • 四:主播开播
  • 五:观众观看直播间
  • 六:观众连线
  • 观众和主播连线
  • 主播和观众连线
  • 主播结束连线
  • 观众结束连线
  • 七:主播连麦
  • 主播和主播连麦
  • 主播和主播结束连麦
  • 常见问题
  • 如何实现静音直播间
  • 如何实现主播 PK 时关闭对方主播的声音
  • 普通观众如何获取麦上观众的音视频状态
  • 把播放器的日志放在 neroom 子目录下
  • 其他事项