客户端实现(CDN)
更新时间: 2024/11/26 15:44:05
本文档为您展示通过 SDK 实现语音聊天室场景的相关步骤,帮助您在业务中实现麦位管理、低延时语音互动、文字聊天等 IM 和音视频通话 2.0、互动直播 2.0 在语音聊天场景下的相关能力。
前提条件
-
已在控制台创建应用,并获取了应用对应的 App Key。
-
已成功开通 IM 即时通讯产品的聊天室功能、音视频通话 2.0 产品、互动直播 2.0 产品。
聊天室功能需单独开通,若有需要,请联系您的对应销售或技术支持人员。
方案架构
主播和连麦者加入同一个RTC房间,观众通过拉流观看
操作步骤
集成 SDK
请参考下表,将相应的 SDK 或服务集成到您的项目中。
产品 | SDK 下载 | 集成文档 |
---|---|---|
IM 即时通讯 | IM SDK | 集成 SDK |
音视频通话 2.0 和互动直播 2.0 | NERTC SDK | 集成 SDK |
播放器 您也可以使用其他第三方播放器 SDK。 |
播放器 SDK | 集成 SDK |
创建聊天室
-
调用创建聊天室服务端 API 接口,创建聊天室。
-
调用初始化队列服务端 API 接口,初始化队列。
-
调用创建房间服务端 API 接口,创建并维护多人音频房间。
您也可以通过客户端接口创建多人音频房间。
初始化 SDK
-
初始化并登录 IM。
您可以参考快速开始,完成 IM SDK 初始化,并配置登录方式,登录 IM。
-
调用进入聊天室 接口加入聊天室。
- 加入聊天室之后,主播和连麦者继续执行后续操作。
- 观众可以通过聊天室信息的
broadcasturl
字段获取到拉流地址,通过播放器实现拉流收听。观众端逻辑到此即可。您可以参考开发准备,通过网易云信播放器 SDK 实现相关逻辑。
-
通过 setAudioProfile 方法设置音频参数和属性。
您可以根据对音质、声道、场景等的不同需求,选择不同的音频属性,获得最佳实时互动效果。
NERtcEx.getInstance().setParameters(mRtcParameters); //先设置参数,后初始化NERtcEx.getInstance().setAudioProfile(mAudioProfile,mAudioScenario);//初始化前设置音频场景
-
初始化互动直播 2.0 SDK。
您可以参考快速入门接口初始化互动直播 2.0 SDK。
NERtcEx.getInstance().init(getApplicationContext(),Config.APP_KEY,this,null);
-
在指定的通话 Activity 中实现监听。
public class MeetingActivity extends AppCompatActivity implements NERtcCallbackEx....
-
调用setChannelProfile设置直播模式。
建议在加入房间前,设置房间模式为直播模式。当前默认为通信模式。
// 0 - COMMUNICATION, 1 -LIVE_BROADCASTING NERtcEx.getInstance().setChannelProfile(1);
-
调用setParameters设置推流开关。
打开这个开关,加入房间的人就有参与互动直播推流的能力。但是需要主播或者管理员更新推流任务才能实现推流。
mRtcParameters.set(NERtcParameters.KEY_PUBLISH_SELF_STREAM, true); NERtcEx.getInstance().setParameters(mRtcParameters);
房间内操作
-
调用 joinChannel 接口加入房间。
public abstract int joinChannel(java.lang.String token, java.lang.String channelName, long uid);
注意:
- 如果您已调用服务端 API 创建了房间,客户端可以直接加入房间,若没有已存在的房间,SDK会自动创建。
- uid 是您自行生成的一个 long 类型的数据,作为用户唯一标识,这个 uid 需要在音频房间内唯一。后续的房间内用户相关的回调均会绑定这个 uid,但是它与聊天室的 accid 是两套体系。您需要在业务层维护业务绑定关系。
-
通过 onNERTCEngineLiveStreamState 配置推流状态监听。
public void onLiveStreamState(String taskId, String pushUrl, int liveState);
-
调用接口addLiveStreamTask新增推流任务。
- 语音聊天室场景中,liveMode 参数应设置为 audio。
- 您也可以通过服务端 API 创建推流任务新增推流任务。
-
维护推流任务。
- 语音聊天室场景中,一个房间内只需要一个推流任务,由主播端或服务器来维护。
- 观众调用 setClientRole 方法上麦后,即连麦者加入房间后,在收到连麦者的
onNERtcEngineUserDidJoinWithUserID
之后,或者连麦者自己收到NERtcJoinChannelCompletion
之后,主播客户端或者服务器 API 需要更新推流任务。- 服务端方式:主动上报APP业务服务器,调用更新推流任务实现。服务端维护推流任务,不受客户端异常情况的限制,如客户端异常退出,不影响房间的推流任务逻辑。
- 客户端方式:直接使用 SDK 接口 updateLiveStreamTask 完成推流任务的更新,逻辑简单。
- 当收到成员的
onUserJoined
之后,或者自己onLeaveChannel
等,也做相应的更新推流任务的处理,将自己从推流任务的用户列表中移除。
-
在语音聊天室中开始多人语音。
-
加入房间后默认发送音频流,无需手动开启。
NERtc.getInstance().enableLocalAudio(Bool);
-
音频设备管理。
// 判断当前音频路由器。 boolean isSpeakerphoneOn = NERtcEx.getInstance().isSpeakerphoneOn(); // 设置音频路由。 NERtcEx.getInstance().setSpeakerphoneOn(isSpeakerphoneOn);
-
-
连麦者上麦。
- 连麦者调用setClientRole方法将角色从观众切换到主播,通过发送点对点自定义系统通知,主播端同意、或者代码直接同意实现鉴权,即可将连麦者添加到队列元素中。若主播拒绝连麦申请,将这个结果通过自定义系统通知发送回连麦申请方。
- 申请连麦的人收到同意的自定义系统通知之后,需要先销毁音视频实例,并参考上文初始化 SDK 环节中的步骤 3~步骤 7,最后重新加入房间即可。
- 当聊天室队列发生更新时,会向聊天室内所有成员下发一条聊天室通知消息,客户端监听后做相应的UI处理。
-
通过 NERtcCallback 监听其他回调。
退出房间
-
下麦。
根据上麦的方式,对应的取出聊天室队列中自己的元素。这个操作也会触发队列变更通知。
-
调用接口 leaveChannel 离开房间。
NERtcEx.getInstance().leaveChannel();
-
调用接口 release 销毁音视频实例。
NERtcEx.getInstance().release();
进阶功能
混音及音效
加入房间后,调用 startAudioMixing 方法,可以播放音乐文件,实现播放背景音乐的功能,也可以播放音效文件,实现鼓掌、欢呼、尖叫等氛围音效果。离开房间前调用 stopAudioMixing 方法,结束播放。
耳返
调用 enableEarback 方法开启主播的耳返功能。
通话质量监测
使用 NERtcStatsObserver 回调,将关键的音视频状况、网络状况、设备状态的相关指标实时回调给APP应用层,监测通话的整体体验。