iOS

# 通话操作

本文将介绍访客可基于Juphoon RTC SDK 提供的通话操作能力实现的功能。

# 1. 通话属性变化

通话属性变化通过实现 JRTCGuestCallback (opens new window) 中的 onCallPropertyChanged (opens new window) 接口上报。

/**
 * 通话属性改变回调
 *
 * @note
 * 重点关注屏幕共享,即当{@link PropChangeParam#screenShare screenShare} 属性为 true 时,去处理屏幕共享相关事件。<br>
 * 可根据 {@link JRTCGuest#getShareStreamId shareStreamId} 和 {@link JRTCGuest#getShareUserId shareUserId} 属性进行屏幕共享画面的渲染和停止渲染。
 * @param propChangeParam 通话改变的属性
 */
void onCallPropertyChanged(PropChangeParam propChangeParam);

示例代码:

public void onCallPropertyChanged(JRTCRoom.PropChangeParam 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) {
        //音频输出类型是否变化
    }
}

通话属性变化详见 PropChangeParam (opens new window)

其中对应通话属性的 boolean 值,有变化的为 true,没有变化为 false

# 2. 成员属性变化

成员属性变化通过实现 JRTCGuestCallback (opens new window) 中的 onMemberUpdate (opens new window) 接口上报。

/**
 * 通话中成员属性更新回调
 *
 * 常用的有 {@link JRTCRoomParticipant.ChangeParam#volume 音量值}、{@link JRTCRoomParticipant.ChangeParam#audio 音频上传状态}、{@link JRTCRoomParticipant.ChangeParam#video 视频上传状态}等。<br>
 * 例如当通话中有成员关闭视频传输,通话中所有成员都会收到此回调。
 * @param part 属性更新的成员对象
 * @param changeParam 更新的属性对象
 */
void onMemberUpdate(JRTCRoomParticipant part, ChangeParam changeParam);

示例代码:

void onMemberUpdate(JRTCRoomParticipant part, JRTCRoomParticipant.ChangeParam changeParam){
    if (changeParam.video) {
        if (part.video) {
        	// 视频流打开
        } else {
        	// 视频流关闭
        }
    }
    if (changeParam.audio) {
        if (part.audio) {
        	// 音频流打开
        } else {
        	// 音频流关闭
        }
    }
}

成员属性变化详见 ChangeParam (opens new window)

其中有对应成员属性的 boolean 值,有变化的为 true,没有变化为 false

# 3. 获取座席成员

SDK 支持邀请三方座席(座席端功能)进入通话,可以通过以下接口获取所有座席成员列表,以及获取主要座席成员

/**
 * 获取主座席成员
 *
 * @return
 * - 只有在通话中且通话中存在座席成员才能获得座席成员对象,否则为 null
 * - 座席成员发起转接成功后,在新的座席对象接听通话前这段时间内,获取的值为 null
 */
public abstract JRTCRoomParticipant getMainAgentParticipant();

/**
 * 获取座席成员列表
 *
 * @return
 * - 只有在通话中且通话中存在座席成员才能获得含有座席成员对象的数组,返回空数组
 * - 当通话中不存在第三方座席时,数组中仅包含一个主座席成员对象
 * - 当通话中存在第三方座席时,数组中包含主座席和第三方座席成员对象
 * - 当通话中仅存在一个座席时,座席成员发起转接成功后,在新的座席对象接听通话前这段时间内,返回空数组
 */
public abstract List<JRTCRoomParticipant> getAgentParticipants();

示例代码:

// 获取主座席对象
JRTCRoomParticipant mainAgent = guest.getMainAgentParticipant();

// 获取座席成员列表
List<JRTCRoomParticipant> agents = guest.getAgentParticipants();

# 4. 获取自己的成员对象

/**
 * 获取自己对象
 *
 * @return 自己对象
 */
public abstract JRTCRoomParticipant getSelfParticipant();

示例代码:

//获取自己
JRTCRoomParticipant self = guest.getSelfParticipant();

# 5. 是否是主访客

SDK 支持邀请三方访客(座席端功能)进入通话,可通过以下接口判断自己是否主访客

/**
 * 是否主访客
 *
 * @return - true 主访客
 * - false 其他三方访客
 */
public abstract boolean isMainGuest();

示例代码:

// 判断自己是否是主访客
boolean isMainGuest = guest.isMainGuest();

# 6. 获取所有通话成员

通过 getParticipants (opens new window) 获取通话中所有成员列表,JRTCRoomParticipant (opens new window) 类见 API 文档。

/**
 * 获取所有成员(包含自己、座席和其他访客)
 *
 * @return
 */
public abstract List<JRTCRoomParticipant> getParticipants();

示例代码:

// 获取通话中所有成员
List<JRTCRoomParticipant> participants = guest.getParticipants();

# 7. 通话保持/取回

通话中座席可发起保持通话的操作,保持通话之后座席和访客皆停发音视频数据,双方将互相听不到声音看不到视频画面。

座席发起通话保持之后,通话中的所有成员都将收到 onHoldStateChanged (opens new window) 通话被保持的回调。

/**
 * 收到通话保持或取回的回调
 *
 * 通话中座席可调用 {@link JRTCAgent#setHoldState setHoldState} 接口保持通话或取回通话,通话中所有成员都会收到此回调。
 * @param hold true 表示通话被保持,false 表示通话取回
 */
void onHoldStateChanged(boolean hold);

还可以通过调用 getHoldState (opens new window) 方法主动获取通话保持状态

/**
 * 获取当前通话保持状态
 *
 * 座席可调用 {@link JRTCAgent#setHoldState} 接口修改当前通话的保持状态。
 * @return 当前通话是否保持
 * - true:当前通话状态为保持
 * - false:当前通话状态为正常
 */
public abstract boolean getHoldState();

示例代码:

public void onHoldStateChanged(boolean hold) {
    if (hold) {
        // 通话保持
    } else {
        // 通话取回
    }
}

// 主动获取通话保持状态
bool hold = guest.getHoldState();
if (hold == true) {
    // 通话保持
} else {
    // 通话取回
}

# 8. 音视频切换

通话中座席与访客皆可发起音视频通话切换的操作。

视频通话状态下座席访客互相可听到对方声音看到视频画面,语音通话状态下座席访客只能听到对方声音,看不到对方视频画面。

访客可以调用 turnCallType (opens new window) 接口进行音视频通话切换。

/**
 * 音视频通话切换
 *
 * 可以通过 {@link #getCallType} 接口获取当前的通话类型 <br>
 * 通话中所有成员都将收到{@link JRTCGuestCallback#onCallTypeChanged onCallTypeChanged} 或 {@link JRTCAgentCallback#onCallTypeChanged onCallTypeChanged} 回调
 * @param callType 通话类型
 * @return 当前通话类型
 * - {@link JRTCCallCenter#CALL_TYPE_AUDIO CALL_TYPE_AUDIO}:语音通话
 * - {@link JRTCCallCenter#CALL_TYPE_VIDEO CALL_TYPE_VIDEO}:视频通话
 */
public abstract void turnCallType(@CallType int callType);

访客可以调用 getCallType (opens new window) 接口获取当前通话类型。

/**
  * 获取当前通话类型
  *
  * 可通过 {@link #turnCallType} 接口修改当前通话类型。
  * @return 当前通话类型
  * - {@link JRTCCallCenter#CALL_TYPE_AUDIO CALL_TYPE_AUDIO}:语音通话
  * - {@link JRTCCallCenter#CALL_TYPE_VIDEO CALL_TYPE_VIDEO}:视频通话
  */
public abstract @JCGuestCallType int getCallType();

通话类型切换之后,参加通话的所有成员都将收到 onCallTypeChanged (opens new window) 通话类型切换的通知。

/**
 * 音视频通话切换回调
 *
 * 通话中的访客和座席可分别调用 {@link JRTCGuest#turnCallType turnCallType} 和 {@link JRTCAgent#turnCallType turnCallType} 方法切换音视频通话模式,通话中所有成员都会收到此回调。
 * @param callType 通话模式
 * - {@link JRTCGuest#CALL_TYPE_AUDIO CALL_TYPE_AUDIO} 语音通话模式
 * - {@link JRTCGuest#CALL_TYPE_VIDEO CALL_TYPE_VIDEO} 视频通话模式
 */
void onCallTypeChanged(@CallType int callType);

示例代码:

// 切换到语音通话
guest.turnCallType(JRTCGuest.CALL_TYPE_AUDIO);
// 切换到视频通话
guest.turnCallType(JRTCGuest.CALL_TYPE_VIDEO);
// 获取当前通话类型
int callType = guest.getCallType();
if (callType == JRTCGuest.CALL_TYPE_AUDIO) {
    // 当前为语音通话
} else if (callType == JRTCGuest.CALL_TYPE_VIDEO) {
    // 当前为视频通话
}
public void onCallTypeChanged(@JRTCGuestCallType int callType) {
    if (callType == JRTCGuest.CALL_TYPE_AUDIO) {
        // 切换为语音通话
    } else if (callType == JRTCGuest.CALL_TYPE_VIDEO) {
        // 切换为视频通话
    }
}

# 9. 通话转接

座席可在通话过程中将通话转给其他座席;座席可以指定座席或指定业务组,如指定业务组将会选择业务组中一个空闲座席进行转接。转接流程:

  1. 当座席发起通话转接操作成功,访客会收到 JRTCGuestCallback (opens new window)onCallForwarding (opens new window) 通知;
  2. 原座席离开通话;
  3. 当新座席加入通话后,通话继续。
/**
 * 座席通话转接回调
 *
 * 通话中座席调用 {@link JRTCAgent#transferCall transferCall} 接口将通话转接到某个座席或转接到某个业务组后,访客会收到此回调,然后访客需等待新的座席接听该通话。<br>
 * 该过程中,访客通话状态不变,新的座席接听通话后,访客可通过 {@link JRTCGuestCallback#onMemberJoin onMemberJoin} 回调得知。
 */
void onCallForwarding();

# 10.单向视频

访客收到座席发送的单向视频邀请,访客收到该邀请之后,应用层自行实现单项视频的功能,比如将对应的座席的视频画面进行遮挡。

/**
 * 收到单向视频状态变化回调
 *
 * 通话中座席调用 {@link JRTCAgent#requestOnewayVideo requestOnewayVideo} 请求单向视频,所有成员都会收到此回调。<br>
 * 收到此回调后,应用需要自行实现单向视频功能,例如用图片遮挡该座席画面,SDK不会对画面进行单向处理。
 * @param turnOn 是否单向视频
 */
void onOnewayVideoChanged(boolean turnOn);

示例代码:

void onOnewayVideoChanged(boolean turnOn) {
  if (turnOn) {
    //单向视频开启
  } else {
    //单向视频关闭
  }  
}

也可以主动通过 isOnewayVideo (opens new window) 获取当前单向视频状态

/**
 * 获取单向视频状态
 * <p>
 * 座席可调用 {@link JRTCAgent#requestOnewayVideo} 接口修改当前通话的单向视频状态。
 *
 * @return 单向视频状态
 * - true: 当前通话开启了单项视频
 * - false: 当前通话未开启单项视频
 */
public abstract boolean isOnewayVideo();