文档反馈
文档反馈

实现语音聊天室(iOS)

本文档为您展示通过 SDK 实现语音聊天室场景的相关步骤,帮助您在业务中实现麦位管理、低延时语音互动、文字聊天等 IM 和音视频通话 2.0、互动直播 2.0 在语音聊天场景下的相关能力。

前提条件

操作步骤

集成 SDK

请参考下表,将相应的 SDK 或服务集成到您的项目中。

产品 SDK 下载 集成文档
IM 即时通讯 IM SDK 集成 SDK
音视频通话 2.0 和互动直播 2.0 NERTC SDK 集成 SDK
播放器
您也可以使用其他第三方播放器 SDK。
播放器 SDK 集成 SDK

创建聊天室

  1. 调用创建聊天室服务端 API 接口,创建聊天室。
  2. 调用初始化队列服务端 API 接口,初始化队列。
  3. 调用创建房间服务端 API 接口,创建并维护多人音频房间。

    您也可以通过客户端接口创建多人音频房间。

初始化 SDK

  1. 初始化并登录 IM。

    您可以参考快速开始,完成 IM SDK 初始化,并配置登录方式,登录 IM。

  2. 调用进入聊天室 接口加入聊天室。

    • 加入聊天室之后,主播和连麦者继续执行后续操作。
    • 观众可以通过聊天室信息的 broadcasturl 字段获取到拉流地址,通过播放器实现拉流收听。观众端逻辑到此即可。您可以参考开发准备,通过网易云信播放器 SDK 实现相关逻辑。
  1. 通过 setAudioProfile 方法设置音频参数和属性。

    您可以根据对音质、声道、场景等的不同需求,选择不同的音频属性,获得最佳实时互动效果。

     // 在初始化之前设置
     [[NERtcEngine sharedEngine] setAudioProfile:profile scenario:scenario]
  2. 初始化互动直播 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];
     ...
  3. 在指定的通话界面中实现监听。

    注册 NERtcEngineDelegate,并实现监听方法。

  4. 调用 setChannelProfile 设置直播模式。

    建议在加入频道前,设置频道模式为直播模式。当前默认为通信模式。

     @protocol INERtcEngine <NSObject>/**
     设置频道场景 只能在加入频道之前调用。 NERtcEngine 会根据不同的使用场景采用不同的优化策略,通信场景偏好流畅,直播场景偏好画质。建议设置kNERtcChannelProfileLiveBroadcasting
    
     @param channelProfile 频道场景
     @return 操作返回值,被执行了则返回 0
     */
     - (int)setChannelProfile:(NERtcChannelProfileType)channelProfile;
     @end
  5. 调用 setParameters 设置推流开关。

    打开这个开关,加入房间的人就有参与互动直播推流的能力。但是需要主播或者管理员更新推流任务才能实现推流。

     @protocol INERtcEngine <NSObject>/**
     复杂参数设置接口 参数 key,请参阅 NERtcEngineBase.h 中的定义。
    
     @return 操作返回值,被执行了则返回 0
     */
     - (int)setParameters:(NSDictionary *)parameters;
    
     @end
    
     参数:extern NSString * const kNERtcKeyPublishSelfStreamEnabled; 设置为 @(1)

房间内操作

  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 是两套体系。您需要在业务层维护业务绑定关系。
  1. 通过 onNERTCEngineLiveStreamState 监听回调。

     - (void)onNERTCEngineLiveStreamState:(NERtcLiveStreamStateCode)state 
                               taskID:(NSString *)taskID 
                                  url:(NSString *)url;
  2. 调用接口 addLiveStreamTask 新增推流任务。

    • 语音聊天室场景中,liveMode 参数应设置为 audio。
    • 您也可以通过服务端 API 创建推流任务新增推流任务。
  3. 维护推流任务。

    • 语音聊天室场景中,一个房间内只需要一个推流任务,由主播端或服务器来维护。
    • 连麦者加入房间,在收到连麦者的 onNERtcEngineUserDidJoinWithUserID 之后,或者连麦者自己收到 NERtcJoinChannelCompletion 之后,主播客户端或者服务器 API 需要更新推流任务。
      • 服务端方式:主动上报APP业务服务器,调用更新推流任务实现。服务端维护推流任务,不受客户端异常情况的限制,如客户端异常退出,不影响房间的推流任务逻辑。
      • 客户端方式:直接使用 SDK 接口 updateLiveStreamTask 完成推流任务的更新,逻辑简单。
    • 当收到成员的onNERtcEngineUserDidLeaveWithUserID之后,或者自己onNERtcEngineDidLeaveChannelWithResult等,也做相应的更新推流任务的处理,将自己从推流任务的用户列表中移除。
  4. 在语音聊天室中开始多人语音。

    • 加入房间后默认发送音频流,无需手动开启。

        - (int)enableLocalAudio:(BOOL)enabled
    • 音频设备管理。

            // 判断当前音频路由器。
        bool enabled = false;
        [self.engine getLoudspeakerMode:(&enabled)];
      
        // 设置音频路由。
        bool enableSpeakerMode = true;
        int result = [self.engine setLoudspeakerMode: enableSpeakerMode];
  5. 连麦者上麦。

    1. 连麦者通过发送点对点自定义系统通知,主播端同意、或者代码直接同意实现鉴权,即可将连麦者添加到队列元素中。若主播拒绝连麦申请,将这个结果通过自定义系统通知发送回连麦申请方。
      1. 申请连麦的人收到同意的自定义系统通知之后,需要先销毁音视频实例,并参考上文初始化 SDK 环节中的步骤 3~步骤 7,最后重新加入房间即可。
      2. 当聊天室队列发生更新时,会向聊天室内所有成员下发一条聊天室通知消息,客户端监听后做相应的UI处理。
  6. 通过 NERtcEngineDelegateEx 监听其他回调。

退出房间

  1. 下麦。

    根据上麦的方式,对应的取出聊天室队列中自己的元素。这个操作也会触发队列变更通知

  2. 调用接口 leaveChannel 离开频道。

     //UI 挂断按钮事件- (IBAction)onHungupAction:(UIButton *)sender {
     [NERtcEngine.sharedEngine leaveChannel];
     [self dismiss];
     }
  3. 调用接口 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应用层,监测通话的整体体验。

×

反馈成功

非常感谢您的反馈,我们会继续努力做得更好。