通话监听
融云 RongCallLib
库提供了 RCCallReceiveDelegate 和 RCCallSessionDelegate 两个代理,用于处理呼叫相关的业务逻辑上报。
来电监听
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 滤镜处理。
/*!
当前通话本地视频数据, 用于GPU滤镜处理, 同步返回处理后的同一 sampleBuffer 对象,
需要本地视频数据时首先调用 RCCallClient.h 中 - (void)setEnableBeauty:(BOOL)enable方法设置为打开, 该方法默认为NO
若设置setEnableBeauty为Yes, 但未实现 processVideoFrame: 则使用采集的原始视频显示和发送
@param sampleBuffer 本地视频数据
*/
- (CMSampleBufferRef)processVideoFrame:(CMSampleBufferRef)sampleBuffer;