通话监听
融云 RongCallLib
库提供了 RCCallReceiveDelegate 和 RCCallSessionDelegate 两个协议,用于处理呼叫相关的业务逻辑上报。
来电监听
RCCallClient 中定义了 RCCallReceiveDelegate 协议,负责上报来电或者接收到远程通知的回调。
接口原型
Objective C
/*!
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
代码示例
Objective C
#import <RongCallLib/RongCallLib.h>
@interface CallManager : NSObject <RCCallReceiveDelegate>
@end
@implementation CallManager
// 设置来电监听
- (void)setupCallReceiveDelegate {
[[RCCallClient sharedRCCallClient] setDelegate:self];
}
// 接收到通话呼入
- (void)didReceiveCall:(RCCallSession *)callSession {
NSLog(@"收到来电,呼叫方:%@", callSession.callerUserId);
// 处理来电逻辑,如显示来电界面
}
// 接收到 voip 远程推送通知,或者应用在后台需要本地弹窗
- (void)didReceiveCallRemoteNotification:(NSString *)callId
inviterUserId:(NSString *)inviterUserId
mediaType:(RCCallMediaType)mediaType
userIdList:(NSArray *)userIdList
userDict:(NSDictionary *)userDict {
NSLog(@"需要本地推送通知,呼叫 ID:%@", callId);
// 处理本地推送通知
}
@end
通话状态监听
RCCallSession 中定义了 RCCallSessionDelegate 协议,支持监听通话状态的变化。
添加和移除监听器
获取 RCCallSession 对象后,可以通过以下方法添加或移除代理。
接口原型
Objective C
/**
添加通话状态的监听器
@param delegate 通话状态变化的监听器
*/
- (void)addDelegate:(id<RCCallSessionDelegate>)delegate;
/**
删除通话状态的监听器
@param delegate 通话状态的监听器
*/
- (void)removeDelegate:(id<RCCallSessionDelegate>)delegate;
代码示例
Objective C
// 添加监听器
[callSession addDelegate:self];
// 移除监听器
[callSession removeDelegate:self];
通话状态回调
通话建立、结束相关回调
当通话状态发生变化时,如接通、结束、对方振铃、有人加入通话、有人挂断等都会进行回调。支持的回调事件包括:
- 电话已拨出,返回当前通话的详细信息
- 已建立通话,返回当前通话的详细信息
- 通话结束。己方挂断
- 通话结束。对方挂断,或者通话过程网络异常造成的通话中断。建议实现
callDidDisconnectWithReason
,该回调可返回结束原因(RCCallDisconnectReason) - 通话中的远端参与者离开,返回离开者的信息和离开原因(RCCallDisconnectReason)。在多人通话与 1v1 通话中,对端挂断均会先回调
remoteUserDidLeft
,再触发其他回调 - 被叫端正在振铃,返回振铃用户的用户 ID
- 通话中的某一个参与者,邀请好友加入通话。返回被邀请者的信息与媒体类型
- 被叫端加入通话,返回加入者的用户信息和媒体类型
- 当通话中的某一个参与者切换通话类型,例如由视频切换至音频。返回切换操作者的信息、切换后的媒体类型等
- 通话过程中,发生异常。返回错误码(RCCallErrorCode)
接口原型
Objective C
/*!
通话已接通
*/
- (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;
代码示例
Objective C
#pragma mark - RCCallSessionDelegate
// 通话已接通
- (void)callDidConnect {
NSLog(@"通话已接通");
// 隐藏呼叫等待界面,显示通话界面
}
// 通话已结束(推荐使用带原因的回调)
- (void)callDidDisconnectWithReason:(RCCallDisconnectReason)reason {
NSLog(@"通话已结束,原因:%ld", (long)reason);
// 关闭通话界面,清理资源
}
// 对端用户加入通话
- (void)remoteUserDidJoin:(NSString *)userId mediaType:(RCCallMediaType)mediaType {
NSLog(@"用户 %@ 加入通话,媒体类型:%ld", userId, (long)mediaType);
// 更新通话界面,显示新加入的用户
}
// 通话错误处理
- (void)errorDidOccur:(RCCallErrorCode)error {
NSLog(@"通话发生错误:%ld", (long)error);
// 根据错误码处理相应逻辑
}
设备状态回调
远端参与者的设备状态变化回调:
- 远端参与者摄像头状态发生变化时,回调
remoteUserDidDisableCamera
通知状态变化 - 远端参与者麦克风状态发生变化时,回调
remoteUserDidDisableMicrophone
通知状态变化
接口原型
Objective C
/*!
对端用户开启或关闭了麦克风的状态
@param disabled 是否关闭麦克风
@param userId 用户ID
*/
- (void)remoteUserDidDisableMicrophone:(BOOL)disabled byUser:(NSString *)userId;
/*!
对端用户开启或关闭了摄像头的状态
@param disabled 是否关闭摄像头
@param userId 用户ID
*/
- (void)remoteUserDidDisableCamera:(BOOL)disabled byUser:(NSString *)userId;
代码示例
Objective C
// 麦克风状态变化
- (void)remoteUserDidDisableMicrophone:(BOOL)disabled byUser:(NSString *)userId {
if (disabled) {
NSLog(@"用户 %@ 关闭了麦克风", userId);
} else {
NSLog(@"用户 %@ 开启了麦克风", userId);
}
// 更新 UI 显示麦克风状态
}
// 摄像头状态变化
- (void)remoteUserDidDisableCamera:(BOOL)disabled byUser:(NSString *)userId {
if (disabled) {
NSLog(@"用户 %@ 关闭了摄像头", userId);
} else {
NSLog(@"用户 %@ 开启了摄像头", userId);
}
// 更新 UI 显示摄像头状态
}
网络质量回调
网络质量相关回调包括:
- 当前通话网络状态上下行数据质量的回调,返回 RCCallQuality。该回调方法每秒触发一次
- 远端当前通话网络状态上下行数据质量的回调,返回 RCCallQuality。该回调方法每秒触发一次
- 收到某个用户的第一帧视频数据,返回用户信息
接口原型
Objective C
/*!
当前通话网络状态的回调,该回调方法每秒触发一次
@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;
代码示例
Objective C
// 网络质量监控
- (void)networkTxQuality:(RCCallQuality)txQuality rxQuality:(RCCallQuality)rxQuality {
NSLog(@"上行质量:%ld,下行质量:%ld", (long)txQuality, (long)rxQuality);
// 根据网络质量调整 UI 显示或给出提示
}
// 收到首帧视频
- (void)receiveRemoteUserVideoFirstKeyFrame:(NSString *)userId {
NSLog(@"收到用户 %@ 的首帧视频", userId);
// 开始显示远端视频画面
}
音量监听回调
本端用户的发送音量与对端音量均在同一个回调中反馈。该回调方法每两秒触发一次。
接口原型
Objective C
/*!
当前通话某用户声音音量回调,该回调方法每两秒触发一次
@param level 声音级别: 0~9, 0为无声, 依次变大
@param userID 用户ID, 本端用户ID(发送音量) 或 远端用户ID(接收音量)
*/
- (void)audioLevel:(NSInteger)level userID:(NSString *)userID;
代码示例
Objective C
// 音量变化监听
- (void)audioLevel:(NSInteger)level userID:(NSString *)userID {
NSLog(@"用户 %@ 的音量等级:%ld", userID, (long)level);
// 更新 UI 显示音量指示器
// level 范围:0-9,0 为无声,数值越大音量越大
}
自定义流回调
自定义媒体流相关回调:
- 远端用户发布了自定义视频流,返回视频流相关信息
- 远端用户取消发布自定义视频流,返回取消发布的视频流的相关信息
接口原型
Objective C
/*!
对端用户发布自定义媒体流
@param streamId 自定义流ID
@param tag 自定义流标签
@param mediaType 媒体类型
*/
- (void)remoteUserDidPublishCustomMediaStream:(NSString *)streamId streamTag:(NSString *)tag mediaType:(RCCallMediaType)mediaType;
/*!
对端用户取消发布自定义媒体流
@param streamId 自定义流ID
*/
- (void)remoteUserDidCancelPublishCustomMediaStream:(NSString *)streamId;
铃声控制回调
铃声相关回调包括:
- 播放彩铃
- 来电铃声
- 停止播放铃声(通话接通或挂断)
接口原型
Objective C
/*!
彩铃
*/
- (void)shouldAlertForWaitingRemoteResponse;
/*!
来电铃声
*/
- (void)shouldRingForIncomingCall;
/*!
停止播放铃声(通话接通或挂断)
*/
- (void)shouldStopAlertAndRing;
代码示例
Objective C
// 铃声控制
- (void)shouldAlertForWaitingRemoteResponse {
// 播放等待对方接听的彩铃
}
- (void)shouldRingForIncomingCall {
// 播放来电铃声
}
- (void)shouldStopAlertAndRing {
// 停止所有铃声播放
}
视频数据处理回调
当前通话本地视频数据,用于 GPU 滤镜处理。
接口原型
Objective C
/*!
上报本地视频帧数据。
@param pixelBuffer 需要上报的本地视频帧。
@discussion
该接口为当前视频通话发送本地视频帧数据的回调。您的修改会同步到发送的视频帧数据。
@remarks 代理
*/
- (void)processVideoFrame:(nullable CVPixelBufferRef)pixelBuffer;
代码示例
Objective C
// 视频帧处理
- (void)processVideoFrame:(nullable CVPixelBufferRef)pixelBuffer {
if (pixelBuffer) {
// 对视频帧进行自定义处理,如添加滤 镜
// 注意:此处的修改会影响发送给对方的视频数据
NSLog(@"处理本地视频帧数据");
}
}
注意事项
- 建议优先使用
callDidDisconnectWithReason:
而非callDidDisconnect
,前者提供了更详细的挂断原因 - 网络质量和音量回调频率较高,在实现时注意性能优化
- 视频帧处理回调在主线程执行,处理时间不宜过长
- 及时移除不需要的监听器,避免内存泄漏