更新时间:2019-11-20
用户可以将正在进行的视频通话保持,待需要的时候再恢复通话,能减少拨号次数,使用更方便。
保持和恢复视频通话,与“保持和恢复音频通话”流程基本相同,不同在于通话被保持时,视频将会自动被关闭,恢复时,视频将会自动打开。
视频通话已建立,主被叫正在通话中。
保持通话
通话中,主被叫双方均可以发起保持通话操作。
当前服务器暂不支持视频通话保持,需要先移除视频窗口,转换为语音通话后再保持通话。
//Java code public boolean delVideo() { int result = tsdkCall.delVideo(); if (result != 0) { LogUtil.e(TAG, "delVideo return failed, result = " + result); return false; } setCallStatus(CallConstant.CallStatus.AUDIO_CALLING); return true; } |
代码示例:
//Java code public void onEvtCloseVideoInd(TsdkCall call){ if (null == call) { Log.e(TAG, "onCallDelVideo tupCall is null"); return; } Session callSession = getCallSessionByCallID(call.getCallInfo().getCallId()); if (callSession == null) { Log.e(TAG, "call session obj is null"); return; } callSession.setCallStatus(CallConstant.CallStatus.AUDIO_CALLING); //Clear video data VideoMgr.getInstance().clearCallVideo(); if (null != mCallNotification) { CallInfo callInfo = getCallInfo(call); mCallNotification.onCallEventNotify(CallConstant.CallEvent.CLOSE_VIDEO, callInfo); } if (callSession.isVideoHold()) { callSession.holdCall(); } } |
恢复通话
保持通话发起方才可进行恢复通话操作。
恢复通话可能由于网络侧极低概率的冲突或异常,导致用户恢复通话失败,此时SDK通过TsdkNotify对象中的onEvtUnholdFailed() 向UI上报取消保持通话失败事件,并自动挂断通话。
//Java code TsdkVideoWndInfo localWndInfo = new TsdkVideoWndInfo(); localWndInfo.setVideoWndType(TsdkVideoWndType.TSDK_E_VIDEO_WND_LOCAL); localWndInfo.setRender(ViERenderer.getIndexOfSurface(localVideoView)); localWndInfo.setDisplayMode(TsdkVideoWndDisplayMode.TSDK_E_VIDEO_WND_DISPLAY_FULL); TsdkVideoWndInfo remoteWndInfo = new TsdkVideoWndInfo(); remoteWndInfo.setVideoWndType(TsdkVideoWndType.TSDK_E_VIDEO_WND_REMOTE); remoteWndInfo.setRender(ViERenderer.getIndexOfSurface(remoteVideoView)); remoteWndInfo.setDisplayMode(TsdkVideoWndDisplayMode.TSDK_E_VIDEO_WND_DISPLAY_CUT); List<TsdkVideoWndInfo> list = new ArrayList<>(); list.add(localWndInfo); list.add(remoteWndInfo); TsdkManager.getInstance().getCallManager().getCallByCallId(callId).setVideoWindow(list); |
//Java code public boolean addVideo() { initVideoWindow(); int result = tsdkCall.addVideo(); if (result != 0) { LogUtil.e(TAG, "addVideo return failed, result = " + result); return false; } setCallStatus(CallConstant.CallStatus.VIDEO_CALLING); return true; } |
//Java code public void onEvtOpenVideoReq(TsdkCall call, TsdkVideoOrientation orientType){ Log.i(TAG, "onCallAddVideo"); if (null == call) { Log.e(TAG, "onCallAddVideo tupCall is null"); return; } Session callSession = getCallSessionByCallID(call.getCallInfo().getCallId()); if (callSession == null) { Log.e(TAG, "call session obj is null"); return; } CallConstant.CallStatus callStatus = callSession.getCallStatus(); boolean isSupportVideo = isSupportVideo(); if ((!isSupportVideo) || (CallConstant.CallStatus.AUDIO_CALLING != callStatus)) { callSession.rejectAddVideo(); return; } mCallNotification.onCallEventNotify(CallConstant.CallEvent.RECEIVED_REMOTE_ADD_VIDEO_REQUEST, null); } |
只有被请求方用户接受时,才需要此步骤。
若用户长时间没有响应,被请求端应用程序应该自动拒绝转视频的请求。建议时间为45s。
参数“isAccept”表示是否接受::“true”为同意,“false”为拒绝。
//Java code public boolean acceptAddVideo() { initVideoWindow(); int result = tsdkCall.replyAddVideo(true); if (result != 0) { LogUtil.e(TAG, "replyAddVideo(accept) return failed, result = " + result); return false; } return true; } |
代码示例:
//Java code public void onEvtOpenVideoInd(TsdkCall call){ int isVideo = call.getCallInfo().getIsVideoCall(); // 1:video, 0: audio int callId = call.getCallInfo().getCallId(); Log.i(TAG, "isVideo: " + isVideo + "callId: " + callId); Session callSession = getCallSessionByCallID(callId); if (callSession == null) { return; } CallInfo callInfo = getCallInfo(call);//audio --> video success Log.i(TAG, "Upgrade To Video Call"); VideoMgr.getInstance().setVideoOrient(callId, CallConstant.FRONT_CAMERA); callSession.setCallStatus(CallConstant.CallStatus.VIDEO_CALLING); mCallNotification.onCallEventNotify(CallConstant.CallEvent.OPEN_VIDEO, callInfo); } |
//Java code public void onEvtRefuseOpenVideoInd(TsdkCall call){ VideoMgr.getInstance().clearCallVideo(); Session callSession = getCallSessionByCallID(call.getCallInfo().getCallId()); callSession.setCallStatus(CallConstant.CallStatus.AUDIO_CALLING); CallInfo callInfo = getCallInfo(call); mCallNotification.onCallEventNotify(CallConstant.CallEvent.REMOTE_REFUSE_ADD_VIDEO_SREQUEST, callInfo); } |
因通话双方均可以在本端处于通话态发起保持操作,即通话可能会处于双向保持态,在任一保持方发起恢复通话时,仅能恢复本端通话状态,不会恢复对端的通话状态。视频通话双向保持中任一方先恢复通话,不会自动打开视频。