跳到主要内容

通话监听

融云 RongCallLib 库提供了 RCCallReceiveDelegateRCCallSessionDelegate 两个代理,用于处理呼叫相关的业务逻辑上报。

来电监听

RCCallClient 中定义了 RCCallReceiveDelegate 协议,负责上报来电或者接收到远程通知的回调。

/*!
CallLib全局通话呼入的监听器
*/
@protocol RCCallReceiveDelegate <NSObject>

/*!
接收到通话呼入的回调

@param callSession 呼入的通话实体
*/
- (void)didReceiveCall:(RCCallSession *)callSession;

/*!
接收到通话呼入的远程通知的回调

@param callId 呼入通话的唯一值
@param inviterUserId 通话邀请者的UserId
@param mediaType 通话的媒体类型
@param userIdList 被邀请者的UserId列表
@param userDict 远程推送包含的其他扩展信息
*/
- (void)didReceiveCallRemoteNotification:(NSString *)callId
inviterUserId:(NSString *)inviterUserId
mediaType:(RCCallMediaType)mediaType
userIdList:(NSArray *)userIdList
userDict:(NSDictionary *)userDict;

/*!
接收到通话呼入的远程通知的回调

@param callId 呼入通话的唯一值
@param inviterUserId 通话邀请者的UserId
@param mediaType 通话的媒体类型
@param userIdList 被邀请者的UserId列表
@param userDict 远程推送包含的其他扩展信息
@param isVoIPPush 是否 VoIP 推送
*/
- (void)didReceiveCallRemoteNotification:(NSString *)callId
inviterUserId:(NSString *)inviterUserId
mediaType:(RCCallMediaType)mediaType
userIdList:(NSArray *)userIdList
userDict:(NSDictionary *)userDict
isVoIPPush:(BOOL)isVoIPPush;

/*!
接收到取消通话的远程通知的回调

@param callId 呼入通话的唯一值
@param inviterUserId 通话邀请者的UserId
@param mediaType 通话的媒体类型
@param userIdList 被邀请者的UserId列表
*/
- (void)didCancelCallRemoteNotification:(NSString *)callId
inviterUserId:(NSString *)inviterUserId
mediaType:(RCCallMediaType)mediaType
userIdList:(NSArray *)userIdList;

@end

通话状态监听

RCCallSession 中定义了 RCCallSessionDelegate,支持监听通话状态的变化。

获取 RCCallSession 对象后,可以通过如下方法添加代理。

/**
添加通话状态的监听器

@param delegate 通话状态变化的监听器
*/
- (void)addDelegate:(id<RCCallSessionDelegate>)delegate;

/**
删除通话状态的监听器

@param delegate 通话状态的监听器
*/
- (void)removeDelegate:(id<RCCallSessionDelegate>)delegate;

具体支持监听的事件请参见下方介绍的回调方法。

通话建立、结束相关的回调

当通话状态发生变化的时候,如接通、结束、对方振铃、有人加入通话、有人挂断、发生警告等都会进行回调,代理方法的具体定义如下:

  • 电话已拨出,返回当前通话的详细信息。
  • 已建立通话,返回当前通话的详细信息。
  • 通话结束。己方挂断。
  • 通话结束。对方挂断,或者通话过程网络异常造成的通话中断。建议实现 callDidDisconnectWithReason,该回调可返回结束原因(RCCallDisconnectReason)。
  • 通话中的远端参与者离开,返回离开者的信息和离开原因(RCCallDisconnectReason)。在多人通话与 1v1 通话中,对端挂断均会先回调 remoteUserDidLeft,再触发其他回调。
  • 被叫端正在振铃,返回振铃用户的用户 ID。
  • 通话中的某一个参与者,邀请好友加入通话。返回被邀请者的信息与媒体类型。
  • 被叫端加入通话,返回加入者的用户信息和媒体类型。
  • 当通话中的某一个参与者切换通话类型,例如由视频切换至音频。返回切换操作者的信息、切换后的媒体类型等。
  • 通话过程中,发生异常。返回错误码(RCCallErrorCode)。
/*!
通话已接通
*/
- (void)callDidConnect;

/*!
通话已结束
*/
- (void)callDidDisconnect;

/*!
通话已结束

@param reason 挂断原因
@discussion 通话已结束

@warning 这个接口和 callDidDisconnect 回调方法相同,增加返回挂断原因。
同时实现本回调,通话已结束将不会再通过 callDidDisconnect 处理。

@remarks 代理
*/
- (void)callDidDisconnectWithReason:(RCCallDisconnectReason)reason;

/*!
对端用户离开

@param userId 用户ID
@param reason 挂断的原因
*/
- (void)remoteUserDidLeft:(NSString *)userId reason:(RCCallDisconnectReason)reason;

/*!
对端用户正在振铃

@param userId 用户ID
*/
- (void)remoteUserDidRing:(NSString *)userId;

/*!
有用户被邀请加入通话

@param userId 被邀请的用户ID
@param mediaType 希望被邀请者使用的媒体类型
*/
- (void)remoteUserDidInvite:(NSString *)userId mediaType:(RCCallMediaType)mediaType;

/*!
对端用户加入了通话

@param userId 用户ID
@param mediaType 用户的媒体类型
*/
- (void)remoteUserDidJoin:(NSString *)userId mediaType:(RCCallMediaType)mediaType;

/*!
对端用户切换了媒体类型

@param userId 用户ID
@param mediaType 切换至的媒体类型
*/
- (void)remoteUserDidChangeMediaType:(NSString *)userId mediaType:(RCCallMediaType)mediaType;

/*!
通话过程中的错误回调

@param error 错误码
@warning 这个接口回调的错误码主要是为了提供必要的log以及提示用户,如果是不可恢复的错误,SDK会挂断电话并回调callDidDisconnect,App可以在callDidDisconnect中统一处理通话结束的逻辑。
*/
- (void)errorDidOccur:(RCCallErrorCode)error;

设备相关回调

  • 远端参与者摄像头状态发生变化时,回调 remoteUserDidDisableCamera 通知状态变化。
  • 远端参与者麦克风状态发生变化时,回调 remoteUserDidDisableMicrophone 通知状态变化。
/*!
对端用户开启或关闭了麦克风的状态

@param disabled 是否关闭麦克风
@param userId 用户ID
*/
- (void)remoteUserDidDisableMicrophone:(BOOL)disabled byUser:(NSString *)userId;

/*!
对端用户开启或关闭了摄像头的状态

@param disabled 是否关闭摄像头
@param userId 用户ID
*/
- (void)remoteUserDidDisableCamera:(BOOL)disabled byUser:(NSString *)userId;

网络质量相关回调

  • 当前通话网络状态上下行数据质量的回调,返回 RCCallQuality。该回调方法每秒触发一次。
  • 远端当前通话网络状态上下行数据质量的回调,返回 RCCallQuality。该回调方法每秒触发一次。
  • 收到某个用户的第一帧视频数据,返回用户信息。
/*!
当前通话网络状态的回调,该回调方法每秒触发一次

@param txQuality 上行网络质量
@param rxQuality 下行网络质量, 接收到的所有远端用户网络质量的平均值
*/
- (void)networkTxQuality:(RCCallQuality)txQuality rxQuality:(RCCallQuality)rxQuality;

/*!
当前通话网络状态的回调,该回调方法每秒触发一次

@param txQuality 上行网络质量
@param rxQuality 下行网络质量, 接收到的某个远端用户的网络质量
@param userID 远端用户
*/
- (void)networkTxQuality:(RCCallQuality)txQuality rxQuality:(RCCallQuality)rxQuality remoteUserID:(NSString *)userID;

/*!
当前通话视频通话时, 收到远端用户的第一个视频帧的回调.
@param userId 远端用户ID
*/
- (void)receiveRemoteUserVideoFirstKeyFrame:(NSString *)userId;

音量相关回调

本端用户的发送音量与对端音量均在同一个回调中反馈。该回调方法每两秒触发一次。

/*!
当前通话某用户声音音量回调,该回调方法每两秒触发一次

@param leavel 声音级别: 0~9, 0为无声, 依次变大
@param userID 用户ID, 本端用户ID(发送音量) 或 远端用户ID(接收音量)
*/
- (void)audioLevel:(NSInteger)leavel userID:(NSString *)userID;

资源相关回调

  • 远端用户发布了自定义视频流,返回视频流相关信息。
  • 远端用户取消发布自定义视频流,返回取消发布的视频流的相关信息。
/*!
对端用户发布自定义媒体流

@param streamId 自定义流ID
@param tag 自定义流标签
@param mediaType 媒体类型
*/
- (void)remoteUserDidPublishCustomMediaStream:(NSString *)streamId streamTag:(NSString *)tag mediaType:(RCCallMediaType)mediaType;

/*!
对端用户取消发布自定义媒体流

@param streamId 自定义流ID
*/
- (void)remoteUserDidCancelPublishCustomMediaStream:(NSString *)streamId;

铃声相关回调

  • 播放彩铃
  • 来电铃声
  • 停止播放铃声(通话接通或挂断)
/*!
彩铃
*/
- (void)shouldAlertForWaitingRemoteResponse;

/*!
来电铃声
*/
- (void)shouldRingForIncomingCall;

/*!
停止播放铃声(通话接通或挂断)
*/
- (void)shouldStopAlertAndRing;

数据处理相关回调

当前通话本地视频数据,用于 GPU 滤镜处理。

/*!
上报本地视频帧数据。

@param pixelBuffer 需要上报的本地视频帧。
@discussion
该接口为当前视频通话发送本地视频帧数据的回调。您的修改会同步到发送的视频帧数据。

@remarks 代理
*/
- (void)processVideoFrame:(nullable CVPixelBufferRef)pixelBuffer;