客户端实现(CDN)
更新时间: 2025/04/09 14:49:57
本文档为您展示通过 SDK 实现语音聊天室场景的相关步骤,帮助您在业务中实现麦位管理、低延时语音互动、文字聊天等 IM 和音视频通话 2.0、互动直播 2.0 在语音聊天场景下的相关能力。
前提条件
-
已在控制台创建应用,并获取了应用对应的 App Key。
-
已成功开通 IM 即时通讯产品的聊天室功能、音视频通话 2.0 产品、互动直播 2.0 产品。
聊天室功能需单独开通,若有需要,请联系您的对应销售或技术支持人员。
操作步骤
集成 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方法设置音频参数和属性。您可以根据对音质、声道、场景等的不同需求,选择不同的音频属性,获得最佳实时互动效果。
// 在初始化之前设置 [[NERtcEngine sharedEngine] setAudioProfile:profile scenario:scenario] -
初始化互动直播 2.0 SDK。
您可以参考快速入门接口初始化互动直播 2.0 SDK。
@interface Myapp ()<NERtcEngineDelegateEx> ...NERtcEngine *coreEngine = [NERtcEngine sharedEngine]; NERtcEngineContext *context = [[NERtcEngineContext alloc] init]; context.engineDelegate = self; context.appKey = AppKey; [coreEngine setupEngineWithContext:context]; ... -
在指定的通话界面中实现监听。
注册
NERtcEngineDelegate,并实现监听方法。 -
调用
setChannelProfile设置直播模式。建议在加入房间前,设置房间模式为直播模式。当前默认为通信模式。
@protocol INERtcEngine <NSObject>/** 设置房间场景 只能在加入房间之前调用。 NERtcEngine 会根据不同的使用场景采用不同的优化策略,通信场景偏好流畅,直播场景偏好画质。建议设置kNERtcChannelProfileLiveBroadcasting @param channelProfile 房间场景 @return 操作返回值,被执行了则返回 0 */ - (int)setChannelProfile:(NERtcChannelProfileType)channelProfile; @end -
调用
setParameters设置推流开关。打开这个开关,加入房间的人就有参与互动直播推流的能力。但是需要主播或者管理员更新推流任务才能实现推流。
@protocol INERtcEngine <NSObject>/** 复杂参数设置接口 参数 key,请参阅 NERtcEngineBase.h 中的定义。 @return 操作返回值,被执行了则返回 0 */ - (int)setParameters:(NSDictionary *)parameters; @end 参数:extern NSString * const kNERtcKeyPublishSelfStreamEnabled; 设置为 @(1)
房间内操作
-
调用
joinChannelWithToken接口加入房间。- (int)joinChannelWithToken:(NSString *)token channelName:(nullable NSString *)channelName myUid:(uint64_t)uId completion:(NERtcJoinChannelCompletion)completion; @end注意:
- 如果您已调用服务端 API 创建了房间,客户端可以直接加入房间,若没有已存在的房间,SDK会自动创建。
- uid 是您自行生成的一个 long 类型的数据,作为用户唯一标识,这个 uid 需要在音频房间内唯一。后续的房间内用户相关的回调均会绑定这个 uid,但是它与聊天室的 accid 是两套体系。您需要在业务层维护业务绑定关系。
-
通过
onNERTCEngineLiveStreamState监听回调。- (void)onNERTCEngineLiveStreamState:(NERtcLiveStreamStateCode)state taskID:(NSString *)taskID url:(NSString *)url; -
调用接口
addLiveStreamTask新增推流任务。- 语音聊天室场景中,liveMode 参数应设置为 audio。
- 您也可以通过服务端 API 创建推流任务新增推流任务。
-
维护推流任务。
- 语音聊天室场景中,一个房间内只需要一个推流任务,由主播端或服务器来维护。
- 观众调用
setClientRole方法上麦后,即连麦者加入房间后,在收到连麦者的onNERtcEngineUserDidJoinWithUserID之后,或者连麦者自己收到NERtcJoinChannelCompletion之后,主播客户端或者服务器 API 需要更新推流任务。- 服务端方式:主动上报APP业务服务器,调用更新推流任务实现。服务端维护推流任务,不受客户端异常情况的限制,如客户端异常退出,不影响房间的推流任务逻辑。
- 客户端方式:直接使用 SDK 接口
updateLiveStreamTask完成推流任务的更新,逻辑简单。
- 当收到成员的
onNERtcEngineUserDidLeaveWithUserID之后,或者自己的onNERtcEngineDidLeaveChannelWithResult等,也做相应的更新推流任务的处理,将自己从推流任务的用户列表中移除。
-
在语音聊天室中开始多人语音。
-
加入房间后默认发送音频流,无需手动开启。
- (int)enableLocalAudio:(BOOL)enabled -
音频设备管理。
// 判断当前音频路由器。 bool enabled = false; [self.engine getLoudspeakerMode:(&enabled)]; // 设置音频路由。 bool enableSpeakerMode = true; int result = [self.engine setLoudspeakerMode: enableSpeakerMode];
-
-
连麦者上麦。
- 连麦者调用
setClientRole方法将自己的角色从观众切换到主播,通过发送点对点自定义系统通知,主播端同意、或者代码直接同意实现鉴权,即可将连麦者添加到队列元素中。若主播拒绝连麦申请,将这个结果通过自定义系统通知发送回连麦申请方。 - 申请连麦的人收到同意的自定义系统通知之后,需要先销毁音视频实例,并参考上文初始化 SDK 环节中的步骤 3~步骤 7,最后重新加入房间即可。
- 当聊天室队列发生更新时,会向聊天室内所有成员下发一条聊天室通知消息,客户端监听后做相应的UI处理。
- 连麦者调用
-
通过
NERtcEngineDelegateEx监听其他回调。
退出房间
-
下麦。
根据上麦的方式,对应的取出聊天室队列中自己的元素。这个操作也会触发队列变更通知。
-
调用接口
leaveChannel离开房间。//UI 挂断按钮事件- (IBAction)onHungupAction:(UIButton *)sender { [NERtcEngine.sharedEngine leaveChannel]; [self dismiss]; } -
调用 destroyEngine 方法销毁音视频实例。
@interface NERtcEngine : NSObject <INERtcEngineEx> /** 释放当前的 NERtcEngine 实例 建议在 App 确定不再需要使用 NERtcEngine 实例时,通过该接口释放 NERtcEngine 实例的对象资源; 1. 该接口的工作方式为同步调用方式,必须在子线程中才能调用,否则会调用失败;如: dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ [NERtcEngine destroyEngine]; }); 2. 该接口不得在 SDK 的回调中调用,在接口返回前也不允许调用 SDK 的其他任何接口; 3. 接口调用返回之后,如果需要再次使用 SDK,可以重新调用 sharedEngine 来获取一个新的 NERtcEngine 实例。 */ + (int)destroyEngine;@end 示例: - (void)dealloc { [NERtcEngine destroyEngine]; //销毁实例 }
进阶功能
混音及音效
加入房间后,调用 startAudioMixingWithOption 方法,可以播放音乐文件,实现播放背景音乐的功能,也可以播放音效文件,实现鼓掌、欢呼、尖叫等氛围音效果。离开房间前调用 stopAudioMixing 方法,结束播放。
耳返
调用 enableEarback 方法开启主播的耳返功能。
通话质量监测
使用 NERtcEngineMediaStatsObserver 回调,将关键的音视频状况、网络状况、设备状态的相关指标实时回调给APP应用层,监测通话的整体体验。




