# 通话操作
本文将介绍访客可基于 Juphoon RTC SDK 提供的通话操作能力实现的功能。
# 1. 通话属性变化
通话属性变化通过 JRTCGuestCallback (opens new window) 的 onCallPropertyChanged (opens new window) 回调通知到访客。
/**
* 通话属性改变回调
* @note
* 重点关注屏幕共享,即当 {@link JRTCRoomPropChangeParam.screenShare screenShare} 属性为 true 时,去处理屏幕共享相关事件。<br>
* 可根据 {@link JRTCGuest.shareStreamId shareStreamId} 和 {@link JRTCGuest.shareUserId shareUserId} 属性进行屏幕共享画面的渲染和停止渲染。
* @param propChangeParam 通话改变的属性
*/
- (void)onCallPropertyChanged:(JRTCRoomPropChangeParam *)propChangeParam;
示例代码:
- (void)onCallPropertyChanged:(JRTCRoomPropChangeParam *)propChangeParam {
if(propChangeParam.uploadAudio) {
//上传声音状态是否变化
} else if(propChangeParam.uploadVideo) {
//上传视频状态是否变化
} else if(propChangeParam.audioOut) {
//输出声音状态是否变化
} else if(propChangeParam.cdnState) {
//CDN推流状态是否变化
} else if(propChangeParam.remoteRecordState) {
//远程录制状态是否变化
} else if(propChangeParam.screenShare) {
//屏幕共享状态是否变化
} else if(propChangeParam.audioRouteType) {
//音频输出类型是否变化
}
}
通话属性变化详见 JRTCRoomPropChangeParam (opens new window) 。
其中对应通话属性的 bool 值,有变化的为 true,没有变化为 false 。
# 2. 成员属性变化
成员属性变化通过实现 JRTCGuestCallback (opens new window) 中的 onMemberUpdate (opens new window) 接口上报。
/**
* 通话中成员属性更新回调
*
* 常用的有 {@link JRTCRoomParticipantChangeParam.volume 音量值}、{@link JRTCRoomParticipantChangeParam.audio 音频上传状态}、{@link JRTCRoomParticipantChangeParam.video 视频上传状态}等。<br>
* 例如当通话中有成员关闭视频传输,通话中所有成员都会收到此回调。
* @param participant 属性更新的成员对象
* @param changeParam 更新的属性对象
*/
- (void)onMemberUpdate:(JRTCRoomParticipant *)participant changeParam:(JRTCRoomParticipantChangeParam *)changeParam;
示例代码:
- (void)onMemberUpdate:(JRTCRoomParticipant *)participant changeParam:(JRTCRoomParticipantChangeParam *)changeParam {
if (changeParam.video) {
if (participant.video) {
// 视频流打开
} else {
// 视频流关闭
}
}
if (changeParam.audio) {
if (participant.audio) {
// 音频流打开
} else {
// 音频流关闭
}
}
}
成员属性变化详见 JRTCRoomParticipantChangeParam (opens new window) 。
其中有对应成员属性的 bool 值,有变化的为 true,没有变化为 false 。
# 3. 获取所有通话成员
通过 participants (opens new window) 属性获取通话中所有成员列表,JRTCRoomParticipant (opens new window) 类见 API 文档。
/**
* 所有成员(包含自己、座席和其他访客)
*/
@property (nonatomic, strong, readonly) NSArray<JRTCRoomParticipant *> *participants;
示例代码:
//获取通话中所有成员
NSArray<JRTCRoomParticipant *> *participants = _guest.participants;
# 4. 获取座席成员
SDK 支持邀请三方座席(座席端功能)进入通话,可以通过以下接口获取所有座席成员列表,以及获取主要座席成员。
/**
* 主座席成员
*
* 只有在通话中且通话中存在座席成员才能获得座席成员对象,否则为 nil <br>
* 座席成员发起转接成功后,在新的座席对象接听通话前这段时间内,获取的值为 nil
*/
@property (nonatomic, strong, readonly) JRTCRoomParticipant *mainAgentParticipant;
/**
* 座席成员列表
*
* 只有在通话中且通话中存在座席成员才能获得含有座席成员对象的数组,否则数组为空 <br>
* 当通话中不存在第三方座席时,数组中仅包含一个主座席成员对象 <br>
* 当通话中存在第三方座席时,数组中包含主座席和第三方座席成员对象 <br>
* 当通话中仅存在一个座席时,座席成员发起转接成功后,在新的座席对象接听通话前这段时间内,数组为空
*/
@property (nonatomic, strong, readonly) NSArray<JRTCRoomParticipant *> *agentParticipants;
示例代码:
// 获取主座席对象
JRTCRoomParticipant *mainAgent = _guest.mainAgentParticipant;
// 获取座席成员列表
NSArray<JRTCRoomParticipant *> *agents = _guest.agentParticipants;
# 5. 获取自己的成员对象
/**
* 获取自己对象
*
* @return 自己对象
*/
@property (nonatomic, strong, readonly) JRTCRoomParticipant *selfParticipant;
示例代码:
// 获取自己
JRTCRoomParticipant *self = _guest.selfParticipant;
# 6. 是否是主访客
SDK 支持邀请三方访客(座席端功能)进入通话,可通过以下接口判断自己是否主访客
/**
* 是否主访客
*
* @return
* - true 主访客
* - false 其他三方访客
*/
@property (nonatomic, assign, readonly) bool isMainGuest;
示例代码:
// 判断自己是否是主访客
bool isMainGuest = _guest.isMainGuest;
# 7. 通话保持/取回
通话中座席可发起保持通话的操作,保持通话之后座席和访客皆停发音视频数据,双方将互相听不到声音看不到视频画面。
座席发起通话保持之后,通话中的所有成员都将收到 onHoldStateChanged (opens new window) 通话被保持的回调。
/**
* 收到通话保持或取回的回调
*
* 通话中座席可调用 {@link JRTCAgent.setHoldState: setHoldState} 接口保持通话或取回通话,通话中所有成员都会收到此回调。
* @param hold true 表示通话被保持,false 表示通话取回
*/
- (void)onHoldStateChanged:(bool)hold;
还可以通过调用 getHoldState (opens new window) 方法主动获取通话保持状态。
/**
* 获取当前通话保持状态
*
* 座席可调用 {@link JRTCAgent.setHoldState: setHoldState} 接口修改当前通话的保持状态。
* @return 当前通话保持状态
* - true: 当前通话状态为保持
* - false: 当前通话状态为取回
*/
- (bool)getHoldState;
示例代码:
// 通话保持状态改变
- (void)onHoldStateChanged:(bool)hold {
if (hold == true) {
// 通话保持
} else {
// 通话取回
}
}
// 主动获取通话保持状态
bool hold = [_guest getHoldState];
if (hold == true) {
// 通话保持
} else {
// 通话取回
}
# 8. 音视频通话切换
通话中座席与访客皆可发起音视频通话切换的操作。
视频通话状态下通话中成员互相可听到其他成员声音且能看到视频画面,语音通话状态下座席访客只能听到其他成员声音,看不到其他成员视频画面。
访客可以调用 turnCallType (opens new window) 接口进行音视频通话切换。
/**
* 音视频通话切换
*
* 可以通过 getCallType 接口获取当前的通话类型
* @param callType 通话类型
* - @ref CallTypeAudio: 语音通话
* - @ref CallTypeVideo: 视频通话
*/
- (void)turnCallType:(CallType)callType;
访客可以调用 getCallType (opens new window) 接口获取当前通话类型。
/**
* 获取当前通话类型
*
* @return 当前通话类型
* - @ref CallTypeAudio : 语音通话
* - @ref CallTypeVideo : 视频通话
*/
- (CallType)getCallType;
通话类型切换之后,参加通话的所有成员都将收到 onCallTypeChanged (opens new window) 通话类型切换的通知。
/**
* 音视频通话切换回调
*
* 通话中的访客和座席可分别调用 {@link JRTCGuest.turnCallType: turnCallType} 和 {@link JRTCAgent.turnCallType: turnCallType} 方法切换音视频通话模式,通话中所有成员都会收到此回调。
* @param callType 通话模式
* - @ref CallTypeAudio 语音通话模式
* - @ref CallTypeVideo 视频通话模式
*/
- (void)onCallTypeChanged:(CallType)callType;
示例代码:
// 切换到语音通话
[_guest turnCallType:CallTypeAudio];
// 切换到视频通话
[_guest turnCallType:CallTypeVideo];
// 获取当前通话类型
CallType callType = [_guest getCallType];
if (callType == CallTypeAudio) {
// 当前为语音通话
} else if (callType == CallTypeVideo) {
// 当前为视频通话
}
// 音视频通话切换回调
- (void)onCallTypeChanged:(CallType)callType {
if (callType == CallTypeAudio) {
// 切换为语音通话
} else if (callType == CallTypeVideo) {
// 切换为视频通话
}
}
# 9. 通话转接
座席可在通话过程中将通话转给其他座席;座席可以指定座席或指定业务组,如指定业务组将会选择业务组中一个空闲座席进行转接。转接流程:
座席可以指定座席或指定业务组,如指定业务组将会选择业务组中一个空闲座席进行转接。
- 座席转接成功,访客会收到 JRTCGuestCallback (opens new window) 的 onCallForwarding (opens new window) 回调。
- 原座席离开通话。
- 当新座席加入通话后,通话继续。
/**
* 座席通话转接回调
*
* 通话中座席调用 {@link JRTCAgent.transferCall:toUserId: transferCall} 接口将通话转接到某个座席或转接到某个业务组后,访客会收到此回调,然后访客需等待新的座席接听该通话。<br>
* 该过程中,访客通话状态不变,新的座席接听通话后,访客可通过 {@link onMemberJoin: onMemberJoin} 回调得知。
*/
- (void)onCallForwarding;
# 10. 单向视频
访客收到座席发送的单向视频邀请,访客收到该邀请之后,应用层自行实现单项视频的功能,比如将对应的座席的视频画面进行遮挡。
/**
* 收到单向视频变化回调
*
* 通话中座席调用 {@link JRTCAgent.requestOnewayVideo requestOnewayVideo} 请求单向视频,所有成员都会收到此回调。<br>
* 收到此回调后,应用需要自行实现单向视频功能,例如用图片遮挡该座席画面,SDK不会对画面进行单向处理。
* @param turnOn 是否单向视频
*/
- (void)onOnewayVideoChanged:(bool)turnOn;
示例代码:
- (void)onOnewayVideoChanged:(bool)turnOn {
if (turnOn) {
//单向视频开启
} else {
//单向视频关闭
}
}
也可以主动通过 isOnewayVideo (opens new window) 获取当前单向视频状态
/**
* 获取单向视频状态
*
* 座席可调用 {@link JRTCAgent.requestOnewayVideo: requestOnewayVideo} 接口修改当前通话的单向视频状态。
* @return 单向视频状态
* - true: 当前通话开启了单向视频
* - false: 当前通话未开启单向视频
*/
- (bool)isOnewayVideo;