iOS

# 通话操作

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

# 1. 通话属性变化

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

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

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

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

# 2. 成员属性变化

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

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

示例代码:

/**
 * 成员更新
 *
 * @param part        成员
 * @param changeParam 更新的属性
 */
void onMemberUpdate(participant, changeParam) {
    if (changeParam.video) {
        if (part.video) {
        	// 视频流打开
        } else {
        	// 视频流关闭
        }
    }
    if (changeParam.audio) {
        if (part.audio) {
        	// 音频流打开
        } else {
        	// 音频流关闭
        }
    }
}

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

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

# 3. 获取座席成员

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

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

示例代码:

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

// 获取座席成员列表
let agents = guest.getAgentParticipants();

# 4. 获取自己的对象

/**
 * 获取自己对象
 *
 * @returns 自己对象
 */
public getSelfParticipant(): JRTCRoomParticipant | undefined {}

示例代码:

//获取自己
let 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 文档。

/**
 * 获取所有成员(包含自己、座席和其他访客)
 */
public getParticipants():Array<JRTCRoomParticipant> {}

示例代码:

//获取通话中所有成员
guest.getParticipants();

# 7. 通话保持/取回

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

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

/**
 * 收到通话保持或取回的回调
 *
 * 通话中座席通过保持通话或取回通话,通话中所有成员都会收到此回调。
 * @param hold true 表示通话被保持,false 表示通话取回
 */
onHoldStateChanged(hold: boolean): void;

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

/**
 * 获取当前通话保持状态
 *
 * 座席可修改当前通话的保持状态。
 * @returns 当前通话是否保持
 * - true:当前通话状态为保持
 * - false:当前通话状态为正常
 */
public getHoldState(): boolean;

示例代码:

onHoldStateChanged: (hold) => {
  if (hold) {
    // 通话保持
  } else {
    // 通话取回
  }
}

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

# 8. 音视频切换

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

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

当座席进行音视频通话切换时,访客可以调用 getCallType (opens new window) 接口获取当前通话类型。

/**
 * 获取当前通话类型
 *
 * @returns 当前通话类型
 * - {@link CallType.AUDIO AUDIO}:语音通话
 * - {@link CallType.VIDEO VIDEO}:视频通话
 */
public getCallType(): CallType;

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

/**
 * 音视频通话切换回调
 *
 * 通话中的访客和座席切换音视频通话模式,通话中所有成员都会收到此回调。
 * @param callType 通话模式
 * - {@link CallType.AUDIO AUDIO} 语音通话模式
 * - {@link CallType.VIDEO VIDEO} 视频通话模式
 */
onCallTypeChanged(callType: CallType): void;

示例代码:

onCallTypeChanged: (callType) => {
  if (callType == CallType.AUDIO) {
    // 切换为语音通话
  } else if (callType == CallType.VIDEO) {
    // 切换为视频通话
  }
}

# 9. 单向视频

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

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

示例代码:

onOnewayVideoChanged: (turnOn) => {
  if (turnOn) {
    //单向视频开启
  } else {
    //单向视频关闭
  }  
}

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

/**
 * 获取单向视频状态
 *
 * 座席可可修改当前通话的单向视频状态。
 * @returns 单向视频状态
 * - true: 处于单向视频
 * - false: 不处于单向视频
 */
public isOnewayVideo(): boolean